thinkphp5.0.9预处理导致的sql注入复现与详细分析
复现
先搭建thinkphp5.0.9环境
配置下测试环境
然后访问
http://tptest.cc/index.php/index/index/getage?names[0,updatexml(0,concat(0xa,user()),0)]=1
复现成功
【点击获取学习资料】
渗透工具
技术文档、书籍
最新大厂面试题目及答案视频教程
应急响应笔记
学习思路构图等等
漏洞分析
先看看传进来了什么
是一个关联数组
跟进where
跟进parseWhereExp,看了一番,就是普通的对where参数解析
继续跟进select
Query的select函数从这里开始,构造的sql语句就出问题了
继续跟进builder->select -> parseWhere -> buildWhere -> parseWhereItem
在这里将关联数组的key拼接了上去
正常查询,传参names[]=li,构造出来的应该是这样
生成的预处理sql应该是这样,where_name_in_0会被替换为li
而恶意payload,生成的是
看一下最终生成的sql语句
调试发现,预处理发生了错误,但是报错注入成功,语句被执行了?预处理时执行了sql语句?
想调试下,但是这条语句,进不去,不能调试,,不知道什么原因,
$this->PDOStatement = $this->linkID->prepare($sql);
在网上看到了p神的文章
https://www.leavesongs.com/PENETRATION/thinkphp5-in-sqlinjection.html
就是说在PDO::ATTR_EMULATE_PREPARES => false模式下,预处理是假的,边替换边执行,这就可以解
释得通了
找一下不能子查询的原因
构造payload:
?names[0,updatexml(0,concat(0xa,(select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA
)),0)]=1
预处理没有报错
但在$result = $this->PDOStatement->bindValue($param, $val[0], $val[1]);
时报错
应该是PDO的预处理,不能解析这一长串
那就从param入手看一下,
param来自$bind
$bind来自上面遇到过的
想绕过就要让$bindKey变为where_name_in_0,,但是构造的sql语句不变,做不到,立刻放弃
令我疑惑的两个点
user()查询是在预处理时报错退出的,子查询是在绑定key-value时退出的
而且使用子查询,PDO是解析成功了的,在mysql日志看到如下
使用user()查询日志:
直接用sql语句查日志
为什么PDO调用user(),在mysql日志看不到记录
搞不懂
总结
thinkphp没有对输入过滤,直接做拼接
众所周知预处理不能处理in,order by这些动态的变量,所以审计的时候可以重点看一下
这个漏洞没什么用,不过可以当个练习了
造成这个漏洞的原因一是thinkphp没有对输入进行过滤,直接将输入拼接。二是由于PDO的特性,在预处理时把代码执行了
如何修复
看5.0.22,已经修复
select生成的语句没有我们构造的内容了
继续调试,bindkey后面不使用key拼接了,而是使用递增的i
这是5.0.9的
thinkphp5.0.9预处理导致的sql注入复现与详细分析相关推荐
- CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析
CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析 以下为SMDK开发板startup.s部分启动代码. ;------------------------------- ...
- php使用mysql预处理语句防止sql注入 简单讲解及代码实现
目录 前言 sql注入简单介绍 一个例子 使用预处理语句 简介 预处理语句的查询 预处理语句获取查询结果 总结 前言 最近在做一个小项目的后台,牵扯到登录等等需要操作数据库的地方,为了安全起见,特地来 ...
- 从0开始学SQL注入(超详细)
前言: 终于是吧cracer的渗透教程看完了, 也终于是有点时间来整理这些凌乱的笔记了, 关于SQL注入后面会陆续把写的笔记整理成文章,敬请期待! 有什么疑问可以评论也可以直接私信 杂谈: 送给萌新的 ...
- Discuz!7.2 SQL注入复现实验
0x01 实验准备 实验原理: Discuz7.2 SQL注入漏洞利用PHP特性突破GPC,形成SQL注入漏洞. 实验工具: UCenter+Discuz 7.2安装包 实验环境: 安装 Discuz ...
- mybaits的模糊查询_mybatis模糊查询防止SQL注入(很详细)
SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序 ...
- cacti graphs new.php,Cacti 0.8.8f graphs_new.php SQL注入漏洞
Cacti是一套网络流量监测图形分析工具.它有非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结 构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常 ...
- 本地复现Zabbix v2.2.x, 3.0.0-3.0.3 jsrpc 参数 profileIdx2 SQL 注入漏洞
靶场地址:http://192.168.253.131:8000/ poc打包后台上传 转载于:https://www.cnblogs.com/Expioit/p/9036725.html
- MySQL Sending data导致查询很慢的问题详细分析
这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...
- B站小迪安全笔记第12天-SQL注入之简要注入
前言: 在本系列课程学习中,SQL注入漏洞将是重点部分,其中 SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需 要按部就班的学习,才能学会相关 SQL注入的核心.同样此类漏洞 ...
最新文章
- 解决pycharm新建项目后按钮灰色问题
- 关于prototype使用位置问题的讨论
- 【java】Windows7 下环境变量设置
- Facebook的规模还在继续扩大
- 华为云发布“华为鲲鹏”培训认证体系,助力开发者“化鲲为鹏”
- 【转载】Eclipse快捷键 10个最有用的快捷键
- 通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明
- JavaScript 计算细节解惑
- tensorflow之add_n
- 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4...
- 嵌入式工程师需不需要学java_嵌入式开发工程师需要具备哪些素质和技能基础?...
- 计算机量子化学计算焓,本科毕业论文--量子化学计算的基本原理及应用.doc
- python微控制器编程从零开始 开发板_TPYBOARD单片机开发板PYTHON语言控制单片机
- 数据库可靠性/可用性、稳定性RTO/RPO
- 2019-成长的一年
- IP138 IP地址查询 php实例
- 微信公众号里面使用地图导航
- pandas添加一行数据的方法
- 软件企业税收优惠政策2022
- easyui datagrid-detailview 嵌套高度自适应
热门文章
- 成功解决ValueError: cannot convert float NaN to integer
- ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解
- Dataset之CamVid:CamVid数据集的简介、下载、使用方法之详细攻略
- DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
- BC之CM:区块链之共识机制——深入浅出以及国内外当下主流区块链平台共识机制纵向、横向比较相关配图
- 移动web——基本知识点总结
- 开源you-get项目爬虫,以及基于python+selenium的自动测试利器
- Log4j配置文件位置+Spring数据源配置文件位置
- JQuery选中的对象和非选中的其他对象分别执行不同动作
- 事务内容postgresql pgbench