php代码审计之PbootCMS漏洞审计
PbootCMS漏洞审计
一、环境准备
下载地址:https://gitee.com/hnaoyun/PbootCMS/releases/V1.2.1
解析域名:http://www.pboot.cms/
这个系统很方便默认情况下,直接下载下来什么都不用做即可使用。(前提是开启 php sqlite 扩展)
我们将其改为 mysql 数据库使用。
mysql 新建数据库,导入文件夹里的 sql 文件。
成功导入,然后修改数据库配置文件,
后台默认账户密码
账户:admin
密码:123456
二、熟悉MVC
目录结构:
2.1 自定义路由
路由文件: PbootCMS\apps\common\route.php
例如: http://www.pboot.cms/index.php/about/1
因为他的这个文件在系统的自定义路由上所以上面的路由解析以后就是
路由:
对应文件:
方法:
参数:
那个 home 是由 对应的入口文件,例如文中的index.php中的URL_BLIND
我们自定义一个方法进行访问,
添加自定义路由:
成功访问:
2.2 mvc动态路由
如果对于自定义路由没有的定义的路由,就会按照普通 mvc 模式来访问了。
比如:
路劲文件:
方法:
我们在 自己在添加一个自定义方法来访问,
访问:
三、内核分析
3.1 原生GET,POST,REQUEST
使用原生GET,POST,REQUEST变量是完全不过滤的
在控制器中进行测试,
可以看到没有任何过滤,
所以使用原生变量获取方法就很有可能产生漏洞。
3.2 系统获取变量函数
路径:
方法:,,等
最后中一系列检测,再最后进行过滤:
可以看得到所有传过来的内容都会先过一个正则匹配过滤
会将 0x7e,0x27,0x22,updatexml,extractvalue,name_const,concat 将其替换为''
再进行防止 xss和sql注入的再次过滤。
但是在这里只进行了数组 value的过滤, key 并没有过滤。
可以双写绕过。
测试:
效果如图
3.3 数据库内核
测试查询数据,
新建一个数据表,
在中,
在中
访问,即可查询,
很明显,有sql注入:
测试插入数据,
:
在中
成功插入。
测试更新数据
:
在中
测试成功。
测试删除数据
:
在中
测试删除成功。
3.4 调试数据库内核
where 方法得到拼接 where 条件,无过滤
select 方法最终得到
整个db 类的底层都是类似的字符串拼接
四、留言处 insert sql注入
由于此 cms 只会对数组键值进行过滤而不会对键进行过滤,恰巧这里浏览处可以接收数组。
poc:
我们使用浏览器+phpstorm调试来探明注入漏洞的产生。(为方便测试,已修改源代码将验证码功能注释)
首先读取了数据库留言表字段,返回一个三维数组,数组为数据表名,分别即为,,,这里用处即为作为 post接收数据的 键
这里即起到了作用,遍历二维数组的分别值接收 post 数据。
将数据存储到 data 数组中,由于接受的 contacts 为数组,所以 data 也就变成了多维数组。
接下来,我们对操作进行调试探索,按 F7
到了:
继续 F7 ,这里主要是函数比较关键。
判断 data 为空即返回
这里用于判断是否 data 为多维数组,如果不是即相等,否则不相等。
所以,转到 else ,和用于拼接。
由于为数组,所以再次进行 foreach ,进行分别拼接键和键值。
其余操作一直为 拼接,接下来跳出了 foreach,
然后拼接,之后出现数组,进入函数,构建 Sql 语句,获得
即发生了注入,拼接了恶意sql语句
五、前台首页sql注入
poc:
, index 方法:
跟进
,
这里读取数据
这里接收了外部了外部所有的get参数然后判断了开头的前4个字符是否 ext_ 开头,如果符合就直接拼接进入$where2这个数组 然后带入数据库进行getList方法与getSpecifyList查询,而底层是字符串拼接,过滤了value没有过滤key所以有注入
最终 sql 语句
六、搜索框sql注入
poc:
中 index 方法
跟进
中 parserSearchLabel 方法,
这里将 恶意语句带入,
接下来就是读取数据这里
这里接收了外部了外部所有的get参数然后就直接拼接进入$where2这个数组 然后带入数据库进行getList方法查询,而底层是字符串拼接,过滤了value没有过滤key所以有注入.