原题来自i春秋 web02
对代码进行分析,我们需要进行两次绕过
1、第一次绕过if(!strcmp($elephant, $_POST['php_elephant']))
如果$elephant与$_POST['php_elephant']相等,则能够进入下一步,否则终止。绕过原理很简单。strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。所以我们确定要对变量php_elephant传参为数组即如下
2、此时我们需要进行第二次绕过,即绕过if(strpos($s,$blocklist)!==false)
$blocklist即为禁止的字符串'php_elephant',如果$s中含有'php_elephant'会终止脚本执行并输出'No Hacking!'
接下来我们要分析$s的来源,是有调用waf函数时$data进行的传参,而$data = file_get_contents('php://input');
这就需要我们对file_get_contents('php://input')
这个函数有所了解
file_get_contents("php://input")
是用于读取 PHP 接收到的原始请求体(request body)的内容,而不是请求头(request headers)。它通常用于获取 POST
请求中传递的原始数据,尤其是当 Content-Type
为 application/json
或 application/x-www-form-urlencoded
时。
php中 file_get_contents(‘php://input’)的用法及与 POST 的区别-CSDN博客
我们无法改变请求体中包含'php_elephant'这个字符串,即使我们之前将其转化为了数组,但是file_get_contents("php://input")
会强制将其转化为字符串即'php_elephant[]=1',其中还是包含被禁止的字符串,无法绕过
这就要求我们对file_get_contents("php://input")
的特性要有所掌握,只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。
file_get_contents(“php://input”)的用法 - 苍山雪洱海月 - 博客园
所以我们需要构造Coentent-Type为multipart/form-data的请求,在不改变php_elephant为数组的情况下让php://input读取不到数据做到第二次绕过