当前位置: 首页 > article >正文

PbootCMS V3.2.9前台SQL注入漏洞(上)

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盲注的方式来达到注入的效果。

1)  使用下面的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更多有意思的漏洞和利用方式。


http://www.kler.cn/a/460927.html

相关文章:

  • Oracle exp和imp命令导出导入dmp文件
  • xdoj isbn号码
  • 商用车自动驾驶,迎来大规模量产「临界点」?
  • 【Vue】vue项目中命名规范(结合上一篇项目结构)
  • NSGA-II(非支配排序遗传算法II)详解与实现
  • 酒店管理系统|Java|SSM|VUE| 前后端分离
  • XML解析
  • FreeRTOS: 中断服务例程 Interrupt Service Routine, ISR
  • 架构师之路--达梦数据库事务控制详解
  • Rust windows 环境的安装
  • 如何实现企业精准定位?解锁高效传播的新路径,媒介盒子分享
  • 高防服务器在网络游戏中起着哪些作用?
  • 滴滴Java开发面试题及参考答案 (上)
  • Fama MacBeth两步法与多因子模型的回归检验
  • iOS 18手机不越狱玩MC java版---PojavLauncher
  • 【玩转23种Java设计模式】行为型模式篇:备忘录模式
  • 26. 机器人走迷宫
  • 条款42:了解 typename 的双重含义(Understand the two meanings of typename)
  • 条款43:学习处理模板化基类内的名称(Know how to access names in templatized base classes)
  • Java中如何实现线程安全的单例模式?
  • raspberrypi-kernel
  • Ps:将数据组作为文件导出
  • RabbitMQ实现生产者消费者
  • 使用react和redux构建一个简单的计数器
  • RP2040 C SDK I2C外设使用
  • Docker容器镜像制作