-
-
PbootCMS V3.2.9前台SQL注入漏洞(上)
-
发表于: 8小时前 234
-
0x01 前言
PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要。系统采用简单到想哭的模板标签,只要懂HTML就可快速开发企业网站。官方提供了大量网站模板免费下载和使用,将致力于为广大开发者和企业提供最佳的网站开发建设解决方案。
PbootCMS在国内有非常大的客户使用量,属于国内最流行的企业官网建站程序。截止本文发出前,其github最新版本为V3.2.9。通过互联网资产测绘平台搜索指纹header="PbootCMS",搜索结果有超过34W+互联网案例。
在最新版的PbootCMS V3.2.9中存在前台未授权SQL注入漏洞,攻击者可以通过此漏洞读取系统数据库中的敏感信息,包括后台用户的用户名和密码。
0x02 漏洞分析
之前因为某任务进行批量任务扫描时发现很多目标都在报DVB-2021-2510漏洞,其POC大致如下,返回数据匹配到your SQL syntax或syntax error。
POST /index.php?p=search
1=select
此漏洞是很早以前已经曝出的安全漏洞,对应CVE编号为CVE-2021-28245,但是最大的问题是我在最新版本的V3.2.9上测试仍然存在此漏洞。也就是官网一直都没有修这个漏洞,如下图所示。
由于ddpoc上面的这个脚本主要做poc探测和验证,并不带直接的漏洞利用,需要跟踪源码分析漏洞逻辑。跟踪到漏洞对应的文件apps/home/controller/SearchController.php。
PbootCMS有一套复杂的模版替换的逻辑,其中模板替换分成多个步骤,在SearchController类中会通过parserSearchLable方法对模板内容进行解析,跟踪parserSearchLable方法。parserSearchLable方法逻辑很复杂,我直接定位到最关键的部分如下。
其中receive来自于外部输入,遍历receive变量,会生成新的数组where3。where3是后期漏洞利用的关键,但是这里先关注value=request(key, 'vars'),看一下这里对数据的过滤逻辑。跟进request方法。
跟进filter方法,如下图所示,当传入的d_type(也就是request方法的第二个参数)为vars时,只能包含中文、字母、数字、横线、点、逗号、空格!。而这也为后面的SQL注入的利用埋下了伏笔。
回到刚才提到的where3变量,where3变量会传入getList方法。
继续跟进getList方法,传入的where3传入到变量select。
跟进变量select,如下图所示,可以看到其中的select传入了where方法,这个方法是用于组合SQL语句的查询条件。
继续跟进where方法,如下图所示。当key也就是传入的数据是一个整数时,会直接拼接value的值,导致SQL注入漏洞。这里为什么不用key来注入呢?因为key前面的图里面有限制,只能输入\w-.,不允许空格和特殊字符导致无法直接利用此注入点。
0x03 漏洞利用
漏洞的整个流程已经梳理清楚了,下一步就是漏洞如何利用的问题了。这里由于request($key, 'vars')限制导致不能使用特殊字符。不能使用括号、单引号、注释和逗号会极大的限制整个漏洞的利用方式。
为方便大家直观看到SQL语句效果,我临时把SQL语句打印出来,如下图所示,大致是直接在括号中拼接SQL语句。
只能使用\w和空格的注入,极大的限制了注入点的利用,但是仍然可以通过BOOL盲注的方式来达到注入的效果。
- 使用下面的payload访问目标,显示有搜索结果
1=select 1 from ay_user where username like 0x6125 limit 1
2)使用下面的payload访问目标,显示无搜索结果
1=select 1 from ay_user where username like 0x6225 limit 1
由此可以证明目标站点ay_user(管理员用户表)第一个用户的username的第一个字母是a(第一个用户默认一般是admin)。
这里很巧妙的使用mysql的like语句支持16进制编码的特性来避免使用其它特殊字符,但是整个利用过程还是有下面的注意点:
1)仅支持PbootCMS安装选择mysql数据库的网站,PbootCMS默认情况下使用的是sqlite数据库,如果是sqlite数据库,暂时不知道如何在不引入特殊字符的情况下进行注入。
2)因为不能使用逗号,所以不能通过limit 1,1这样的方式来注第二个用户,但是可以通过增加条件的方式来进行注入,例如下面的payload
1=select 1 from ay_user where username like 0x25 and username not like 0x61646d696e25 limit 1
0x04 结论
DVB-2021-2510(CVE-2021-28245)是一个很好的漏洞,互联网案例足够多,影响大。这是一个经典的有条件的SQL注入漏洞,值得小伙伴们学习研究。
在下一篇文章中,作者会带来PbootCMS更多有意思的漏洞和利用方式。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课