本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: 5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 。

环境搭建

$ composer create-project --prefer-dist topthink/think=5.0.15 v5.0.15

安装后,因为默认 framework 版本为 5.0.24 ,所以将 composer.json 文件的 require 字段设置成如下:

"require": {"php": ">=5.4.0","topthink/framework": "5.0.15"
}

然后执行 composer update 将 framework 版本更新至 5.0.15 。进入 /application/index/controller/Index.php 修改代码如下:

<?php
namespace app\index\controller;class Index
{public function index(){$username = request()->get('username/a');db('users')->insert(['username' => $username]);return 'Update success';}
}

接着本地创建数据库:

create database tpdemo;
use tpdemo;
create table users(id int primary key auto_increment,username varchar(50) not null
);

进入 /application/database.php 配置本地数据库后,在 /application/config.php 中开启 app_debug 和 app_trace

// 应用调试模式
'app_debug'              => true,
// 应用Trace
'app_trace'              => true,

漏洞复现

http://127.0.0.1:8000/?username[0]=inc&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1
  • 1.

漏洞分析

首先跟进第一句: $username = request()->get(‘username/a’);

通过 Request::get 方法获取 GET 传入的数据,然后调用 Request::input 方法获取 $data 数据,其中通过 array_walk_recursive 对 $data 数组中的每一个元素,都调用了 Request::filterValue 方法进行 过滤处理

当检测到字段中有如下关键字时,将会在字段末尾增加一个空格:

EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN

而我们 payload 显然是不含有这些关键字的,所以这些过滤处理并没有造成影响

接着跟进第二句,也就是数据库操作语句www.meimeitu8.com: db(‘users’)->insert([‘username’ => $username]);

首先通过 helper.php 调用 Db::connect 方法。该方法中调用 self::prarseConfig 获取数据库配置信息参数 $options 后,接着实例化 \think\db\connector\Mysql 类并返回该类的实例化对象 self::$instance[$name]

接着 helper.php 中调用 Mysql::name($name) 方法,传入的参数 $name 为表名 users

因为 Mysql 类中没有 name 方法,所以调用了其父类 \think\db\Connection 类的 __call 魔术方法, __call 方法通过 getQuery 方法返回 \think\db\Query 类对象,再通过 call_user_func_array 调用 Query::name 方法。 Query::name 方法返回一个 Query 类对象

以上是 db(‘users’) 部分处理,即初始化数据库配置信息www.rsxedu.com。返回 \think\db\Query 对象。接着执行 db(‘users’)->insert([‘username’ => $username]); 。即调用 Query::insert 方法

Query::insert方法中,通过 parseExpress 方法获取配置信息后,再调用 $this->builder->insert 方法来生成 $sql 语句,此处 $this->builder 为 \think\db\builder\Mysql 类对象。最后再调用 execute 来执行生成的sql语句

所以我们最后跟进 $this->builder->insert 方法,来看看是如何生成sql语句的

因为 Mysql 类继承于 Builder 类,所以最终是调用 Builder::insert 方法。该方法首先调用 parseData 方法来处理我们传入的数据,进入 switch 语句的判断,当 $val[0] 为 inc 时,调用 parseKey 方法对 $val[1] 参数,即我们的 注入payload 的存储位置进行处理,而跟进 parseKey 方法。会发现该方法只是用来解析数据,并没有对数据进行 过滤检测处理 。所以直接返回了原本的 $val[1] 然后拼接上 ‘+’ . floatval($val[2]) 。组成了参数 $result 返回给 insert 方法中的 $data 。之后就是生成 insert 语句: INSERT INTO `users` (`username`) VALUES (updatexml(1,concat(0x7e,user(),0x7e),1)+0) 。最后执行触发 报错注入 。

(超级有用)ThinkPHP 5漏洞分析之SQL注入相关推荐

  1. Web网络安全漏洞分析,SQL注入原理详解

    本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...

  2. 【web安全】SQL注入漏洞1--寻找SQL注入

    引言 我们在做web应用的时候,经常会根据前台的请求,到后台查询数据.由于前台用户输入的请求是不可信任的, 我们在代码里,如果直接将前台传过来的数据拼接到sql语句中,那么用户就可以构造非法的SQL语 ...

  3. 基于pikachu漏洞平台的 --SQL注入攻击学习与总结

    SQL注入攻击 基础知识 常见注释符号 使用示例 pikachu 漏洞联系平台 -- SQL注入 SQL注入攻击流程 注入点类型 数字型注入(POST) 字符型注入(GET) 搜索型注入 XX型注入 ...

  4. 漏洞系列之——SQL注入

    了解SQL注入 漏洞描述 漏洞等级 漏洞危害 漏洞检测方法 漏洞利用方法 漏洞修复方案 SQL注入靶场环境可以参考"热门靶场怕坑练习"的sqli-labs 漏洞描述 SQL注入是网 ...

  5. php网站漏洞检测对sql注入漏洞防护

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  6. php sql漏洞修复,php sql注入漏洞与修复

    出于安全考虑,需要过滤从页面传递过来的字符. 通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等. 轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) ...

  7. 漏洞篇(SQL注入一)

    目录 一.sql 注入概述 1.SQL 注入原理 2.SQL 注入的分类 二.部署 sqli-labs 学习环境 1.SQLI-LABS 简介 2.部署 SQLI-LABS 实验环境 三.SQLI-L ...

  8. php网站漏洞检测对sql注入漏洞防护 1

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  9. web漏洞开始,sql注入

    第十一天,web漏洞必懂知识点 这个图里面,右边的漏洞比左边的漏洞相对重要,因为在实战过程中,左边所产生的漏洞就比较少,我们学习网络安全呢就要做到他们的这些原理和危害. 比如sql注入漏洞是网站数据库 ...

最新文章

  1. 题目1444:More is better
  2. 2020年企业业务营收同比增长23.0%,华为的数字化转型实践之道
  3. android绘制环形进度_android 圆环进度view
  4. SAP Spartacus的defaultUrlMatcher
  5. 1074. Reversing Linked List (25)
  6. P1855 榨取kkksc03
  7. Java FileInputStream
  8. 简单完整的Python小爬虫教程
  9. 将ASM里面的文件copy到文件系统
  10. 「AutoML」AutoML专栏上线,跟Google一起见证调参党的末日?
  11. 如何写一个简单的时钟表盘(qt)
  12. windows系统文件简述
  13. 后端工作中遇到的问题总结(一)
  14. 控件的颜色设置(本景色,文本色,文本背景色)
  15. 3dmax中的UVW 贴图修改器详解(史上最全)
  16. hdf5 matlab,hdf5格式的matlab读写操作
  17. transition、trasform和translate
  18. 说说java中extends与implements的区别
  19. Python函数及练习题
  20. 系统波折之uxtheme

热门文章

  1. 在线教育平台的数据分析——用户精细化运营
  2. 综合设计一个OPPE主页--页面的搜素欧珀部分的样式
  3. Android 使用摄像头和相册
  4. HTML笔记整理2 -- HTML标签
  5. 打破医院“围墙”,百度健康是如何做到的?
  6. 种群优化算法:灰狼优化器
  7. 人人API 分享到人人功能 修改版
  8. YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统
  9. 多重共线性诊断及处理
  10. 电脑桌面下栏和计算机里面全黑,电脑Win7系统开机后背景是黑色没有任务栏也没有显示桌面...