欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Web安全之浅析命令注入

来源:本站整理 作者:佚名 时间:2017-08-11 TAG: 我要投稿

命令注入是指攻击者可以能够控制操作系统上执行的命令的一类漏洞。 这篇文章将会讨论它的影响,包括如何测试它 ,绕过补丁和注意事项。
在命令注入之前,先要深入了解 的是:命令注入与远程代码执行(RCE)不一样。它们的区别是 ,通过RCE,执行的是代码 ,而在命令注入的时 ,执行的是一个(OS)命令。这可能只是一个微小的影响差异,但关键的区别在于如何找到并利用它们。
设置
我们首先编写两个简单的Ruby脚本,通过本地运行脚本来学习如何发现并利用命令注入漏洞 。我使用Ruby 2.3.3p222。下面是ping.rb。

puts `ping -c 4 #{ARGV[0]}`
该脚本将会,防止异意ping作为参数传递给脚本的服务器。 然后它将在屏幕上返回命令输出。示例输出如下。
$ ruby ping.rb '8.8.8.8'
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=46 time=23.653 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=9.111 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=8.571 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=20.565 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 8.571/15.475/23.653/6.726 ms
如上所示,它执行ping -c 4 8.8.8.8并在屏幕上显示输出。这是另一个脚本:server-online.rb。

puts `ping -c 4 #{ARGV[0]}`.include?('bytes from') ? 'yes' : 'no'
该脚本将根据ICMP响应(ping)来确定服务器是否处于联机状态。如果它响应ping请求,将在屏幕上显示是。如果没有,将显示否。命令的输出不会返回给用户。示例输出如下。
$ ruby server-on.rb '8.8.8.8'
yes
$ ruby server-on.rb '8.8.8.7'
No
测试
检测一级命令注入漏洞的最佳方法之一是尝试执行sleep命令,并确定执行时间是否增加。首先,我们为ping.rb脚本建立时间基线 :
$ time ruby ping.rb '8.8.8.8'
PING 8.8.8.8 (8.8.8.8): 56 data bytes
...
0.09s user 0.04s system 4% cpu 3.176 total
注意,执行脚本大约需要3秒。我们通过注入sleep命令观察脚本是否容易受到命令注入攻击。
$ time ruby ping.rb '8.8.8.8 && sleep 5'
PING 8.8.8.8 (8.8.8.8): 56 data bytes
...
0.10s user 0.04s system 1% cpu 8.182 total
该脚本现在将执行命令ping -c 4 8.8.8.8 && sleep 5。再次注意执行时间:它从〜3秒跳到〜8秒,这增加了5秒。互联网上仍然可能会出现意想不到的延迟,所以重复注入和设定较长的时间是很重要的,以确保它不是假阳性。
我们来观察 server-online.rb脚本是否也是易受攻击的。
$ time ruby server-online.rb '8.8.8.8'
yes
0.10s user 0.04s system 4% cpu 3.174 total
$ time ruby server-online.rb '8.8.8.8 && sleep 5'
yes
0.10s user 0.04s system 1% cpu 8.203 total
同样,基线显示执行一个正常的请求大约需要3秒。在命令中添加&sleep5会增加到8秒的时间。
根据执行的命令,可以注入不同的sleep命令。以下是一些可以尝试的有效payload(它们都是有效的):

time ruby ping.rb '8.8.8.8`sleep 5`'
当一个命令行被解析时,反引号之间的所有内容都将首先执行。执行echo `ls`将首先执行ls并捕获其输出。然后会将输出传递给echo,该输出将在屏幕上显示ls的输出,这被称为命令替换。由于反引号间的命令优先执行, ,所以之后的命令无关紧要。下面是一个带有注入有效payload及其结果的命令表。注入的有效payload被标记为绿色。


time ruby ping.rb '8.8.8.8$(sleep 5)'
这是命令替换的另一种方式 。当反引号被过滤或编码时,这可能很有效。当使用命令替换来查找命令注入时,请确保对两种方式 进行测试,来替换掉有效payload (见上表中的最后一个例子)。

time ruby ping.rb '8.8.8.8; sleep 5'
命令按照顺序(从左到右)执行,并且可以用分号分隔。当序列中的一个命令执行失败时,不会停止执行其他命令。下面是一个带有注入有效payload及其结果的命令表。 注入的有效payload用绿色标记。


time ruby ping.rb '8.8.8.8 | sleep 5'
命令输出可以按顺序将命令通过管道输出到其他命令。当执行cat/etc/passwd grep root 时,它将捕获cat/etc/passw命令的输出并将其传递给grep root,然后将显示与root 匹配的行。当第一个命令失败时,它仍然执行第二个命令。下面是一个带有注入有效payload及其结果的命令表。注入的有效payload用绿色标记。

利用
利用漏洞时需要判断是通常的注入还是盲注 。两者之间的区别在于盲注 不会返回命令的输出。通常命令注入会将 返回响应中 执行命令(s)的输出。sleep指令通常是一种很好的概念证明 。但是如果需要更多的信息 ,可以执行id、hostname,或whoami,并使用输出查看结果。服务器的hostname有助于确定有多少服务器受到影响,并帮助供应商更快地获得反馈。
重点:大多数公司都不喜欢你窥探他们的系统。利用该漏洞进行其他任务之前,请向该公司申请许可。在几乎所有的情况下,执行去掉无害的命令,如sleep、id、hostname,或whoami,就足以证明该公司存在该漏洞。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载