DLINK设备sc_mgr接口RCE分析
字数 854 2025-08-22 12:23:30
DLINK设备sc_mgr接口RCE分析与利用
漏洞概述
本文档详细分析DLINK设备中sc_mgr.cgi接口存在的远程代码执行(RCE)漏洞。该漏洞源于对用户输入的不当处理,允许攻击者在未授权情况下执行任意系统命令。
漏洞分析
1. 入口点分析
漏洞存在于sc_mgr.cgi文件中,其入口函数为cgiMain而非传统的main函数。这是CGI程序的典型特征。
void cgiMain() {
if (sub_8D14() != 1) {
cgiHeaderStatus(404);
return;
}
// 其他处理逻辑
}
2. 关键验证函数
sub_8D14函数负责验证请求的合法性:
int sub_8D14() {
char *client_ip = getenv("REMOTE_ADDR");
if (strcmp(client_ip, "127.0.0.1") == 0) {
return 1;
}
char username[256];
cgiCookieString("username", username, sizeof(username));
char cmd[512];
snprintf(cmd, sizeof(cmd), "echo '%s' '%s' > /tmp/test", username, client_ip);
system(cmd);
// 其他验证逻辑
return ...;
}
关键点:
- 本地请求(127.0.0.1)直接通过验证
- 非本地请求会获取cookie中的username值
- 构造并执行系统命令,将username和客户端IP写入/tmp/test文件
3. 命令执行路径
在cgiMain函数中,程序会检查cmd参数的值,并根据不同值进入不同的处理分支:
char cmd_value[256];
cgiFormStringNoNewlines("cmd", cmd_value, sizeof(cmd_value));
if (strcmp(cmd_value, "value1") == 0) {
// 处理逻辑1
} else if (strcmp(cmd_value, "value2") == 0) {
// 处理逻辑2
}
// 其他分支
所有分支都存在命令回显功能,使得攻击结果可见。
漏洞利用
1. 基本利用方法
通过构造特殊的cmd参数,可以闭合原有命令并注入新命令:
cmd='qweewq12' & id & echo 'admin' '127.0.0.1'>/tmp/test
解释:
- 第一个单引号闭合原有的echo命令
- &符号连接多个命令
- id是要执行的任意命令
- 最后部分维持原有命令格式避免语法错误
2. 利用条件
- 无需认证即可访问sc_mgr.cgi接口
- cmd参数值可以为任意值,只要格式正确即可触发命令执行
- 所有执行结果都会回显到响应中
3. 复现截图
根据原文描述,复现时任意cmd值均可导致命令执行并回显结果。
防护建议
-
输入验证:
- 对所有用户输入进行严格验证
- 过滤特殊字符如&、|、;等
-
权限控制:
- 限制CGI程序的执行权限
- 使用最小权限原则运行服务
-
代码修复:
- 避免直接使用system()执行用户可控数据
- 使用安全的API替代危险函数
-
网络防护:
- 限制对管理接口的访问
- 实施IP白名单策略
总结
该漏洞展示了Web接口中直接拼接用户输入到系统命令中的危险性。开发人员应避免此类模式,转而使用参数化查询或专用API来处理系统交互。对于网络设备固件,应定期进行安全审计以发现类似问题。