从一个简单的wordpress插件漏洞研究一下wordpress插件原理
字数 1786 2025-08-26 22:11:14

WordPress插件漏洞分析与插件原理研究

漏洞概述:AdRotate Plugin SQL注入

AdRotate Plugin在5.2及之前版本中存在SQL注入漏洞,该漏洞由FortiGuard实验室发现。

漏洞位置

  • 文件路径:\dashboard\publisher\adverts-edit.php
  • 关键问题:SQL查询拼接时未正确闭合变量

漏洞分析

  1. adverts-edit.php文件中,存在多处SQL查询语句
  2. 第25行处存在SQL注入隐患:$ad_edit_id变量被直接拼接到SQL语句的id值部分,没有使用单引号闭合
  3. $ad_edit_id变量通过GET请求传入:$ad_edit_id = esc_attr($_GET['ad']);
  4. esc_attr方法仅用于过滤HTML标签,对SQL注入无影响

漏洞利用

  • 构造Payload示例:
http://127.0.0.1/wordpress/wp-admin/admin.php?page=adrotate-ads&view=edit&ad=-1+UNION+SELECT+1%2CUSER%28%29%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C1
  • 这是一个有回显的注入,数据库user被回显到name处

WordPress核心机制分析

问题一:WordPress如何处理\(_GET/\)_POST等请求

  1. WordPress在入口处对请求参数进行过滤
  2. 位于wp-includes\load.php中,WordPress使用add_magic_quotes方法过滤$_GET$_POST$_COOKIE$_SERVER
  3. 过滤后的GET与POST数组合并后覆盖$_REQUEST
  4. add_magic_quotes方法使用addslashes过滤传入的键值
    • 例如传入的-1'会被过滤为-1\'

问题二:WordPress的过滤机制是否存在安全隐患

  1. 虽然WordPress对请求参数进行了转义,但仍可能存在安全隐患
  2. 当插件从请求中读取数组并通过INSERT方式插入数据库时
    • 可以在传入的键名中加入payload
    • 示例:array($_GET['key'] => $_GET['value'])
  3. 这种情况下,攻击者可以构造恶意键名绕过过滤

问题三:WordPress如何加载插件及构造利用链

  1. 插件加载机制:

    • 插件文件adverts-edit.php不能直接访问
    • 它被包含在adrotate.php中(第274行处)
    • adrotate_manage方法中定义了$ad_edit_id变量的赋值过程(第173行)
  2. 菜单注册机制:

    • adrotate.php第106行:add_submenu_page方法注册子菜单
      • 参数说明:
        • $parent_slug:顶级菜单名称
        • $page_title:子菜单标题(浏览器标题栏显示)
        • $menu_title:显示的菜单名称
        • $capability:用户权限
        • $menu_slug:URL上的菜单名称
        • $function:调用的函数名称
    • 访问URL:http://127.0.0.1/wordpress/wp-admin/admin.php?page=adrotate-ads
      • page参数值为add_submenu_page中的$menu_slug
  3. 顶级菜单定义:

    • adrotate.php第103行:add_menu_page方法定义顶级菜单
    • 访问URL:http://127.0.0.1/wordpress/wp-admin/admin.php?page=adrotate
  4. 钩子机制:

    • adrotate_dashboard方法(包含菜单注册代码)通过add_action连接到admin_menu钩子
    • admin_menu钩子在管理员加载管理菜单之前触发连接的函数

安全开发建议

  1. 始终使用预处理语句或WordPress提供的数据库API(如$wpdb
  2. 不要直接拼接用户输入到SQL查询中
  3. 即使WordPress提供了参数过滤,插件开发者仍需自行验证和清理输入
  4. 对于数组参数,要特别注意键名的安全性
  5. 遵循WordPress插件开发最佳实践,使用官方API

后记

通过分析这个简单的SQL注入漏洞,我们深入了解了:

  1. WordPress的请求处理机制
  2. 插件加载和菜单注册流程
  3. 钩子系统的运作方式
  4. WordPress的安全过滤机制及其局限性

这些知识对于WordPress插件开发和安全性分析都具有重要价值。

WordPress插件漏洞分析与插件原理研究 漏洞概述:AdRotate Plugin SQL注入 AdRotate Plugin在5.2及之前版本中存在SQL注入漏洞,该漏洞由FortiGuard实验室发现。 漏洞位置 文件路径: \dashboard\publisher\adverts-edit.php 关键问题:SQL查询拼接时未正确闭合变量 漏洞分析 在 adverts-edit.php 文件中,存在多处SQL查询语句 第25行处存在SQL注入隐患: $ad_edit_id 变量被直接拼接到SQL语句的id值部分,没有使用单引号闭合 $ad_edit_id 变量通过GET请求传入: $ad_edit_id = esc_attr($_GET['ad']); esc_attr 方法仅用于过滤HTML标签,对SQL注入无影响 漏洞利用 构造Payload示例: 这是一个有回显的注入,数据库user被回显到name处 WordPress核心机制分析 问题一:WordPress如何处理$_ GET/$_ POST等请求 WordPress在入口处对请求参数进行过滤 位于 wp-includes\load.php 中,WordPress使用 add_magic_quotes 方法过滤 $_GET 、 $_POST 、 $_COOKIE 、 $_SERVER 过滤后的GET与POST数组合并后覆盖 $_REQUEST add_magic_quotes 方法使用 addslashes 过滤传入的键值 例如传入的 -1' 会被过滤为 -1\' 问题二:WordPress的过滤机制是否存在安全隐患 虽然WordPress对请求参数进行了转义,但仍可能存在安全隐患 当插件从请求中读取数组并通过INSERT方式插入数据库时 可以在传入的键名中加入payload 示例: array($_GET['key'] => $_GET['value']) 这种情况下,攻击者可以构造恶意键名绕过过滤 问题三:WordPress如何加载插件及构造利用链 插件加载机制: 插件文件 adverts-edit.php 不能直接访问 它被包含在 adrotate.php 中(第274行处) adrotate_manage 方法中定义了 $ad_edit_id 变量的赋值过程(第173行) 菜单注册机制: adrotate.php 第106行: add_submenu_page 方法注册子菜单 参数说明: $parent_slug :顶级菜单名称 $page_title :子菜单标题(浏览器标题栏显示) $menu_title :显示的菜单名称 $capability :用户权限 $menu_slug :URL上的菜单名称 $function :调用的函数名称 访问URL: http://127.0.0.1/wordpress/wp-admin/admin.php?page=adrotate-ads page 参数值为 add_submenu_page 中的 $menu_slug 值 顶级菜单定义: adrotate.php 第103行: add_menu_page 方法定义顶级菜单 访问URL: http://127.0.0.1/wordpress/wp-admin/admin.php?page=adrotate 钩子机制: adrotate_dashboard 方法(包含菜单注册代码)通过 add_action 连接到 admin_menu 钩子 admin_menu 钩子在管理员加载管理菜单之前触发连接的函数 安全开发建议 始终使用预处理语句或WordPress提供的数据库API(如 $wpdb ) 不要直接拼接用户输入到SQL查询中 即使WordPress提供了参数过滤,插件开发者仍需自行验证和清理输入 对于数组参数,要特别注意键名的安全性 遵循WordPress插件开发最佳实践,使用官方API 后记 通过分析这个简单的SQL注入漏洞,我们深入了解了: WordPress的请求处理机制 插件加载和菜单注册流程 钩子系统的运作方式 WordPress的安全过滤机制及其局限性 这些知识对于WordPress插件开发和安全性分析都具有重要价值。