前 言
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()
*左右滑动查看更多
通过全局搜索eval(),发现这个getValueFromJs()中,js会从传入dto中获取js脚本内容,没有进行过滤,直接执行。
只需要找传入点即可。
通过跟踪,在com.anjiplus.template.gaea.
business.modules.dataset.service.impl实现类中有两个方法进行调用。
都是在数据源获取数据,一个是在获取数据,进行数据处理时触发,一个是测试时触发。
随便跟一条触发链,来到:
可以看到可以直接传入。
测试
功能点,写好payload,后测试预览即可。
function dataTransform(){
var x=java.lang.Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator")
}
*左右滑动查看更多
修复建议
以下是一些防止JavaScript脚本导致命令执行的修复建议:
1.避免使用eval()函数:
eval()函数可以执行传递给它的任何JavaScript代码,包括命令执行。因此,应该尽可能避免使用eval()函数。
2.使用白名单:
应该使用白名单来限制允许执行的命令和参数。只允许执行必要的命令和参数,并防止执行不受信任的命令和参数。
3.验证用户输入:
用户输入是最常见的攻击入口。应该对用户提供的所有输入进行验证和过滤,以防止攻击者通过输入恶意代码来发起攻击。应该限制用户输入的字符和长度,并过滤掉所有非法字符。
二
jwt 绕过
分析
网站采用jwt加密,猜测可能存在绕过,全局搜jwt,查看加密函数。
com.anji.plus.gaea.utils#createToken()
*左右滑动查看更多
找到生成jwt的地方。
跟进去,可以看到jwt_key是固定的。
向上找调用
com.anjiplus.template.gaea.business.modules.accessuser.service.impl#login()
*左右滑动查看更多
可以看到jwt有效期1小时,jwt只鉴权登录名。uuid没参加校验。所以如果用户jwt没过期,可以直接通过jwt的用户名伪造登陆。
测试
使用低权限token:
|
修改为amdin:
成功登陆,因为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已过期,则应该拒绝访问,并要求用户重新进行身份验证。
三
文件上传
分析
在com.anjiplus.template.gaea.business.modules.
dashboard.controller#importDashboard找到上传点。
继续跟进,找importDashboard()的实现类:
这里可以看到会把东西临时解压到路径。
这里打上断点,跟一下。
可以得到上传文件的路径。上传的文件没有任何的校验。
继续跟进解压函数。可以看见会做一些操作,如果不存在文件夹,就创建。
可以看到这里得到path。然而这里没有做校验,导致可以目录穿越。
得到path后,会进行解压缩处理,然后进行删除。
这里上传的不是zip文件,从而到解压失败,直接抛出异常了,没有对文件进行删除操作。如果是zip文件的话会在dstpath下,去解压文件,这里要是使用../xx.zip也会导致解压失败,应该是由于在path找不到文件。
测试
这里测试一下。往ssh进行写公钥:
可以看到是可以写入的。那么就可以计划任务,webshell,公钥要进行get shell。
修复建议
服务器端请求伪造(Server-Side Request Forgery,SSRF)是一种常见的网络攻击,攻击者可以利用该漏洞来访问或操作服务器上的敏感信息。以下是一些SSRF修复建议:
1.验证用户输入:用户输入是最常见的SSRF攻击入口。应该对用户提供的所有输入进行验证和过滤,以防止攻击者通过输入恶意URL来发起攻击。应该限制用户输入的协议和主机名,只允许安全的协议(如http/https)和受信任的主机名。
2.使用白名单:应该使用白名单来限制服务器可以访问的主机和端口。只允许服务器访问必要的主机和端口,并防止服务器访问不受信任的主机和端口。
3.对URL进行编码:攻击者可能会尝试使用特殊字符来绕过输入验证。因此,应该对URL进行编码,以确保所有特殊字符都得到正确处理。
四
SSRF
分析
com.anjiplus.template.gaea.business.modules.datasource.controller#testConnection
*左右滑动查看更多
来到
com.anjiplus.template.gaea.business.modules.datasource.service.impl#testConnection
*左右滑动查看更多
可以看到使用了case语句,选择http通信。
com.anjiplus.template.gaea.business.modules.datasource.service.impl#testHttp()
org.springframework.web.client#exchange()
org.springframework.web.client#execute()
*左右滑动查看更多
根据以上调用取得会从dto中取得url、httpMethod,在doExecute()执行。
org.springframework.web.client#doExecute()
*左右滑动查看更多
可以看见传进来的没有限制,直接执行请求。
测试
|
模拟探测内网端口,存在端口和不存在的端口的访问长度不一致。不存在会返回failed: Connection refused” 字符串。特征明显。
修复建议
以下是一些针对文件上传类的修复建议:
1.对文件类型进行限制:对于文件上传功能,应该限制上传文件的类型。例如,如果只允许用户上传图像文件,则应该对上传的文件进行检查,以确保它们是图像文件。可以使用文件扩展名或MIME类型来实现此目的。
2.对文件大小进行限制:除了限制文件类型,还应该限制文件大小。上传文件的大小应该与服务器的可用空间和带宽有关。应该对上传的文件进行大小检查,并在需要时拒绝大文件。
3.对文件名进行过滤:攻击者可能会尝试通过在上传文件名中包含恶意代码来攻击服务器。因此,应该对上传的文件名进行过滤,并防止使用特殊字符或恶意代码。
往期回顾
原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| AJ-Report_RCE