文章目录

  • SQL查询流程
  • TP 5.0.9 SQL注入
    • 修复

SQL查询流程

TP5手册:https://www.kancloud.cn/manual/thinkphp5/118044

在分析 tp5 漏洞之前,先来看一看 tp5 在查询时的流程,与 tp3 有什么异同,写一个控制器

<?php
namespace app\index\controller;class Index
{public function index(){$name = Input("name/d");$data = db("test")->where("name",$name)->find();dump($data);}
}

tp5 输入输入使用 Input 函数,代替 tp3 中使用的 I 函数,Input 函数有一个功能可以使用变量修饰符对输入数据进行转换

ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:

修饰符 作用
s 强制转换为字符串类型
d 强制转换为整型类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类型

接下来看看 Sql 查询分析,tp5 使用了 pdo 预编译,基本流程如下,有效防止 SQL 注入

  1. prepare($SQL) 编译 SQL 语句
  2. bindValue(param,param,param,value) 将 value 绑定在 param 的位置上
  3. execute 执行

find 函数中有整个 pdo 查询流程

生成查询 SQL

获取参数绑定

执行查询

TP 5.0.9 SQL注入

5.0.9 及以下版本如果开启了 debug 都存在这个漏洞,危害较低,不能子查询,只能泄露一些信息,如 user()、database() 等

控制器

class Index
{public function index(){$name = Input("name/a");$data = db("test")->where("name","in",$name)->select();dump($data);}
}

payload

?name[0,updatexml(0,concat(0xa,database()),0),0]

database 同时还会泄露数据库配置信息

基础的调试流程

where() -> select -> parseWhere() -> buildWhere()

这里直接进入 buildWhere()

if 都不进入,到最后

进入 parseWhereItem()直接看重点

因为 $exp 是 in,满足条件进入 if,foreach 遍历拼接 $bindKey

$bindKey = $bindName . '_in_' . $k;
$bindKey = where_name_in_0,updatexml(0,concat(0xa,database()),0),0

最终 return wherestr

$whereStr = `name` IN (:where_name_in_0,updatexml(0,concat(0xa,database()),0),0)

完整的 sql 语句

:where_id_in_的后面,直接拼接传入的 id 的键,并没有进行过滤,可以造成 SQL 注入

主要问题是 tp5 使用了 pdo,正常来说不会出现注入,但是这里缺可以报错注入,而且正常 pdo 执行流程为三步(上边介绍了),但是这里在 prepare 截断就执行了 SQL 查询

原因如下:

PDO::ATTR_EMULATE_PREPARES  => false

这个选项涉及到 PDO 的“预处理”机制:

因为不是所有数据库驱动都支持 SQL 预编译,所以 PDO 存在“模拟预处理机制”。如果说开启了模拟预处理,那么 PDO 内部会模拟参数绑定的过程,SQL语句是在最后 execute() 的时候才发送给数据库执行

如果关闭即为 false 的话,PDO不会模拟预处理,参数化绑定的整个过程都是和Mysql交互进行的

非模拟预处理的情况下,参数化绑定过程分两步:

  1. 第一步是 prepare 阶段,发送带有占位符的 sql 语句到 mysql 服务器(parsing->resolution)
  2. 第二步是多次发送占位符参数给 mysql 服务器进行执行(多次执行optimization->execution)

但是,如果你将user()改成一个子查询语句,那么结果又会爆出Invalid parameter number: parameter was not defined的错误。因为没有过多研究,说一下我猜测:预编译的确是mysql服务端进行的,但是预编译的过程是不接触数据的 ,也就是说不会从表中将真实数据取出来,所以使用子查询的情况下不会触发报错;虽然预编译的过程不接触数据,但类似user()这样的数据库函数的值还是将会编译进SQL语句,所以这里执行并爆了出来

修复

在 tp5 新版本中,改成对值得处理,而且拼接用得时$i这个计数,最后拼接得预处理也只能是:where_id_in_1,:where_id_in_1这样的了


TP5 框架 SQL 执行流程分析及 5.0.9 SQL 注入漏洞分析相关推荐

  1. mybatis mysql 调用存储过程 多个返回值_图解MyBatis的SQL执行流程(干货)

    前言 MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1.Mapper接口和映射文件是如何进行绑定的 2.MyB ...

  2. beeline执行sql文件_MyBatis的SQL执行流程不清楚?看完这一篇就够了

    前言 MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1.Mapper接口和映射文件是如何进行绑定的 2.MyB ...

  3. mybatis mysql 调用存储过程 多个返回值_MyBatis的SQL执行流程不清楚?很简单!

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者:双子孤狼- blog.csdn.net/zwx900102/article/details/108455514 ...

  4. MySQL系列---架构与SQL执行流程详解

    文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...

  5. 追源索骥:透过源码看懂Flink核心框架的执行流程

    https://www.cnblogs.com/bethunebtj/p/9168274.html 追源索骥:透过源码看懂Flink核心框架的执行流程 前言 1.从 Hello,World WordC ...

  6. 【Flink】 Flink 源码之 SQL 执行流程

    1.概述 转载:Flink 源码之 SQL 执行流程 2.前言 本篇为大家带来Flink执行SQL流程的分析.它的执行步骤概括起来包含: 解析.使用Calcite的解析器,解析SQL为语法树(SqlN ...

  7. 追源索骥:透过源码看懂Flink核心框架的执行流程--来自GitHub

    追源索骥:透过源码看懂Flink核心框架的执行流程 联系qq2499496272可进行删除,需要文件版本的私聊!!~ 文章目录 追源索骥:透过源码看懂Flink核心框架的执行流程 前言 1.从 ~~H ...

  8. MyBatis(12) 源码解析之SQL执行流程

    一.前言 资料 mybatis文档:https://mybatis.org/mybatis-3/index.html mybatis源码:https://github.com/mybatis/myba ...

  9. Mysql复习计划(一)- 字符集、文件系统和SQL执行流程

    Mysql复习计划(一)- 字符集.文件系统和SQL执行流程 前言 一. Mysql字符集 1.1 Mysql5.7和8.0的默认字符集 1.1.1 修改默认的字符集 1.1.2 修改已有库表的字符集 ...

  10. 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...

    刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...

最新文章

  1. 在HYPER-V中利用差异磁盘和SYSPREP技术安装多个WINDOWS 2008
  2. CrazyDiskInfo硬盘检测工具 安装记录
  3. swoole redis mysql_教你使用swoole监听redis数据
  4. java- WatchService监控
  5. 【SGU】SGU每日练1·Little shop of flowers【DP】
  6. selenium+linux+python,Linux下Python+selenium自动化环境搭建
  7. 接受字符串参数,返回一个元组,并分别统计字符串中大小写的个数
  8. 关于私募基金高水位业绩报酬计提的N种方式!
  9. 模电——二级管的限幅与稳压
  10. C语言常见的陷阱与缺陷
  11. Excel如何一次性将多行多列表格颠倒行顺序
  12. 人民网app搜索案例
  13. dcn网络与公网_DCN网
  14. RFID固定资产管理系统全生命周期管理办公资产
  15. 详解FindBugs的各项检测器
  16. win10matlab2016启动卡,教你解决win10专业版开机卡死的方法
  17. macos 切换账户_如何在macOS上设置访客用户帐户
  18. mac os linux pageup pagedown,教你巧用Mac上的Page UpDown键
  19. 未配置appkey或配置错误---uni-app
  20. Leetcode_49_Anagrams

热门文章

  1. 前端实现的一组印章在线设计生成工具集,支持高清镂空的印章图片生成下载
  2. java计算机毕业设计在线招投标系统源码+系统+mysql数据库+lw文档
  3. xware for linux,Linux版迅雷(Xware)安装配置方法
  4. java笔记(第一部分语法基础)
  5. 派森小镇(三)被抛弃的·小列表
  6. stata:时间变量格式转换
  7. AUTOCAD学习笔记6:单相桥式整流电路的绘制
  8. 程序员求职之道(《程序员面试笔试宝典》)之自己的强项或是研究方向与中意的工作岗位不一致怎么办?...
  9. 解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
  10. 示波器的存储深度设置多大好