考点:
1、PHP的字符串解析特性
2、文件读取
3、WAF绕过
4、http请求走私
法1
查看源代码:提示有WAF
访问calc.php:发现可传一个参数num
尝试:
发现num为字母时报错,所以WAF可能是拦截num为字母的情况。所以我们要绕过WAF才能做我们想要的操作,而calc.php的黑名单限制了我们直接文件读取。
所以我们只要做两个操作:
1、过WAF
2、过黑名单
在做第一个操作时:要先了解PHP的字符串解析特性,(网上大佬的解释.)
php把URL参数转换为变量的过程中,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
所以我们可以这样写
calc.php?%20num=....
//在num前面加个空格这样在过WAF时,WAF接受到的是%20num 而%20num并不等于num,所以并不会触发WAF的规则,在过WAF后PHP再把URL参数转换为变量的过程中,会删除空白符,就变为num=...
做第二个操作,可以用chr(47)来代替’/’,然后构造payload:
calc.php?%20num=var_dump(scandir(chr(47)))
或
print_r(.....)
找到flag所在,读取/f1agg中的内容
calc.php?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103));
//file_get_contents() 把整个文件读入一个字符串中。
另一种payload.(注:<?='aa';?>等同于<?php echo 'aa';?>。)
法2
请求走私网上的解释:HTTP请求走私
我的理解是:前后端服务器不是同时接收请求,并且前后端对请求头结束
的位置理解不统一,形成请求走私
CL-CL式
前端发生错误,get请求完整发送到后端