文章总结: 本文分析了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注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。



![漏洞预警暗网泄露:[exploitpack.com]所有漏洞利用程序泄露!](/images/random/titlepic/14.jpg)



![[0202]一周重点情报汇总|天际友盟情报站](/images/random/titlepic/4.jpg)


评论