php参数名解析特性
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1)删除空白符
2)将某些字符转换为下划线(包括空格)
来看一张图
当PHP版本小于8
时,如果参数中出现多次中括号[
,只有第一个中括号会被转换成下划线_
,其他的不变
当PHP版本等于8
时,传入的参数名中非法字符一律全部转换为了下划线
来看看例题,[RoarCTF 2019]Easy Calc
访问/calc.php
,得到源码
当num传递的为字母时,被waf拦截(另一个waf,不是上面PHP文件设置的黑名单)
这里就可以用到字符串解析特性了,对于这种get参数非常好用,在num
前面加上空格
或者+号
,再测试一下就可以了
由于对'
单引号过滤,可以使用chr()
函数绕过
这里尝试使用 system('ls')
获取目录时失败
用print_r(scandir(‘/‘))calc.php?%20num=print_r(scandir(chr(47)))
payload:calc.php?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
查看目录的PHP语句如下:
1 | system('ls'); |
读取文件内容的PHP语句将上面的函数改为file_get_contents()
当对引号进行过滤时,可以使用chr()
拼接的方式进行过滤
- Title: php参数名解析特性
- Author: Saofe1a
- Created at : 2024-10-13 11:04:27
- Updated at : 2024-10-13 11:07:04
- Link: https://saofeia.github.io/2024/10/13/php参数名解析特性/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments