D-Link service.cgi远程命令执行漏洞分析
字数 759 2025-08-26 22:11:22

D-Link service.cgi远程命令执行漏洞分析教学文档

漏洞概述

漏洞编号:CNVD-2018-01084
受影响设备

  • D-Link DIR 615
  • D-Link DIR 645
  • D-Link DIR 815

受影响固件版本:1.03及之前版本
漏洞类型:认证后远程命令执行
漏洞成因:service.cgi在处理HTTP POST请求数据时未正确过滤用户输入,导致命令拼接执行

漏洞原理分析

漏洞触发点

漏洞存在于htdocs/cgibin程序中的servicecgi_main函数,该函数处理service.cgi的请求。

关键代码流程

  1. 请求方法检查

    request_method_ptr = getenv("REQUEST_METHOD");
    iVar4 = strcasecmp(request_method_ptr, "POST");
    
  2. 参数解析

    iVar4 = cgibin_parse_request(FUN_0040d1cc, (astruct *)0x0, uVar3);
    
  3. 权限验证

    iVar4 = sess_ispoweruser();
    
  4. 参数获取

    iVar2 = get_para("EVENT");
    request_method_ptr = (char *)get_para("ACTION");
    iVar4 = get_para("SERVICE");
    
  5. 命令执行

    // EVENT参数处理
    __format = "event %s > /dev/null";
    lxmldbc_system(__format, iVar4);
    
    // ACTION和SERVICE参数处理
    __format = "service %s start > /dev/null";
    __format = "service %s stop > /dev/null";
    __format = "service %s restart > /dev/null";
    

命令注入点

lxmldbc_system函数实现:

void lxmldbc_system(char *format, char *para0, char *para1, char *para2) {
    char acStack1036[1028];
    vsnprintf(acStack1036, 0x400, format, &local_res4);
    system(acStack1036);
}

攻击者可通过控制EVENTACTIONSERVICE参数实现命令注入。

漏洞利用

利用前提

  1. 需要有效的认证cookie(可通过信息泄露漏洞获取)
  2. 发送POST请求到/service.cgi

POC示例

post_content = "EVENT=CHECKFW%26" + command + "%26"
URL + "/service.cgi"

动态调试方法

  1. 使用QEMU模拟环境:

    sudo ./cgi_run_service.sh
    
  2. 调试脚本示例:

    #!/bin/bash
    INPUT=`python -c "print 'EVENT=;ifconfig%26'"`
    LEN=$(echo $INPUT | wc -c)
    PORT="1234"
    cp $(which qemu-mipsel-static) ./qemu
    echo "$INPUT" | chroot . ./qemu -0 "/service.cgi" \
        -E CONTENT_LENGTH=$LEN \
        -E CONTENT_TYPE="application/x-www-form-urlencoded" \
        -E REQUEST_METHOD="POST" \
        -E REQUEST_URI="/service.cgi" \
        -E REMOTE_ADDR="127.0.0.1" \
        -g $PORT ./htdocs/cgibin "/service.cgi" "/service.cgi"
    
  3. 关键断点:

    • 0x0040cf34:cookie验证点
    • 0x0040d038:命令执行点

补丁分析

固件版本1.04修复方式:

  1. 不再使用system函数执行命令
  2. 改为使用execel执行固定程序
  3. 用户输入作为参数而非命令部分

关键修复代码:

__s1 = "/usr/sbin/event";
__format = "event";
FUN_0040ce38(__s1, __format, iVar5, pcVar4);

// FUN_0040ce38实现
__pid = fork();
if ((-1 < __pid) && (__pid == 0)) {
    close(1);
    iVar1 = execl(pcParm1, pcParm2, uParm3, uParm4, 0);
}

防护建议

  1. 升级到固件版本1.04或更高
  2. 实施输入验证和过滤
  3. 使用最小权限原则运行服务
  4. 避免直接拼接用户输入到系统命令

总结

该漏洞展示了嵌入式设备中常见的命令注入问题,通过分析可以学习到:

  1. CGI程序处理用户输入的安全隐患
  2. 固件漏洞分析方法
  3. 动态调试嵌入式程序的技巧
  4. 安全补丁的实现方式
D-Link service.cgi远程命令执行漏洞分析教学文档 漏洞概述 漏洞编号 :CNVD-2018-01084 受影响设备 : D-Link DIR 615 D-Link DIR 645 D-Link DIR 815 受影响固件版本 :1.03及之前版本 漏洞类型 :认证后远程命令执行 漏洞成因 :service.cgi在处理HTTP POST请求数据时未正确过滤用户输入,导致命令拼接执行 漏洞原理分析 漏洞触发点 漏洞存在于 htdocs/cgibin 程序中的 servicecgi_main 函数,该函数处理 service.cgi 的请求。 关键代码流程 请求方法检查 : 参数解析 : 权限验证 : 参数获取 : 命令执行 : 命令注入点 lxmldbc_system 函数实现: 攻击者可通过控制 EVENT 、 ACTION 或 SERVICE 参数实现命令注入。 漏洞利用 利用前提 需要有效的认证cookie(可通过信息泄露漏洞获取) 发送POST请求到 /service.cgi POC示例 动态调试方法 使用QEMU模拟环境: 调试脚本示例: 关键断点: 0x0040cf34 :cookie验证点 0x0040d038 :命令执行点 补丁分析 固件版本1.04修复方式: 不再使用 system 函数执行命令 改为使用 execel 执行固定程序 用户输入作为参数而非命令部分 关键修复代码: 防护建议 升级到固件版本1.04或更高 实施输入验证和过滤 使用最小权限原则运行服务 避免直接拼接用户输入到系统命令 总结 该漏洞展示了嵌入式设备中常见的命令注入问题,通过分析可以学习到: CGI程序处理用户输入的安全隐患 固件漏洞分析方法 动态调试嵌入式程序的技巧 安全补丁的实现方式