代码审计之SQL注入审计流程
- ThinkPHP框架
- ThinkPHP的路由
- PbootCMS
- PbootCMS留言处存在SQL注入
- 代码分析
ThinkPHP框架
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架
MVC模式的php开发框架
MVC:一种软件架构模式,把系统分为三个部分:模型、视图、控制器
用户从视图处输入数据然后发送数据包到模型处,模型处进行一个逻辑处理,最后发送到控制器对数据进一步处理
结构
ThinkPHP的路由
ThinkPHP分为两种路由模式,自定义路由和MVC路由
自定义路由:
在common/route.php
文件中
例:当在网址访问http://127.0.0.1/index.php/about/1
时,其实并不是访问about
文件夹下的1
这个文件。而是去访问了about
中的index
方法,scode
为参数
为什么访问的是index.php
但是会去home
中找?
因为index.php
中设置了入口文件地址绑定,将index.php
这个文件绑定到home这个模块当中
PbootCMS
PbootCMS留言处存在SQL注入
在线留言出提交留言并抓包
将参数名改为注入语句,提交
发送数据包后,此处存在注入点,爆出了用户
代码分析
提交留言的url为index.php/Message/add
我们直接访问此处,回显页面说只允许POST
访问
查看代码此处是MVC
的路由,访问的是home/controller/MessageController.php
中的add
方法
对add
方法进行跟踪,在add
方法中if
判断时直接调用了addMessage
方法
对addMessage
方法进行跟踪,此方法为新增留言
设置表为ay_message
,然后调用了insert
方法对数据库执行插入操作
跟踪insert
方法
在查看insert
方法前,先补充一下ThinkPHP
对POST
数据的处理
ThinkPHP
会将所有POST
提交的数据进行处理,处理的函数在core/function/helper.php
中的post
函数
此处post
函数会将,post
方式提交的数据中的一些信息赋值给condition
这个数组
然后调用filter
函数并进行return
跟踪一下filter
函数查看内容
此函数完成的功能是对传入的condition
数组中的内容(也就是post方式提交的内容)进行处理
在filter
函数中,前面主要做的是对数据的格式进行处理,并没有对数据进行安全过滤,在filter
函数的最后调用了escape_string
函数进行return
跟踪escape_string
函数
此函数首先判断参数是否为空,如果为空就直接返回
如果是数组或对象就递归当前函数,将数组或对象中的所有字符串递归出来
然后对字符串中的危险内容通过preg_replace
进行替换、将字符串通过htmlspecialchars
函数进行html
实体化、然后通过addslashes
函数对字符串中的特殊字符加\
此方法从头到尾,只是对post
传入的数组中的参数值进行了过滤处理,并没有对参数名进行处理
例子:
post传入的内容为 {user="admin"}
1.假设以数组的格式进入这个函数时
2.第一个if判断不为空,然后第二个if判断为数组
3.将数组中的value,也就是参数值("admin"字符串)进行递归
4.再次进入此函数时,直接匹配了最后的else,对参数值("admim"字符串)进行过滤
5.然后递归结束,将过滤后的参数值("admin"字符串)赋值给了key,也就是(user参数名)
函数结束
直到函数结束后都没对参数名(key)进行过滤
所以POST
传入的参数名没有进行过滤
接下来回到之前,去跟踪insert
方法
之前POST
没有进行过滤,此处也没有过滤直接执行了添加操作的sql语句
通过seay源码审计工具来监控sql语句执行,此处就是提交留言的sql语句
可在此处将参数值进行闭合进行sql注入