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[]=aaa
test[]=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)# |
布尔盲注
根据实际情况决定