thinkphp5之sql注入漏洞-builder处漏洞

目录

适用版本

环境搭建

文件下载安装

配置文件修改

漏洞分析


适用版本

注:thinkphp版本:5.0.13<=ThinkPHP<=5.0.155.1.0<=ThinkPHP<=5.1.5

环境搭建

文件下载安装

在github上面下载相应版本,下载think文件,下载framework文件,然后将framework文件修改名字为thinkphp,然后将修改后的framework放在think文件下,然后将think放在网站目录下

配置文件修改

修改数据库连接文件,这里需要提前创建一个数据库文件

修改你的控制器

复制代码
$username = request()->get('username/a');

这里是接收一个get传参,然后username/a的意思是有username传参username的值就是传参的值没有的话就是默认是a

复制代码
  db('users')->insert(['username'=>$username]);

这里就是将你输入的值传道数据库里

漏洞分析

漏洞我们可以在framework中的5.0.16版本去看,因为后面的版本肯定是把前面的版本bug修复了。所以可以从里面看到bug是什么样子,看一下5.0.16官方更新了什么东西,到底是把什么修复了。

来看一下啊它的更新提交,然后看看有啥子漏洞

在builder中会有一个修改的地方

下面我们来追一下这个代码,首先输入注入语句

复制代码
http://127.0.0.1:9999/thinkphp/think-5.0.15/public/index.php?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1

这个需要开启调试模式,注入成功,将user回显了过来

在这里下断,看他一步步执行步骤

首先username的值为0="inc",1="updatexml(1,concat(0x7,user(),0x7e),1)",2="1"

将断点打在插入语句

看一下他的insert这个函数,数据传输是自己写的值

然后下一步追到builder上,即上面的 $this->builder->insert() 最终调用的是 Builder 类的 insert 方法。 然后调用 parseData 方法来分析并处理数据

然后咱来看一下parseData的方法,下图代码

这个代码中上面第一个红框将data数组中遍历,然后val中就是data的值,然后看第二个红框三个不同的参数对应不同的处理方式,这三个处理方式都可以进行注入,但是insert方法中会对exp进行过滤如果数据中存在 exp ,则会被替换成 exp空格,所以三种处理方式中选项等于exp的无法使用

然后经过parseData处理的数据返回到Builder中的insert,然后下面的sql中的str_replace中的第一个数组被第二个数组中的值进行替换

上图代码中第二个数组的意思

php 复制代码
$sql = str_replace(
    ['%INSERT%', '%TABLE%', '%FIELD%', '%DATA%', '%COMMENT%'],
    [
        $replace ? 'REPLACE' : 'INSERT',
        $this->parseTable($options['table'], $options),
        implode(' , ', $fields),
        implode(' , ', $values),
        $this->parseComment($options['comment']),
    ], $this->insertSql);
php 复制代码
$replace ? 'REPLACE' : 'INSERT'

replace有值就是INSERT没值就默认是REPLACE

php 复制代码
 $this->parseTable($options['table'], $options)

option中table是users

php 复制代码
implode(' , ', $fields)
implode(' , ', $values)

将数组转换为字符串,fileds是username、values就是你写的报错语句

php 复制代码
  $this->parseComment($options['comment'])

数据库建表的时候允许你建一个注释comment就是这个注释,这个注释没有的话就为空然后就插入到数据库中,引起报错注入

回来以后数组的值经过替换后变成如下代码

相关推荐
能不能别报错6 分钟前
K8s学习笔记(二十二) 网络组件 Flannel与Calico
笔记·学习·kubernetes
老邓计算机毕设41 分钟前
SSM基于的少儿编程学习系统2lsiy(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
学习·ssm 框架·少儿编程学习系统·功能模块设计
阿民不加班1 小时前
【React】打卡笔记,入门学习01:点击事件
笔记·学习·react.js
小苏兮1 小时前
【数据结构】二叉搜索树
开发语言·数据结构·c++·学习·1024程序员节
hrrrrb1 小时前
【机器学习】监督学习
人工智能·学习·机器学习
做一道光1 小时前
2、SVPWM原理及实现学习笔记
笔记·学习·嵌入式·电机控制
繁花与尘埃2 小时前
CSS简介(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
css·笔记·学习
光影少年2 小时前
前端线上出现白屏如何排查问题所在,利用第三方的工具都有哪些
前端·学习·web安全·前端框架
m0_748240252 小时前
C++仿Muduo库Server服务器模块实现 基于Reactor模式的高性
服务器·c++·php
笨鸟笃行3 小时前
百日挑战-单词篇(第五天)
学习