悟夜叉个人博客 技术专题 漏洞防御篇:命令执行漏洞(一)

漏洞防御篇:命令执行漏洞(一)

注:本篇为入门级文章,不含难点,放心观看~

命令执行是一个比较常见且危害比较大的漏洞。举一个简单例子,利用该漏洞可以将你的电脑自动关机,如果是服务器的话,可以删除服务器中的网站源代码和数据库文件。漏洞的出现大多数原因都是网站开发者没有做严格控制,就会导致攻击者输入一些漏洞攻击代码,从而导致资产丢失。

假如一个网站打开就显示一张图片,没有做任何的交互,没有任何的攻击点(破绽),那么基本上这个网站是安全的。当然,我这里说的是基本上,任何事务都有破绽,只是有些我们没有发现。

比如一些网站,他会有这样一个功能,最常见于家用路由器上面。比如使用的TP-LINK、小米等路由器,它们都会有一个功能叫“网络连接检测”,大家可以看一下下面这张图。

这张图呢,就是让你输入一个IP地址或者是一个网址,检测你是否能连接。比如,一个攻击者想输入 127.0.0.1,看一下是否能连通自己本地。然后网站在接收到用户的IP或者网址了之后,就会执行一个命令:ping 127.0.0.1,如果能 ping 通就代表这个网站或者ip是能够访问的。

可能有的同学就问了,我只输入了 IP 并没有输入 ping 命令,那是因为开发者已经将 ping 命令写进网站里了,它的功能就是这样实现的。在这个情况下,我们如何去攻击这个网站呢?那我们需要了解一个非常重要的内容,叫做命令提示符

CMD1|CMD2:无论CMD1是否被执行成功,CMD2会被执行
CMD1;CMD2:无论CMD1是否被执行成功,CMD2会被执行
CMD1&CMD2:无论CMD1是否被执行成功,CMD2会被执行
CMD1||CMD2:仅在CMD1执行失败的时候,才会执行CMD2
CMD1&&CMD2:仅在CMD1执行成功的时候,才会执行CMD2

首先第一行CMD1和CMD2之间有一个竖杠,我们称他为管道符。CMD1和CMD2你可以理解为运行两条命令,只不过中间加了一个字符。那我们突发奇想,如果我们在IP的后面加另外的命令会是什么效果呢?

如下图,我们在 127.0.0.1 后加一个 & whoami(该命令可以查看当前用户的信息),这个 & 符号代表着什么意思呢?可以看一下上面的解释,无论 ping 127.0.0.1 是否成功,都会执行 whoami 命令。

第一个 ping 127.0.0.1 是网站原有的功能,而 whoami 是 Windows操作系统的一个命令,通过这样的操作,我们就可以获取到 whoami 的命令执行结果了。

如果确定可以执行成功,我们换 shutdown 命令执行,是否就能将网站服务器关机了呢?当然仅限于Windows Server 的服务器,同理 Linux 的替换成相应的命令就可以了。 这里汇总了几条常见的cmd命令:

whoami :查看当前用户名
ipconfig :查看网卡信息
shutdown -s -t 0 :立刻关机(-t 后面接数字代表几秒钟关机,0代表立刻)
net user [Goyasha] [123456] /add :增加一个用户名为 Goyasha 密码为 123456 的账户
type [pass.txt] :查看 pass.txt 的内容

接下来我们之前安装的 DVWA 靶场平台就要上场了,没安装的可移步【点击这里】查看详细教程。

我们打开 DVWA 之后,选择 Command Injection(命令注入) 来进行学习,OVWA 不仅仅讲了漏洞的利用,还讲了漏洞的防御。打开之后,是不是和上面发的图片类似呢?

让你输入一个IP地址去ping它,我们输入 127.0.0.1 进行测试,会出现以下内容:

���� Ping 127.0.0.1 ���� 32 �ֽڵ�����:
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64

127.0.0.1 �� Ping ͳ����Ϣ:
    ���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
    ��� = 0ms��� = 0ms��ƽ�� = 0ms

可以看到出现了乱码,是因为 DVWA 是外国人开发的,网站默认的编码跟我们Windows系统的编码不同。那我们只需要知道已经被执行成功了就可以了,那我们在加一段命令 whoami,不知道怎么加的看我上面发的内容(不要跳着看文章哦!)。

���� Ping 127.0.0.1 ���� 32 �ֽڵ�����:
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64

127.0.0.1 �� Ping ͳ����Ϣ:
    ���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
    ��� = 0ms��� = 0ms��ƽ�� = 0ms
laptop-966g5caq\goyasha

大家可以看一下,跟上面的有什么区别?多了一行内容:laptop-966g5caq\goyasha,这是我电脑的用户名。那有的同学会问了,查的是自己电脑的用户名,有什么作用?

这里需要注意的一点!因为 DVWA 平台是安装在我们电脑本地环境的,我们输入的 whoami 查询的是部署 DVWA 平台电脑(或服务器)的用户名,而非我们自己电脑的用户名,请不要搞混淆。

那我们再查询一个网卡信息,对应的命令为:127.0.0.1&ipconfig,返回如下内容:

���� Ping 127.0.0.1 ���� 32 �ֽڵ�����:
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64
���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=64

127.0.0.1 �� Ping ͳ����Ϣ:
    ���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
    ��� = 0ms��� = 0ms��ƽ�� = 0ms

Windows IP ����


δ֪������ ��������:

   ý��״̬  . . . . . . . . . . . . : ý���ѶϿ�����
   �����ض��� DNS ��׺ . . . . . . . : 

���߾����������� ��������* 1:

   ý��״̬  . . . . . . . . . . . . : ý���ѶϿ�����
   �����ض��� DNS ��׺ . . . . . . . : 

���߾����������� ��������* 2:

   ý��״̬  . . . . . . . . . . . . : ý���ѶϿ�����
   �����ض��� DNS ��׺ . . . . . . . : 

��̫�������� VMware Network Adapter VMnet1:

   �����ض��� DNS ��׺ . . . . . . . : 
   �������� IPv6 ��ַ. . . . . . . . : fe80::31d5:d1d5:2516:d166%25
   IPv4 ��ַ . . . . . . . . . . . . : 192.168.80.1
   ��������  . . . . . . . . . . . . : 255.255.255.0
   Ĭ������. . . . . . . . . . . . . : 

��̫�������� VMware Network Adapter VMnet8:

   �����ض��� DNS ��׺ . . . . . . . : 
   �������� IPv6 ��ַ. . . . . . . . : fe80::8e0e:a9c1:2f47:e8ec%8
   IPv4 ��ַ . . . . . . . . . . . . : 192.168.81.1
   ��������  . . . . . . . . . . . . : 255.255.255.0
   Ĭ������. . . . . . . . . . . . . : 

��̫�������� ��̫�� 3:

   ý��״̬  . . . . . . . . . . . . : ý���ѶϿ�����
   �����ض��� DNS ��׺ . . . . . . . : 

���߾����������� WLAN:

   �����ض��� DNS ��׺ . . . . . . . : lan
   �������� IPv6 ��ַ. . . . . . . . : fe80::aae:e135:dbd7:a7b4%3
   IPv4 ��ַ . . . . . . . . . . . . : 172.18.3.213
   ��������  . . . . . . . . . . . . : 255.255.254.0
   Ĭ������. . . . . . . . . . . . . : 172.18.2.1

到这里可以清楚的了解到这个网站存在命令执行漏洞,不管是攻击者想拿到某个网站数据,还是开发者想修复这个漏洞,都需要知道这个漏洞是怎么引起的(了解原理)。那么下面我们来看一下,是如何产生这个漏洞的。

我们将页面拉到最底部,有一个 View Source 的按钮,我们点击它:


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

没学过PHP语言没有关系,我用最简单的方式给大家解释这段代码,到底漏洞点在哪里。下图所示,我们任何的代码先不要去关注,先找到 ip 这一行:$target = $_REQUEST[ ‘ip’ ];

我们在网页中输入的是IP地址,是 127.0.0.1,那上面标红的PHP代码,就是将我们输入的 IP 地址赋值给变量 $target,那这个 target 又做了什么操作?我们需要看到关键点,这个关键点叫做 shell_exec(),这个是PHP语言中的一个函数。

当然,我们不需要知道PHP怎么编写,因为我们做渗透又不是做开发(当然会开发理解起来会更容易)。

那我们先看 shell_exec,他的作用是去执行一条命令。他的参数是 ‘ping ‘ . $target ,ping 大家都知道是什么命令,后面的 $target 就是上面传下来 IP 地址,但他并没有去验证 $target 的内容,攻击者就能利用这个漏洞去获取服务器的各种信息。

所以我们在 IP 后面加上 &whoami,他除了执行 PING 127.0.0.1,还会执行 whoami 这一条命令,这是没有做任何防御措施的。在实际环境中RCE漏洞①是非常多的,尤其是很多组件。例如我们做服务器取证,拿到的网站源码很有可能是 ThinkPHP 框架开发的,了解Java的同学也应该知道 Spring 框架。这些框架都是大神开发的,但并不代表没有任何破绽,这也是本篇文章刚开始就提到的。

注①:RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

那我们怎么预防这种情况的发生呢?是否还记的上面发的“命令链接符”?最简单的方法就是,我把这些连接符设置成禁止输入 或者 替换成空格不就可以了吗?那我们再执行 whoami 会变成什么样呢(以替换成空格为例)?如下图所示,会变得无法执行,报错。

我们来看一下 DVWA 平台他是如何防御的。因为我们默认是 LOW 等级的,我们返回 DVWA 首页,点击 DVWA Security,将 LOW 改为 Medium,你可以理解为从小学题目变为初中题目了。

设置完成之后,我们返回 Command Injection 界面,现在还是让你去输入一个 IP 地址,没有任何改变。那我们拉到底部点击 View Source 按钮查看源代码。

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Set blacklist
    $substitutions = array(
        '&&' => '',
        ';'  => '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

不会代码没有关系,你可以记住这句话“ 将这些符号替换成空,或判断用户输入这些符号直接报错 ” 就可以了。符号还记得包括哪些吗?

& ” and符号 、“ ; ” 分号、“ | ” 竖杠、“ && ” 两个and符、“ || ” 两个竖杠。

如下图所示,大家能看出来多了哪些代码了吗?首先,`ip` 的值还是赋给了 $target ,但在下面他做了一个操作。将 “ && ” 和 “ ; ” 字符变为空,这又是什么意思呢?

这里新出现了一个PHP的函数 str_replace,大家可以猜猜有什么作用。str 是 string 的缩写,代表着一串字符(也叫字符串),replace 就比较好理解了,替换的意思,合起来就是替换字符串

相信大家已经猜到 ‘&&’ => ”‘;’ => ” 的含义了,他就是判断如果用户输入了 &&; 就立马将符号删除,两个引号里面什么也没有代表空,将内容替换为空,相当于删除。

127.0.0.1 && whoami 本身是可以执行的,现在开发人员做了限制,看你输入了两个 && 符号,直接给你删除掉了。那么 ping 127.0.0.1 whoami 这段肯定不能运行,上面也提到过发过演示图片,我们知道原理了之后,再回头看是不是更容易一点了呢?

还记得我们防御等级是 Medium 吗?有没有人发现为什么就只屏蔽了 &&; 两个符号?之前我是不是讲了5个命令连接符?各位如果忘记了就翻上去看看!除了 && 和 ; 其他的还能不能用呢?留给大家自行测试

那在我们真实渗透测试环境,如何发现网站是怎么防御的呢?那就涵盖了我们测试的两种技术:白盒测试黑盒测试。白盒就是你可以看到源代码,查看源代码的过滤机制。黑盒相反,你看不到源代码,依次尝试常见的命令连接符。

黑盒测试占比是非常大的,比如说你想去攻击某个网站,你能直接看到网站源码吗?别人肯定不会给你,那我们只能每种方法挨个尝试了。常见的命令连接符就5个,挨个试呗。

这样的解释,不知道大家是否能明白。因为是 Medium 等级,所以防御的不是太狠。本篇内容暂时就讲到这里,下一篇我们来继续挑战 High、impossible 等级的命令执行漏洞题目。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

站长QQ/VX:82794

在线咨询: QQ交谈

邮箱: 82794@qq.com

任何技术问题请联系QQ,非特殊行业请勿加微信!龙信小伙伴请联系微信群找我。
关注微信
非商务合作请勿添加

非商务合作请勿添加微信

返回顶部