ZJCTF不过如此 题解

打开页面,看到代码跟之前做过的一道题差不多。file_get_contents()函数以及GET方法参数配合。代码中使用file_get_contents()函数判断的话可以直接使用php伪协议中的php://input,可以直接接收post方法传过来的值。注意的是需要将GET方法换成POST方法。

这里使用php伪协议读取next.php文件内容,base64解码后内容如下

做的时候一直盯着前面两行代码,后面才发现只是一个幌子。

这段代码可以一眼看到getFlag()函数中的eval方法,存在命令执行漏洞。只需将我们需要执行的代码system('ls');赋值给cmd参数即可。

那么问题来了,如何调用getFlag()函数?首先我们看看complex()函数的功能,看上去是正则替换。preg_replace($pattern,$replacement,$subject)函数,

在$subject中查找$parrten并替换成$replacement。我们需要了解代码中参数1的含义。将字符串'/('拼接到$re参数前面,字符串')/ei'拼接到$re后面。()表示匹配子表达式,/i表示匹配时不区分大小写,/e表示把第二个参数当成表达式,可以执行。具体可以看这篇文章讲的不错

PHP正则表达式e模式_风兮清扬的博客-CSDN博客

\\1表示匹配表达式的内容,第一个\表示转义。漏洞就在/e这个匹配模式。php中变量在双引号会被解析,单引号不会。(函数不会被解析)

利用{${phpinfo()}}的方式就可以执行对应函数。所以想要调用getFlag()函数可以是{${getFlag()}}。那么参数1就是GET方法的参数,第三个参数就是该参数的值。可以试试参数为.*,表示匹配除了\n之外的字符,并且匹配0次或多次。这样就可以匹配到

 {${getFlag()}},于是可以调用。但是这里有个问题,如果GET方法传过来的参数存在非法字符,就会将其替换成'_'。在这里'.'是非法字符,所以传过来就会将参数替换成_*。因此我们需要通过\S来绕过,\S匹配的是非空字符。所以参数可以使\S*,这样也能匹配到参数3。所以payload

?\S*={${getFlag()}}&cmd=system('cat flag');

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值