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表示把第二个参数当成表达式,可以执行。具体可以看这篇文章讲的不错

https://blog.csdn.net/windqyoung/article/details/8635418

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

 

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

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

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

 

posted @   p0n9  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示