九维团队-绿队(改进)| AJ-Report_RCE

admin 2023年6月13日10:58:58评论14 views字数 3431阅读11分26秒阅读模式

前  言


AJ-Report是一个全开源的BI平台,在低于V0.9.8.6版本中存在rce漏洞,结合jwt绕过前台漏洞,后台js脚本组合成前台rce漏洞。漏洞已经提交cnvd,CNVD-2023-04125 ,请尽快升级最新版本。



js执行命令


分析


com.anjiplus.template.gaea.business.modules.datasettransform.service.impl#getValueFromJs()

*左右滑动查看更多


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


通过全局搜索eval(),发现这个getValueFromJs()中,js会从传入dto中获取js脚本内容,没有进行过滤,直接执行。


只需要找传入点即可。


通过跟踪,在com.anjiplus.template.gaea.

business.modules.dataset.service.impl实现类中有两个方法进行调用。

九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE

 

都是在数据源获取数据,一个是在获取数据,进行数据处理时触发,一个是测试时触发。


随便跟一条触发链,来到:

九维团队-绿队(改进)| AJ-Report_RCE

 

可以看到可以直接传入。


 测试



九维团队-绿队(改进)| AJ-Report_RCE


功能点,写好payload,后测试预览即可。

     

function dataTransform(){var x=java.lang.Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator")}

*左右滑动查看更多


九维团队-绿队(改进)| AJ-Report_RCE


 修复建议

            

以下是一些防止JavaScript脚本导致命令执行的修复建议:


1.避免使用eval()函数:

eval()函数可以执行传递给它的任何JavaScript代码,包括命令执行。因此,应该尽可能避免使用eval()函数。


2.使用白名单:

应该使用白名单来限制允许执行的命令和参数。只允许执行必要的命令和参数,并防止执行不受信任的命令和参数。


3.验证用户输入:

用户输入是最常见的攻击入口。应该对用户提供的所有输入进行验证和过滤,以防止攻击者通过输入恶意代码来发起攻击。应该限制用户输入的字符和长度,并过滤掉所有非法字符。



 jwt 绕过


分析


网站采用jwt加密,猜测可能存在绕过,全局搜jwt,查看加密函数。

com.anji.plus.gaea.utils#createToken()

*左右滑动查看更多


找到生成jwt的地方。

九维团队-绿队(改进)| AJ-Report_RCE


跟进去,可以看到jwt_key是固定的。

九维团队-绿队(改进)| AJ-Report_RCE

 

向上找调用

com.anjiplus.template.gaea.business.modules.accessuser.service.impl#login()

*左右滑动查看更多



九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE

可以看到jwt有效期1小时,jwt只鉴权登录名。uuid没参加校验。所以如果用户jwt没过期,可以直接通过jwt的用户名伪造登


 测试


九维团队-绿队(改进)| AJ-Report_RCE

使用低权限token:     


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE

 

修改为amdin:

九维团队-绿队(改进)| AJ-Report_RCE

     

成功登陆,因为token有时间限制,需要在管理员登的1小时内利用。


 修复建议


 JSON Web Token (JWT) 是一种常见的身份验证机制,但它也容易受到攻击。以下是一些JWT绕过修复建议:


1.不要在JWT中存储敏感信息:JWT是可以被解码的,因此不应该在JWT中存储敏感信息,如密码或信用卡信息。相反,应该将这些信息存储在服务器上,并在需要时使用安全的方式进行传输。


2.对JWT进行加密:JWT可以通过加密来增强安全性。可以使用对称密钥或公钥/私钥对进行加密。加密后的JWT可以在客户端和服务器之间安全传输,并且只有服务器才能解密它。


3.对JWT进行签名:JWT可以使用签名进行验证。签名可以确保JWT在传输期间未被篡改或修改。可以使用对称密钥或公钥/私钥对进行签名。使用签名后,服务器可以验证JWT的完整性,并防止攻击者篡改JWT。


4.验证JWT的有效期:JWT具有有效期,应该在服务器端验证JWT是否已过期。如果JWT已过期,则应该拒绝访问,并要求用户重新进行身份验证。



SSRF


分析


在com.anjiplus.template.gaea.business.modules.

dashboard.controller#importDashboard找到上传点。


九维团队-绿队(改进)| AJ-Report_RCE


继续跟进,importDashboard()的实现类: 


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


这里可以看到会把东西临时解压到路径。

九维团队-绿队(改进)| AJ-Report_RCE

 

这里打上断点,跟一下。

九维团队-绿队(改进)| AJ-Report_RCE

 

可以得到上传文件的路径。上传的文件没有任何的校验。

九维团队-绿队(改进)| AJ-Report_RCE

 

继续跟进解压函数。可以看见会做一些操作,如果不存在文件夹,就创建。

九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE

可以看到这里得到path。然而这里没有做校验,导致可以目录穿越。

九维团队-绿队(改进)| AJ-Report_RCE


得到path后,会进行解压缩处理,然后进行删除。

九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


这里上传的不是zip文件,从而到解压失败,直接抛出异常了,没有对文件进行删除操作。如果是zip文件的话会在dstpath下,去解压文件,这里要是使用../xx.zip也会导致解压失败,应该是由于在path找不到文件。


测试


九维团队-绿队(改进)| AJ-Report_RCE


这里测试一下。往ssh进行写公钥:

九维团队-绿队(改进)| AJ-Report_RCE

 

可以看到是可以写入的。那么就可以计划任务,webshell,公钥要进行get shell。


 修复建议


服务器端请求伪造(Server-Side Request Forgery,SSRF)是一种常见的网络攻击,攻击者可以利用该漏洞来访问或操作服务器上的敏感信息。以下是一些SSRF修复建议:


1.验证用户输入:用户输入是最常见的SSRF攻击入口。应该对用户提供的所有输入进行验证和过滤,以防止攻击者通过输入恶意URL来发起攻击。应该限制用户输入的协议和主机名,只允许安全的协议(如http/https)和受信任的主机名。


2.使用白名单:应该使用白名单来限制服务器可以访问的主机和端口。只允许服务器访问必要的主机和端口,并防止服务器访问不受信任的主机和端口。


3.对URL进行编码:攻击者可能会尝试使用特殊字符来绕过输入验证。因此,应该对URL进行编码,以确保所有特殊字符都得到正确处理。


文件上传


分析


com.anjiplus.template.gaea.business.modules.datasource.controller#testConnection

*左右滑动查看更多


九维团队-绿队(改进)| AJ-Report_RCE

 

来到

com.anjiplus.template.gaea.business.modules.datasource.service.impl#testConnection

*左右滑动查看更多


九维团队-绿队(改进)| AJ-Report_RCE


可以看到使用了case语句,选择http通信。

com.anjiplus.template.gaea.business.modules.datasource.service.impl#testHttp()org.springframework.web.client#exchange()org.springframework.web.client#execute()

*左右滑动查看更多

 

九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE

 

根据以上调用取得会从dto中取得url、httpMethod,在doExecute()执行。

org.springframework.web.client#doExecute()

*左右滑动查看更多

 

九维团队-绿队(改进)| AJ-Report_RCE


可以看见传进来的没有限制,直接执行请求。


测试

   

九维团队-绿队(改进)| AJ-Report_RCE




九维团队-绿队(改进)| AJ-Report_RCE


九维团队-绿队(改进)| AJ-Report_RCE



模拟探测内网端口,存在端口和不存在的端口的访问长度不一致。不存在会返回failed: Connection refused" 字符串。特征明显。


 修复建议



以下是一些针对文件上传类的修复建议:


1.对文件类型进行限制:对于文件上传功能,应该限制上传文件的类型。例如,如果只允许用户上传图像文件,则应该对上传的文件进行检查,以确保它们是图像文件。可以使用文件扩展名或MIME类型来实现此目的。


2.对文件大小进行限制:除了限制文件类型,还应该限制文件大小。上传文件的大小应该与服务器的可用空间和带宽有关。应该对上传的文件进行大小检查,并在需要时拒绝大文件。


3.对文件名进行过滤:攻击者可能会尝试通过在上传文件名中包含恶意代码来攻击服务器。因此,应该对上传的文件名进行过滤,并防止使用特殊字符或恶意代码。



往期回顾

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE


关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

九维团队-绿队(改进)| AJ-Report_RCE

原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| AJ-Report_RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月13日10:58:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-绿队(改进)| AJ-Report_RCEhttp://cn-sec.com/archives/1800018.html

发表评论

匿名网友 填写信息