RCE篇之命令执行中的各种绕过
常见管道符
windows
1. “|”:直接执行后面的语句。
2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
linux
1. “;”:执行完前面的语句再执行后面的语句。
2. “|”:显示后面语句的执行结果。
3. “||”:当前面的语句执行出错时,执行后面的语句。
4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
空格过滤
${IFS}
payload1:
payload2:
重定向符<>
payload1:
payload2:
黑名单绕过
拼接
base64编码
payload1:
payload2:
单引号、双引号
反斜线
$1、$2等和$@
读文件绕过
当cat被过滤时,可以使用如下命令代替
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
通配符绕过
?字符代表单个字符
*字符代表任意数量的字符
[...]匹配方括号之中的任意一个字符
# 存在文件 a.txt 和 b.txt
$ ls [ab].txt
a.txt b.txt
$ ls *[ab].txt
ab.txt a.txt b.txt
内敛执行绕过
`命令`和$(命令)都是执行命令的方式
反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`
例题解析——BMZCTF 端午就该吃粽子
打开环境后,通过题目给的提示,访问login.php文件。访问这个文件发现只有一个链接,点击链接,跳转到show.php文件中。
发现一个登录框,这个登录框是用来迷惑我们的,我们注意到url中的zhongzi参数是可控的,所以猜测存在文件包含漏洞。通过f12查看源码发现一个index.php的提示,提示我们读取index.php文件。
payload:php://fileter/convert.base64-encode/resource=index.php
然后base64解码得出index.php的源码。
核心语句是shell_exec("ping -c 4 ".$ip);
相当于就是一个有过滤情况下的命令执行,那按照前面讲的方法绕过的方法就很多了,很多种方法都可以拿到flag,我们先ls
一下根目录,空格就用%09
代替:
可以看到flag就在根目录下,那我们看它的方法就很多了:
1||c""at%09/???? 1||c\a\t$IFS$9/???? 1||/bin/c??$IFS/???? 1||c""at%09$(find%09/%09-name%09f??g) 等等等等非常多种,可以随意组合实现cat /flag这条命令,然后就得到flag了