ThinkPHP5漏洞学习

ThinkPHP 5基础

以ThinkPHP5.1.x版本为例
composer create-project topthink/think=5.1.36 thinkphp5.1.36
ThinkPHP5.1完全开发手册 先来了解目录架构,这里直接看手册
https://www.kancloud.cn/manual/thinkphp5_1/353950

访问模式

5.1的 URL 访问受路由决定,如果在没有定义或匹配路由的情况下(并且没有开启强制路由),则基于
/index.php(或者其它入口文件)/模块/控制器/操作/参数/值…

请求参数

继承了控制器基类think\Controller直接使用this->request->param('name');来获取请求参数
Facade调用Request::param('name');
助手函数request()->param('name');

漏洞详解

parseWhereItem未过滤处理where查询表达式
漏洞 Demo

1
2
3
4
public function sqlDemo(){  
	$username = request()->get('username');  
	$result1 = db('user')->where('username','exp',$username)->select();   
}  

Poc ) union select 1,2,updatexml(1,concat(1,user(),1),1)--+
debug断点调试,跟进where()方法
这里跟进parseWhereExp()方法,
利用whereExp来处理传入的$username,继续跟进whereExp()方法
进行了赋值之后,直接返回,
便进入到select()方法里面,和ThinkPHP3 SQL 注入有类似之处,这里直接进入parseWhere()方法里面进行了返回
然后进行了一系列操作之后,就直接执行了。

0%