(超级有用)ThinkPHP 5漏洞分析之SQL注入
本次漏洞存在于 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注入相关推荐
- Web网络安全漏洞分析,SQL注入原理详解
本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...
- 【web安全】SQL注入漏洞1--寻找SQL注入
引言 我们在做web应用的时候,经常会根据前台的请求,到后台查询数据.由于前台用户输入的请求是不可信任的, 我们在代码里,如果直接将前台传过来的数据拼接到sql语句中,那么用户就可以构造非法的SQL语 ...
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
SQL注入攻击 基础知识 常见注释符号 使用示例 pikachu 漏洞联系平台 -- SQL注入 SQL注入攻击流程 注入点类型 数字型注入(POST) 字符型注入(GET) 搜索型注入 XX型注入 ...
- 漏洞系列之——SQL注入
了解SQL注入 漏洞描述 漏洞等级 漏洞危害 漏洞检测方法 漏洞利用方法 漏洞修复方案 SQL注入靶场环境可以参考"热门靶场怕坑练习"的sqli-labs 漏洞描述 SQL注入是网 ...
- php网站漏洞检测对sql注入漏洞防护
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
- php sql漏洞修复,php sql注入漏洞与修复
出于安全考虑,需要过滤从页面传递过来的字符. 通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等. 轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) ...
- 漏洞篇(SQL注入一)
目录 一.sql 注入概述 1.SQL 注入原理 2.SQL 注入的分类 二.部署 sqli-labs 学习环境 1.SQLI-LABS 简介 2.部署 SQLI-LABS 实验环境 三.SQLI-L ...
- php网站漏洞检测对sql注入漏洞防护 1
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
- web漏洞开始,sql注入
第十一天,web漏洞必懂知识点 这个图里面,右边的漏洞比左边的漏洞相对重要,因为在实战过程中,左边所产生的漏洞就比较少,我们学习网络安全呢就要做到他们的这些原理和危害. 比如sql注入漏洞是网站数据库 ...
最新文章
- 题目1444:More is better
- 2020年企业业务营收同比增长23.0%,华为的数字化转型实践之道
- android绘制环形进度_android 圆环进度view
- SAP Spartacus的defaultUrlMatcher
- 1074. Reversing Linked List (25)
- P1855 榨取kkksc03
- Java FileInputStream
- 简单完整的Python小爬虫教程
- 将ASM里面的文件copy到文件系统
- 「AutoML」AutoML专栏上线,跟Google一起见证调参党的末日?
- 如何写一个简单的时钟表盘(qt)
- windows系统文件简述
- 后端工作中遇到的问题总结(一)
- 控件的颜色设置(本景色,文本色,文本背景色)
- 3dmax中的UVW 贴图修改器详解(史上最全)
- hdf5 matlab,hdf5格式的matlab读写操作
- transition、trasform和translate
- 说说java中extends与implements的区别
- Python函数及练习题
- 系统波折之uxtheme