首页 > 技术文章 > RCE篇之命令执行中的各种绕过

pursue-security 2021-09-15 23:29 原文

常见管道符

windows

1. “|”:直接执行后面的语句。

2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。

3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。

4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

 linux

1. “;”:执行完前面的语句再执行后面的语句。

2. “|”:显示后面语句的执行结果。

3. “||”:当前面的语句执行出错时,执行后面的语句。

4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。

5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

空格过滤

${IFS}

payload1:

payload2:

payload3:

重定向符<>

payload1:

payload2:

%09(需要PHP环境)

 

黑名单绕过

拼接

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了

推荐阅读