ThinkPHP3.2.3漏洞学习
ThinkPHP 漏洞学习
环境搭建
ThinkPHP3
composer create-project topthink/thinkphp=版本号 文件名
ThinkPHP5
(完整版)
composer create-project topthink/think=版本号 文件名
阿里云 Compose 全量镜像资源库
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
https://www.runoob.com/w3cnote/composer-install-and-usage.html
框架了解
审计之前,我们需要了解框架的信息
composer create-project topthink/thinkphp=3.2.3 thinkphp3.2.3
|
|
其中框架目录ThinkPHP
的结构如下
|
|
其中Application
目录如下
|
|
路由信息
thinkphp3使用 URL 模式切换:普通 GET 模式、pathinfo、rewrite 和兼容模式
/ThinkPHP/Conf/convention.php
|
|
历史漏洞
SQL 注入
0x01 聚合查询功能count方法未过滤调用parseKey
利用条件
ThinkPHP[5.0.0,5.0.23],ThinkPHP 3 全版本
漏洞分析和原理
ThinkPHP3.2.3
漏洞 demo
|
|
poc
?field=id),updatexml(1,concat(1,user(),1),1)from+user%23
在这里打个断点,跟进
会进入到ThinkPHP/Library/Think/Model.class.php
中的__call
方法中,
因为是count
,所以进入到$this->getField()
方法
经过对传入字段进行解析等一系列操作之后,
进入到$this->db->select()
方法中
此时传入的$options
变成了
继续跟进,这里进入到了$this->buildSelectSql()
方法,来构建 select 语句
进入到$this->parseSql()
方法中
利用$this->parseField()
方法进行解析,继续跟进
这里的$this->parseKey()
对传入的 payload 并没有进行过滤
然后便回到$this->parseField()
方法中,返回构建的 field 语句
最终回到$this->parseSql()
方法中,返回最终需要执行的 sql 语句
最后得到了执行
0x02 _parseOptions未过滤$options导致 sql 注入
利用条件
ThinkPHP <= 3.2.3
漏洞原理和分析
$options
查询条件可以不经过数据处理直接进入_parseOptions
,再进入Driver.class.php
的sql操作函数,和上面一样通过buildSelectsql
方法或直接调用delete
方法进行拼接 sql 语句,然后再进行执行
漏洞 Demo
|
|
poc
id[comment]=\*/where 1 and updatexml(1,concat(0x7e,user(),0x7e),1)/\*
id[limit]=1,1+procdure+analyse(updatexml(1,concat(0x7e,user(),0x7e),1),1)--
id[field]=* from user where 1 and updatexml(1,concat(0x7e,user(),0x7e),1) --+
具体构造出多少个poc
,可以看pasexxx
有多少个