首页
社区
课程
招聘
[原创]PbootCMS前台SQL注入漏洞(下)
发表于: 2024-12-25 11:42 1601

[原创]PbootCMS前台SQL注入漏洞(下)

2024-12-25 11:42
1601

0x01前言
在前一篇文章中介绍了一个仍然可以用于最新版PbootCMS的老漏洞DVB-2021-2510,并对漏洞流程进行分析,给出了在有限条件下利用漏洞的方式。

本文将在前一篇文章的基础上继续给出新的PbootCMS SQL注入漏洞,并对利用方式进行更深入的探讨。

0x02漏洞分析
由于PbootCMS使用了模板的方法来组合产品页面内容,为了支持可扩展性,支持非常复杂的语法,对基础内容想了解的可以先看文章784K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5P5W2)9J5k6h3q4D9K9i4W2#2L8W2)9J5k6h3y4G2L8g2)9J5c8Y4c8Q4x3V1j5I4y4o6l9&6x3q4!0q4x3#2)9^5x3q4)9^5x3R3`.`.

apps/home/controller/TagController.php文件中,会把外部传入的数据get('tag')替换模板文件中的内容。

图 1

这里的get('tag')和上一篇文章中的request($key, 'vars')有一个很大的区别是没有第二个参数,我们跟进get方法,看一下没有第二个参数的传值有哪些限制。

图 2

如果没有传入第二个参数,默认值为null。跟进filter方法,可以看出在filter对类型和数据的安全检查中,第二个参数为null并不会命中任何一个条件判断,也就是不会对数据值进行任何限制。这里因为$condition['d_type']为null也不会因此而报错。

图 3

虽然数据类型检测,但是filter方法中仍然有对其值的过滤方式,会替换很多标签相关的内容。这里需要重点标记一下,因为后面的SQL注入要用到这里过滤不完整的标签。

图 4

回到图1的代码中,外部传入的get('tag')经过方法parserPositionLabel会替换模板文件中的部分内容,跟进parserPositionLabel方法。

图 5

这里外部传入的数据变成了变量$link,并且经过替换之后响应到页面的<a>标签的href属性中。这里假设我们传入了{pboot:xxx},只要不在图4禁止的pboot标签中,则可能导致标签注入。pboot支持的标签有很多,具体要用哪个标签来达到漏洞利用的效果,还需要继续往下面跟进。

在图1的代码中继续往下,跟进parserAfter方法,这个方法中会解析大多数pboot标签。

图 6

我们这里用到的是parserListLabel方法,这个方法的主要作用是解析数据列表,至于是不是还有其它的方法也可以利用,小伙伴可以自行探索。继续跟进parserListLabel方法。

图 7

如果我们传入的get('tag')的值中包含了{pboot:list}标签,则会按照parserListLabel方法中的解析逻辑对其中的值进行正则提取,并保存到变量160K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">paramsparserParamparams中。具体parserParam的函数我就不跟了,其实就是简单的正则提取,我们继续往下跟进params中。具体parserParam的函数我就不跟了,其实就是简单的正则提取,我们继续往下跟进params变量的处理逻辑。

图 8

params的键名是filter时,也就是外部传入的参数为{pboot:list filter=xxx [list:link link=asd]{/pboot:list}。会把xxxx设置为变量filter的值,继续跟下面的调用逻辑。

图9

按照|对e41K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">filterfilter进行切割之后,其中filter进行切割之后,其中filter[0]会直接拼接到1feK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">whereSQLwhere1数组的值中,从这里已经可以看出来似乎进行了SQL语句的可控拼接。继续往下看一下where1数组的值中,从这里已经可以看出来似乎进行了SQL语句的可控拼接。继续往下看一下where1变量的调用逻辑。

图10

和上一篇文章的逻辑相似,上一篇文章的注入点在getList方法的参数227K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5q4)9J5c8V1#2S2N6r3S2Q4x3V1k6y4j5i4c8Z5e0f1H3`.">wherewhere3,这次的注入在参数where3,这次的注入在参数where1。跟进getList方法。

图11

外部传入的$where1变量会直接进入where方法中,从图9可以看出这里的filter时一个数组,并且其键名为数字。

图12

这也就导致了SQL注入漏洞。

0x03漏洞利用

从本质上来说此漏洞的漏洞利用要比上一篇文章的利用简单,因为这里不涉及对特殊字符的限制,而且这里有回显可以进行联合注入。在本地搭建的演示环境中进行测试,利用下面的payload查询ay_user表第一个用户的密码字段

799K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9K6b7e0R3^5z5e0m8Q4x3V1k6b7j5X3!0G2N6p5y4y4f1K6x3J5z5g2)9K6c8Y4c8S2k6#2)9K6c8s2S2^5P5q4)9K6b7g2)9J5y4e0N6T1M7r3u0G2L8%4c8Q4x3U0f1K6j5h3I4A6M7%4c8Q4x3U0f1J5x3r3k6A6L8s2c8W2M7W2)9J5y4e0y4V1x3g2)9J5y4e0y4V1x3W2)9J5y4e0t1&6g2f1&6u0e0@1&6Q4x3U0f1J5k6W2)9J5y4e0u0S2i4K6t1#2x3X3q4Q4x3U0f1J5k6W2y4q4e0p5g2o6g2q4)9J5y4e0u0X3i4K6t1#2x3X3q4Q4x3U0f1J5j5g2)9J5y4e0u0X3x3g2)9J5b7K6u0Q4x3V1x3K6i4K6u0o6y4q4)9J5b7K6g2Q4x3V1y4Q4x3U0S2K6k6h3I4W2j5%4c8Q4x3V1k6Q4x3V1q4Q4x3V1q4Q4x3V1k6H3j5i4y4K6N6$3!0J5k6q4)9J5c8W2)9J5b7g2)9J5b7g2)9J5c8X3k6J5L8$3#2Q4x3V1k6Q4x3V1q4Q4x3V1q4Q4x3V1k6S2P5g2)9#2k6Y4g2K6k6i4u0Q4x3V1k6Q4x3V1q4Q4x3V1q4Q4x3V1k6D9K9h3#2A6N6q4)9J5c8W2)9J5b7g2)9J5b7g2)9J5c8U0m8Q4x3V1x3I4i4K6t1&6i4K6u0o6y4#2)9J5b7K6S2Q4x3V1x3&6i4K6u0o6x3e0m8Q4x3V1x3I4x3g2)9J5b7K6p5J5i4K6u0o6x3e0y4Q4x3V1x3I4y4q4)9J5b7K6p5#2i4K6u0o6x3e0k6Q4x3V1x3I4y4#2)9J5b7K6p5^5i4K6u0o6x3e0W2Q4x3V1x3J5x3q4)9J5b7K6t1I4i4K6u0o6x3U0u0Q4x3V1x3J5x3#2)9J5b7K6t1@1i4K6u0o6x3U0g2Q4x3V1x3J5y4W2)9J5b7K6t1%4i4K6u0o6x3U0S2Q4x3V1x3J5z5g2)9J5y4e0u0X3i4K6t1#2x3X3q4Q4x3U0f1J5j5g2)9J5y4e0u0X3i4K6t1#2x3U0y4Q4x3U0f1J5k6W2)9J5y4e0u0S2i4K6t1#2x3X3q4Q4x3U0f1J5k6W2)9J5y4e0N6U0x3e0t1K6i4K6t1#2x3U0m8K6j5$3!0V1k6g2)9J5y4e0y4V1x3e0t1K6i4K6t1#2y4$3c8Q4x3U0f1#2j5X3I4A6M7%4c8Q4x3U0f1K6j5h3I4A6L8X3E0Q4x3U0f1J5x3r3I4A6L8X3E0Q4x3U0f1K6k6r3q4K6k6q4)9J5y4e0g2V1i4K6t1#2y4$3u0Q4x3U0f1J5k6Y4m8T1L8$3!0@1i4K6t1#2x3$3q4D9K9i4y4@1i4K6t1#2y4$3b7`.

查看源代码,会在如下位置回显对应的结果信息

图13

这里面有几个注意点是需要说明的

1)payload不允许用空格,因为在图7解析{pboot:list}标签时调用的parserParam方法按照空格进行截断,如下所示。

图14

  1. 注释符问题。对于mysql数据库,这里只能使用#单行注释,而不能使用--单行注释;对于sqlite数据库,这里只能使用--单行注释,而不能使用#单行注释。这主要还是空格的原因,我通过下面一张表来说明这个小技巧。

因为PbootCMS的payload不允许使用空格,所以造成了一个很奇怪的结论。

  1. 在实网环境下,不同的站点union select的函数是不一样的,要基于实际情况进行调整。

虽然我们现在已经能完全的对目标进行注入(包括mysql和sqlite两种数据库),而且是有回显的联合查询,但是当前的payload特征非常明显,极易被WAF查杀。有没有某种绕过WAF的方式呢?

当然是有的,PbootCMS有复杂的模板替换逻辑,只要找一个字符串替换为空的操作,然后在关键字中一直插入干扰字符,就可以轻易绕过WAF,如果你现在倒回去看一下图4,你就会发现x3e|x3c会是一个不错的选择,例如你可以使用使用下面的payload

3e6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9K6b7e0R3^5z5e0m8Q4x3V1k6b7j5X3!0G2N6p5y4y4f1K6x3J5z5g2)9K6c8Y4c8S2k6#2)9K6c8s2S2^5P5q4)9K6b7g2)9J5y4e0N6T1M7r3u0G2L8%4c8Q4x3U0f1K6j5h3I4A6M7%4c8Q4x3U0f1J5x3r3k6A6L8s2c8W2M7W2)9J5y4e0y4V1x3g2)9J5y4e0y4V1x3W2)9J5y4e0t1&6g2f1&6u0P5o6y4W2e0@1&6Q4x3U0f1J5k6Y4R3K6k6g2)9J5y4e0u0S2i4K6t1#2x3X3q4Q4x3U0f1J5k6W2y4q4e0s2R3K6k6f1g2o6g2q4)9J5y4e0u0X3P5o6y4W2i4K6t1#2x3X3q4Q4x3U0f1J5j5g2)9J5y4e0u0X3x3g2)9J5b7K6u0Q4x3V1x3K6i4K6u0o6y4q4)9J5b7K6g2Q4x3V1y4Q4x3U0S2K6k6h3I4^5x3$3g2W2j5%4c8Q4x3V1k6Q4x3V1q4Q4x3V1q4Q4x3V1k6H3j5i4R3K6k6i4y4K6N6$3!0J5k6q4)9J5c8W2)9J5b7g2)9J5b7g2)9J5c8X3k6J5P5o6y4W2L8$3#2Q4x3V1k6^5x3$3g2Q4x3V1q4Q4x3V1q4Q4x3V1k6S2P5g2)9#2k6Y4g2K6k6i4u0Q4x3V1k6Q4x3V1q4Q4x3V1q4Q4x3V1k6D9K9i4R3K6k6h3#2A6N6q4)9J5c8Y4R3K6k6g2)9J5b7g2)9J5b7g2)9J5c8U0m8Q4x3V1x3I4i4K6t1&6i4K6u0o6y4#2)9J5b7K6S2Q4x3V1x3&6i4K6u0o6x3e0m8Q4x3V1x3I4x3g2)9J5b7K6p5J5i4K6u0o6x3e0y4Q4x3V1x3I4y4q4)9J5b7K6p5#2i4K6u0o6x3e0k6Q4x3V1x3I4y4#2)9J5b7K6p5^5i4K6u0o6x3e0W2Q4x3V1x3J5x3q4)9J5b7K6t1I4i4K6u0o6x3U0u0Q4x3V1x3J5x3#2)9J5b7K6t1@1i4K6u0o6x3U0g2Q4x3V1x3J5y4W2)9J5b7K6t1%4i4K6u0o6x3U0S2Q4x3V1x3J5z5g2)9J5y4e0u0X3i4K6t1#2x3X3q4Q4x3U0f1J5j5g2)9J5y4e0u0X3i4K6t1#2x3U0y4Q4x3U0f1J5k6W2)9J5y4e0u0S2i4K6t1#2x3X3q4Q4x3U0f1J5k6W2)9J5y4e0N6U0x3e0t1K6i4K6t1#2x3U0m8K6j5$3!0V1k6g2)9J5y4e0y4V1x3e0t1K6i4K6t1#2y4$3c8Q4x3U0f1#2j5X3I4A6M7%4c8Q4x3U0f1K6j5h3I4A6L8X3E0Q4x3U0f1J5x3r3I4A6L8X3E0Q4x3U0f1K6k6r3q4K6k6q4)9J5y4e0g2V1i4K6t1#2y4$3u0Q4x3U0f1J5k6Y4m8T1L8$3!0@1i4K6t1#2x3$3q4D9K9i4y4@1i4K6t1#2y4$3b7`.

0x04 结论
当前我们已经能无限制的对PbootCMS进行SQL注入了,有超过30W的互联网案例都受此漏洞影响。我认为这是2024最好用的漏洞,你觉得呢?

原文链接


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回