【strpos、strcmp绕过】基于file_get_contents(‘php://input‘)特性的代码审计题

原题来自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-Typeapplication/jsonapplication/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读取不到数据做到第二次绕过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值