[BJDCTF2020]ZJCTF,不过如此(php双引号、伪协议、preg_replace)

[BJDCTF2020]ZJCTF,不过如此(php双引号、伪协议、preg_replace)

1.打开网站,审计,第一个if可以用php://input 或者 data://伪协议绕过,php伪协议分析可看php伪协议
在这里插入图片描述

2.然后往下,提示next.php文件,这里可以用php://filter伪协议拿到它的源码:
在这里插入图片描述
3.payload:

http://90812d78-a226-4cdf-be8f-8baa9961fb89.node3.buuoj.cn/?text=php://input&file=php://filter/convert.base64-encode/resource=next.php

post数据:I have a dream

在这里插入图片描述
4.解码,代码很简单,一个替换,一个遍历,一个代码执行:
在这里插入图片描述
5.这里看替换的时候,我脑子短路了下,正则里面/i 是忽略大小写,/e是什么鬼?查了一下发现没有,才想起来preg_replace的/e模式下有代码执行漏洞。

/e 修正符使 preg_replace() 将 replacement 参数(第二个参数,字符串)当作 PHP 代码执行。

but这里的第二个参数是固定了的,怎么利用?

6.第二个参数既然写成这么特殊的样子,应该是有作用的,查资料发现,\1表示取出正则匹配后的第一个子匹配中的第一项,(这里其实就是thinkphp2.x、3.0-3.1版本的rce漏洞      快速跳转

看例子:第一次匹配是['1,‘2’],第二次是[‘3’,‘a’],第三次是[‘b’,‘c’],然后下面输出的分别是1,3,b,都是每次匹配的第一项。
在这里插入图片描述

7.那么我们就要保证第一个匹配是我们想要执行的东西,那我就传进去phpinfo(),正则我可以填 .* 或者 \S+(大写S,小写s是匹配空白符),因为php里会把参数名里的特殊字符转为下划线“_”,那么我们就可以用第二种,+号在url中的时候记得编码为%2b,不然会认为是空格。
在这里插入图片描述
带进题目中就是这样:
在这里插入图片描述
我们传

next.php?\S%2b=phpinfo()

发现还是不能执行,这是为啥?
在这里插入图片描述

我在自己环境下面尝试了一遍:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那应该是strtolower函数的原因了,原因不明= =。

8.然后还是要看WP啊,用到的性质1:

在php中,双引号里面如果包含有变量,php解释器会进行解析;单引号中的变量不会被处理。

举例子就是这样子:
在这里插入图片描述

9.用到的特性2:

就是我们变量覆盖漏洞中常见的可变变量,官方解释:官方解释
,因为要避免歧义,除了$$a这样子,还可以${$a}这样子。
在这里插入图片描述

10.我们本地测试一下:(又学到一条审计小技巧)
在这里插入图片描述
在这里插入图片描述

我们可以看到,\1就是被双引号包围起来的,我们传:

/next.php?\S%2b=${phpinfo()}

在这里插入图片描述
发现也可以直接执行eval命令:
在这里插入图片描述

11.尝试直接拿flag,好吧好吧,我觉得这里是因为单双引号冲突了:
在这里插入图片描述
我在本地测试(先在php.ini里面修改disable_function,把system删掉,记得重启一下),发现是可以的,那肯定就是单双引号冲突了:
在这里插入图片描述
在这里插入图片描述
12.正常点
调用getFlag函数并传参:

\S%2b=${getFlag()}&cmd=system('ls /');

在这里插入图片描述
发现flag,直接cat:

\S%2b=${getFlag()}&cmd=system('cat /flag');

在这里插入图片描述

总结:我并不是赛棍,但是觉得做CTF总能学到新知识,说不好审计的时候,就发现哪个开发用了呢?这次在自己本地测试时间用的比较多,不过很多地方也是弄的比较清楚了,每次都要做好几个小时= =。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值