thinkphp5.0.13SQL注入

311 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第十七天,点击查看活动详情

准备

centos php5.4.0 thinkphp 5.0.13 phpstorm

安装源文件

通过composer直接安装

composer create-project --prefer-dist topthink/think=5.0.15 tpdemo

image.png 安装时有出现报错信息,原因为镜像地址问题,无法找到框架包,切换下composer镜像地址即可成功安装

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

更改tpdemo里面的composer.json的内容,将require修改下:

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

更改后执行composer update,在index.php下面添加以下代码:

public function sqli() {
// 从GET数组方式获取用户信息
$user = input('get.username/a');
// 实例化数据库类并且调用insert方法进行数据库插入操作
db('users')->where(['id' =>1])->insert(['username' => $user]);
  }

新建数据库

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

开始调试

首先放上payload: http://localhost/tpdemo/public/index.php/index/index/sqli?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1** image.png 这里放上mochazz师傅文章里的流程图 image.png 首先查看报错的信息: image.png 6-11条主要是tp的初始化部分,重点在1-5,首先第五行是我们的sqli方法

  public function sqli() {
// 从GET数组方式获取用户信息
$user = input('get.username/a');
// 实例化数据库类并且调用insert方法进行数据库插入操作
db('users')->where(['id' =>1])->insert(['username' => $user]);
  }

input这里不做具体分析,主要看insert这里,跟组函数来到insert方法,第一步这里可以看到data的值,也就是我们传入的内容 image.png 下一步进入parseExpress方法,该方法的功能是分析表达式,其他的值对我们的不是很重要,看下经过分析后的option的值这里的重点就是下一步就会用到的data,也就是$option['data'] image.png 下一步是array_merge(),该函数为数组合并函数,可以将多个数组合并为一个数组,合并后的data值仍然是我们之前传入的 image.png 接下来调用builder的insert方法,也就是关键部分 image.png 跟下来一步步调试,首先进入的parseData方法,这里对data内容进行处理,产生漏洞的关键点也就是在这里 在方法里面对data的val进行遍历并赋值给key,经过遍历,我们的val值为Inc,接下来的代码意思是如果val为exp、inc、dec的话就走parseKey方法将SQL语句拼接起来 image.png 经过parseKey方法后,key的值为: image.png 接下来看这段代码,如果是标量数据的话就会进入这段,从而进行预处理,php里面的标量类型数据有四种,分别是int、float、bool、string,而我们传入的内容为数组,进入inc之后就会break跳出,也就不会进入这个预处理的地方 image.png 至此parseData方法结束 image.png 接下来的就是正则替换函数,我们继续往下跟 image.png 之后我们的SQL语句是这样的 image.png

接下来就是执行语句啦

参考文章:

github.com/Mochazz/Thi…