EasyQuotesWordPress插件SQL注入

admin 2026-02-03 00:49:04 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析了WordPress插件EasyQuotes在1.2.3版本前存在的无需认证SQL注入漏洞CVE-2025-26943。漏洞源于未对用户输入进行过滤直接拼接SQL语句,攻击者可通过RESTAPI端点family参数利用该漏洞提取数据库信息。文章通过补丁对比展示了修复方案,即使用wpdb->prepare进行预编译,并建议开发者务必使用预处理语句及定期更新插件以确保安全。 综合评分: 91 文章分类: 漏洞分析,WEB安全,代码审计,漏洞POC,漏洞预警


补丁差异}}

许多其他函数也以相同方式被修复,例如 get_font_variant($family_id, $variant_id)、get_font_variants($family) 和 get_fonts($category = -1)。

尽管 get_fonts_categories() 也被更新了,但它不接受用户输入,因此与 SQL 注入问题无关:

publicstatic 函数 get_fonts_categories() {     /** @varwpdb$wpdb */     global$wpdb;     $tablename=$wpdb->prefix .’easy-quotes-categories’;     $SQL=$wpdb->prepare(         “SELECT category\_id, category FROM %i”,         $tablename     );     return$wpdb->get_results($SQL); }

工作原理

我们利用 get_family_data($family) 函数中的 SQL注入,其他函数也存在类似方式的漏洞。

get_family_data() 是 Quotes_Data 类中的一个私有函数(以下示例展示了上下文):

类 Quotes_Data {     函数 __construct()     {         add_filter(‘posts_where’, 数组($this, ‘posts_where’), 10, 2);     }

    // other functions

    publicstatic 函数 get_font_variants($family) {         $familyData=self::get_family_data($family);         // other logic     }

    publicstatic 函数 get_family($family, $variant_id) {         $family_data= (数组)self::get_family_data($family);         // other logic     }

    privatestatic 函数 get_family_data($family) {         /** @varwpdb$wpdb */         global$wpdb;         $tablename=$wpdb->prefix .’easy-quotes-families’;         return$wpdb->get_row(“SELECT * FROM ".$tablename." WHERE family='”.$family.”‘;”);     } }

get_family_data() 由 get_family() 和 get_font_variants() 调用;要查找这些函数的使用位置,请搜索 get_family 或 get_font_variants。

{{< figure src="search_func.png" caption="搜索函数" alt="搜索函数" >}}

get_font_variants() 函数由 Quotes_Rest_Route 类中的 rest_route_callback_font_variants() 调用:

类 Quotes_Rest_Route {     函数 __construct()     {         add_action(‘rest_api_init’, 数组($this, ‘rest_api_init’));     }

    /**      * Register my REST route      *      * @return void      */     函数 rest_api_init($wp_rest_server)     {         $args= [             ‘方法’                => WP_REST_Server::READABLE,             ‘回调函数’              => [$this, ‘rest_route_callback_quote’],             ‘permission_callback’   => ‘__return_true’         ];         register_rest_route(‘layart/v1’, ‘/quote’, $args);

        // other logic

        $args[‘回调函数’] = [$this, ‘rest_route_callback_font_variants’];         register_rest_route(‘layart/v1’, ‘/font-variants’, $args);     }

    // other functions

    函数 rest_route_callback_font_variants(WP_REST_Request $请求)     {         $family= $请求->get_param(‘family’);         $family=isset($family) ?$family:”Shadows Into Light”;

        $响应 = Quotes_Data::get_font_variants($family);         return rest_ensure_response($响应);     } }

Quotes_Rest_Route 的构造函数使用 add_action(‘rest_api_init’, …) 向 WordPress 的 REST API 系统注册端点。

回调函数 rest_route_callback_font_variants 对应端点 /wp-JSON/layart/v1/font-variants?family=family_name。如果未提供 family 参数,则默认为 Shadows Into Light。

漏洞利用

检测 SQL 注入

我们使用 基于布尔的 SQL 注入 技术来测试 family 参数是否可注入。

真值请求 (示例): 当注入的条件评估为真时,查询正常返回结果:

SELECT*FROM wp_easy-quotes-families WHERE family=’Roboto’AND’1’=’1′;

假值请求 (示例): 当注入的条件为假时,不返回任何结果:

SELECT*FROM wp_easy-quotes-families WHERE family=’Roboto’AND’1’=’2′;

获取数据库名称的首字母

转储数据的前提是能够提取数据库名称的单个字符;一旦能够获取一个字符,通常就可以提取其余部分。

在我的测试环境中,数据库名称为 WordPress,因此第一个字符是 w。

{{< figure src="first_letter.png" caption="首字母" alt="首字母" >}}

检查 SUBSTRING(数据库(),1,1)=’w’ 的有效载荷正常返回数据,确认第一个字母是 w:

SELECT*FROM wp_easy-quotes-families WHERE family=’Roboto’AND SUBSTRING(数据库(),1,1)=’w’;

结论

WordPress Easy Quotes 插件(1.2.3 版本之前)中的漏洞 CVE-2025-26943 是由于将用户提供的输入直接拼接到 SQL 查询中,而不是使用预处理语句($wpdb->prepare)所导致的,这造成了 SQL注入。

官方补丁使用 $wpdb->prepare 替换了字符串拼接,确保用户输入得到安全处理。

关键要点:

·在 WordPress 中与数据库交互时,始终使用 $wpdb->prepare() 以防止 SQL注入。

·定期更新插件并进行安全检查,以避免成为攻击目标。

参考资料

SQL注入 备忘单 – PortSwigger

WordPress Easy Quotes 插件 <= 1.2.2 存在 SQL注入 漏洞

进技术交流群加好友:


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:天启攻防实验室 匆匆过客 匆匆过客《Easy Quotes WordPress 插件 SQL注入》

评论:0   参与:  0