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');
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具