复现

先搭建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注入复现与详细分析相关推荐

  1. CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析

    CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析   以下为SMDK开发板startup.s部分启动代码.   ;------------------------------- ...

  2. php使用mysql预处理语句防止sql注入 简单讲解及代码实现

    目录 前言 sql注入简单介绍 一个例子 使用预处理语句 简介 预处理语句的查询 预处理语句获取查询结果 总结 前言 最近在做一个小项目的后台,牵扯到登录等等需要操作数据库的地方,为了安全起见,特地来 ...

  3. 从0开始学SQL注入(超详细)

    前言: 终于是吧cracer的渗透教程看完了, 也终于是有点时间来整理这些凌乱的笔记了, 关于SQL注入后面会陆续把写的笔记整理成文章,敬请期待! 有什么疑问可以评论也可以直接私信 杂谈: 送给萌新的 ...

  4. Discuz!7.2 SQL注入复现实验

    0x01 实验准备 实验原理: Discuz7.2 SQL注入漏洞利用PHP特性突破GPC,形成SQL注入漏洞. 实验工具: UCenter+Discuz 7.2安装包 实验环境: 安装 Discuz ...

  5. mybaits的模糊查询_mybatis模糊查询防止SQL注入(很详细)

    SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序 ...

  6. cacti graphs new.php,Cacti 0.8.8f graphs_new.php SQL注入漏洞

    Cacti是一套网络流量监测图形分析工具.它有非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结 构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常 ...

  7. 本地复现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

  8. MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  9. B站小迪安全笔记第12天-SQL注入之简要注入

    前言: 在本系列课程学习中,SQL注入漏洞将是重点部分,其中 SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需 要按部就班的学习,才能学会相关 SQL注入的核心.同样此类漏洞 ...

最新文章

  1. 解决pycharm新建项目后按钮灰色问题
  2. 关于prototype使用位置问题的讨论
  3. 【java】Windows7 下环境变量设置
  4. Facebook的规模还在继续扩大
  5. 华为云发布“华为鲲鹏”培训认证体系,助力开发者“化鲲为鹏”
  6. 【转载】Eclipse快捷键 10个最有用的快捷键
  7. 通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明
  8. JavaScript 计算细节解惑
  9. tensorflow之add_n
  10. 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4...
  11. 嵌入式工程师需不需要学java_嵌入式开发工程师需要具备哪些素质和技能基础?...
  12. 计算机量子化学计算焓,本科毕业论文--量子化学计算的基本原理及应用.doc
  13. python微控制器编程从零开始 开发板_TPYBOARD单片机开发板PYTHON语言控制单片机
  14. 数据库可靠性/可用性、稳定性RTO/RPO
  15. 2019-成长的一年
  16. IP138 IP地址查询 php实例
  17. 微信公众号里面使用地图导航
  18. pandas添加一行数据的方法
  19. 软件企业税收优惠政策2022
  20. easyui datagrid-detailview 嵌套高度自适应

热门文章

  1. 成功解决ValueError: cannot convert float NaN to integer
  2. ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解
  3. Dataset之CamVid:CamVid数据集的简介、下载、使用方法之详细攻略
  4. DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
  5. BC之CM:区块链之共识机制——深入浅出以及国内外当下主流区块链平台共识机制纵向、横向比较相关配图
  6. 移动web——基本知识点总结
  7. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器
  8. Log4j配置文件位置+Spring数据源配置文件位置
  9. JQuery选中的对象和非选中的其他对象分别执行不同动作
  10. 事务内容postgresql pgbench