yxtcmf6.1是一个基于thinkphp3.2.3的cms,19年3月份发布,用来练习代码审计是个不错的选择。
审计思路由于这个cms采用MVC架构并且是基于thinkphp3.2.3的,所以先了解文件结构,知道不同的页面对应的文件位置在哪。然后搭建一个tp3.2.3了解一下这个框架,百度找找这个框架的漏洞,再通过Seay全局搜索可能因为这个框架存在漏洞的关键词。接下来上自动审计(自动审计的规则并不是很完全,所以可以通过自己审计的经验添加规则或者上百度找一些规则),对自动审计的结果进行验证,结果可能会有几百上千条,虽然不用每一条都去看,但是也是比较需要耐心的。最后可以拿AWVS之类的扫描器扫一扫,看看能不能扫出惊喜。
准备工具phpstorm,Seay源码审计系统,phpstudy,AWVS
0x00 了解文件结构和路由方式
路由方式
例如前台登录界面的url为:8014/index.php/User/Login/index
则对应的文件目录为/application/User/LoginController.class.php,函数为index()
0x01 了解thinkphp3.2.3的漏洞
自己先搭建一个tp3.2.3,通过百度找到了一些thinkphp3.2.3存在的sql注入,然后记录下来简单说明一下
tp3.2.3构造sql语句的函数如上,如果$option的值是可以任意传入的,那么就有可能达到sql注入的目的
1.->where("可控参数")->find()
$username = $_GET['username'];$data= M('users')->where(array("username"=>$username))->find();测试代码如上,传入参数username[0]=exp&username[1]=='admin' and updatexml(1,concat(0x3a,(user())),1)%23,然后调试跟进,主要代码段如下,$whereStr为构造sql语句的一部分
结果构成如下sql语句
这里接收传参的方法必须不为I($_GET['username']),否则会检测值内是否含有'exp',如果有,就会加上空格变为'exp '
2.->find/select/delete("可控参数")
$id=I("id");$data=M("users")->find($id);测试代码如上,传入id[where]=1 and updatexml(1,concat(0x7e,user(),0x7e),1) %23 ,然后调试跟踪
最后得到sql语句如下,不需要单引号闭合也可完成注入
find()换成select()或者delete()也是一样的效果
3.->where("可控参数")->save("可控参数")
$condition["username"]=I("username");$data["password"]=I("password");$res=M("users")->where($condition)->save($data);测试代码如上,传入username[0]=bind&username[1]=0 and (updatexml(1,concat(0x3a,(user())),1))%23&password=123456,调试跟踪