ThinkPHP3.1.3表达式注入
明确问题
exp表达式被正常解析,但是注入未成功
分析
传参形式
在完整版的3.1.3的框架中,配置正确或者采用I函数的情况下,应该是不存在表达式问题的
框架中已经存在了对表达式进行过滤的方法

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

通过全局配置

这个配置之后,通过$_POST等接受的参数,或者内置方法_param接受的参数都会被过滤掉
这里既然没有过滤,那么其接受参数形式,如下
$_POST['test']$this->_param('test')
与官网完整版的差异
测试中其实还有一个问题就是
在完整版本中,对in类型的表达式已经进行了完全匹配

但是在目标中,仅仅匹配到字符串中含有in,就可进入此逻辑
说明,他可能是更老一些3.1.3的版本
具体图先不放了
理论上讲,进入了每个分支后,就会进行每个分支的逻辑操作
二次开发者动这里代码的概率不大
调式
测试的payload
test[]=exp&test[]=aaatest[]=exp&test[]=aaa)#
环境搭建
和ThinkPHP5不一样的地方,不是所有的目录都已经创建了的
只有ThinkPHP框架目录
将ThinkPHP目录移动到网站根目录之后
新建一个index.php文件
1 |
|
访问网站后,会自动在网站目录生成Index文件夹,并生成了文件目录结构
配置config文件中的数据库信息

在./Index/Lib/Action/IndexAction.class.php写入如下代码
1 |
|
在数据库中创建test数据库,并添加users表,添加username和其他字段
随后,正常访问如下

模拟情况
当传入数组的时候

把表达式换成exp
发现这里,只是不再有查询结果,加括号和单引号都是返回的false

输出下目前的语句
可以注入,如下

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

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

payload
1 | test[0]=exp&test[1]=='a')) or sleep(1)# |
布尔盲注
根据实际情况决定












