目录
1.Command Injection 命令注入
命令注入(Command Injection)漏洞也称为远程命令/代码执行漏洞(RCE,Remote Command/Code Exec),指应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数能被用户控制,就可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,属于高危漏洞之一。命令注入是滥用应用web应用程序的行为从而实现在操作系统上执行命令,在执行命令时将获得与操作系统上应用程序相同的权限。例如,在以user1的用户身份运行的Web服务器上执行命令注入,将在对应的操作系统用户user1权限下执行命令,从而获得用户user1所拥有的系统权限。
在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。比如PHP中的eval()函数,可以将函数中的参数当做PHP代码来执行,如果这些函数的参数控制不严格,可能会被利用,造成任意代码执行。
例如,使用ping命令测试IP,正常输入一个IP或者域名会返回一个正常的返回结果。当输入恶意构造的语句www.baidu.com && netstat -an,会把后面的语句也给执行了。
2.漏洞场景
通常使用用户输入的数据来填充系统命令的应用程序可能存在命令注入漏洞,大多数存在于可被攻击者修改的缺少输入验证的地方(forms, cookies, HTTP headers etc.)。不用操作系统使用的注入语法、命令不一样。命令注入漏洞可以通过以下两种方式进行检测:盲注类型的命令注入(无回显)、详细的命令注入(有回显)。
Blind(盲注类型,无回显)类型的命令注入,在测试payload时应用程序并没有直接输出结果,必须设法调查应用程序的行为以确定你的payload是否成功执行。
盲注类型的命令注入在发生命令注入攻击时,并没有可见的输出显示,不会立即引起注意。对于这种类型的命令注入,我们需要使用会导致一些时间延迟的payload;例如,ping和sleep命令。以ping命令为例,根据你指定的ping次数,应用程序将挂起x秒。另一种检测盲注类型命令注入的方法是强制输出一些结果,这可以通过使用诸如>之类的重定向运算符来完成。例如,可以告诉Web应用程序执行诸如 whoami 之类的命令并将其重定向到一个新建文件中;然后我们可以使用诸如cat之类的命令来读取这个新创建的文件的内容。测试命令注入通常很复杂,可能需要经过多次尝试,尤其是Linux和Windows两种操作系统所使用的命令语法还存在不同之处。
Verbose(详细类型,有回显)类型的命令注入,详细类型的命令注入是指应用程序会向我们提供有关正在发生或正在执行的payload的反馈或输出。检测此种类型的命令注入通常可以用很简单的方法,例如,包含ping或whoami等命令的payload的执行结果会直接显示在 Web应用程序的页面上。在测试payload时能够从应用程序获得直接反馈。
挖掘命令注入漏洞主要是寻找绕过应用程序输入过滤规则方法,设法使得应用程序执行攻击者想要执行的命令。
在命令注入中通常需要注入多条命令,多条命令一次执行来扩大危害,下面是一些能够构成多条命令执行的字符串:Windows下,&&、||、%0a,Linux下,&&、||、
(
)
、
‘
‘
、回车符
C
R
(
()、``、回车符CR(%0d)和换行符LF(%0a)。在Linux中双引号包裹的字符串”
()、‘‘、回车符CR(()”或”``”中的内容被当做命令执行,但是单引号包括的字符串是纯字符串。
命令行注入常用的参数有&&、&、|、||、;、%0a(换行符的URL编码)、转义字符、注释符。
1.;,各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.&&,若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.||,是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4.|,是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5.&,是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
6.%0a,是url编码,所以一定要输在url中,否则%0a会被再次编码。
7.转义字符,系统中的cmd.ext,bash程序执行命令能够解析很多特殊字符,它们的存在让BAT批处理和bash脚本处理工作更加便捷,但是如果想去掉特殊字符的特殊意义,就需要转义,所以转义字符即为取消特殊字符的特殊意义。windows的转义字符为^,Linux的转义字符为\。
8.注释符号,Windows注释符号为::,在BAT批处理中用的比较多。Linux的注释符号为#,在bash脚本中用的比较多。
3.实验演示
3.1.手工挖掘
在DVWA页面左侧选择Brute Force。
DVWA Security设置为low,即开发者没有采取任何保护的方法防止命令注入。
输入框实现ping命令,先随便输入127.0.0.1试试
成功执行。可以使用;。一次执行多条命令。
输入127.0.0.1;whoami
DVWA Security设置为Medium,这个级别开发者意识到一些命令注入的问题,设置了各种各样的匹配补丁过滤用户输入,但这是不够的,大量其他系统语法能被用于绕过过滤。
查看源码
发现黑名单过滤了&&和;,不使用这两个符号即可。使用|
输入127.0.0.1|whoami
DVWA Security设置为High,这个级别开发者重新设计、使用了更多的输入过滤规则,但这依然是不够的,开发者在过滤器上犯了轻微的拼写错误,而且相信某些PHP命令会纠正这个错误,依然可以绕过。
查看源码
发现使用黑名单过滤了&、;、| 、-、$、(、)、`、||。仔细观察发现|后面多了一个空格。也是就会过滤|+空格。不会过滤|。
输入127.0.0.1|whoami
DVWA Security设置为Impossible Level。以上级别使用的的是黑名单过滤,允许任何输入删除不需要的输入,这个级别设置了白名单,只允许某些输入,只允许非常严格的输入,如果不匹配,也不产生确定的结果,它将不允许执行。
3.2.使用burp爆破挖掘命令注入
使用命令注入防御时,如果使用黑名单技术,黑名单中列举的过滤字符是有限的,可以使用爆破技术来枚举不在黑名单中的可绕过过滤的字符。
启动burp,抓包成功
Action发送到Intruder。
在positions中点击clear,然后选中要爆破的内容,点击Add。
在payload中点击load 选择字典All_attack.txt。
然后点击start attack,执行爆破。
在爆破结果中点击Length,在Status 200的结果中查看返回内容,可以发现很多能绕过过滤的字符串。
4.命令注入防御
可以通过多种方式防止命令注入,从尽可能少地使用编程语言中具有潜在危险的易受攻击的函数或库,到不依赖用户输入并过滤用户输入。下面的示例是在 PHP 编程语言环境下,但是,相同的原则也可以扩展到其他编程语言环境。
在 PHP 中,有许多函数可以与操作系统发生交互,并通过 shell 执行命令,包括:
Exec–执行一个外部程序
Passthru–执行外部程序并且显示原始输出
System–执行外部程序并且显示输出
对输入数据进行过滤,清理web应用程序所使用的用户输入是防止命令注入的好方法。这是指定用户可以提交的数据格式或类型的过程。例如,可以指定仅接受数字数据或删除任何特殊字符(如 >、& 和 /)的输入字段。
使用白名单技术。
…等等。
版权归原作者 北辰911 所有, 如有侵权,请联系我们删除。