dvwa命令执行的应用与防御

命令执行(Command Injection):
在这里插入图片描述

PHP:system、exec、shell_exec、passthru、popen、proc_popen等称为高危漏洞。

实例:

在对企业进行安全测试时候,很少会发现系统注入漏洞。这是因为大部分情况下代码业务主要是数据操作、文件操作、逻辑处理和api接口调用等,很少直接使用系统命令。

那么,都会有什么情况会调用系统命令呢?这个真不一定,有时候需要靠猜靠运气,不过代码不会无缘无故调用系统命令,细心研究还是会查到一些迹象的。比如对于图片处理、大文件压缩解压、ppt转pdf等,如果目标网站或者服务器接口提供这样的功能,一般情况下代码都会调用第三方软件,这里举几个例子:

  1. 图片加水印

接口(为了避免出发论坛的图片转换,刻意打成了下面这个样子):

http ://w ww。test。com/add_water?
src=test。jp g

经测试,此接口会对test.jpg加水印。

猜测代码如下:

$image = $_GET(“image”);

exec("/use/bin/water " .
“/var/www/image/” . $image);

water是系统安装的加水印程序,image是接受的参数,此时image存在命令注入的可能。

  1. ppt转pdf

猜测代码如下:

<?php $ppt = $_GET("ppt"); exec("/use/bin/ppt2pdf " . "/var/www/ppt/" . $ppt); 和上面原理类似,ppt后面可以加命令注入攻击语句。 除了可能调用系统软件的这种情况,对于很多参数是url地址的,我们也要特别注意。如果某个程序为了省事,直接调用了系统curl命令,那么我们就可以直接注入了。再有就是ping检测功能,以及可能存在网络通讯协议、网络健康监测等功能附近,这些地方都有可能存在系统命令注入。 3.浏览器导航栏可以进行命令注入 4.评论区、搜索框也可以进行命令执行注入 原理:只要程序可以调用系统命令的情况下都可以发生命令执行漏洞。 条件:用户能够控制函数输入,存在可以执行代码的危险函数。 命令注入攻击的常见模式为:仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏。 PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。 命令执行漏洞产生原因: 开发人员没有对特殊函数入口做过滤,导致用户可以提交恶意代码并提交服务端执行。 Web服务器没有过滤危险函数导致命令执行漏洞攻击成功。 命令执行漏洞带来的危害: 继承Web服务程序的权限去执行系统命令或读写文件。 反弹shell 控制整个网站甚至控制服务器。 进一步内网渗透 PHP中的危险函数: system:成功则返回命令输出的最后一行,失败则返回FALSE。 exec:命令执行结果的最后一行内容。 shell_exec:命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。 passthru:执行外部程序并且显示原始输出。 eval:将输入的字符串参数当做PHP程序代码来执行。 assert preg_replace call_user_func DVWA:Command Injection(命令行注入) 命令连接符: 在windows和linux都支持,如果程序没有进行过滤,那么我们可以通过连接符来执行多条命令。 command1 && command2 先执行Command 1,执行成功后执行Command 2,否则不执行Command 2 command1 | command2 只执行command2 command1 & command2 先执行Command 1,不管是否成功,都会执行Command 2 ++++++++++++++++++ Low级别: 服务器端核心代码 <?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 "
{$cmd}
"; } ?>

相关函数介绍

stristr(string,search,before_search)

stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的ASCII值的字符),可选参数before_true为布尔型,默认为“false”,如果设置为“true”,函数将返回search参数第一次出现之前的字符串部分。

php_uname(mode)

这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。

可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。

漏洞利用

window和linux系统都可以用&&来执行多条命令

127.0.0.1&&net user

Linux下输入127.0.0.1&&cat
/etc/shadow甚至可以读取shadow文件,可见危害之大。

+++++++++++++++

Medium级别:

服务器端核心代码

<?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 "
{$cmd}
"; } ?>

可以看到,相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。

漏洞利用

1、127.0.0.1&net
user

因为被过滤的只有”&&”与” ;”,所以”&”不会受影响。

这里需要注意的是”&&”与” &”的区别:

Command 1&&Command 2

先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
在这里插入图片描述

Command 1&Command 2

先执行Command 1,不管是否成功,都会执行Command 2

在这里插入图片描述

2、由于使用的是str_replace把”&&” 、”;”替换为空字符,因此可以采用以下方式绕过:

127.0.0.1&;&ipconfig
在这里插入图片描述

这是因为”127.0.0.1&;&ipconfig”中的” ;”会被替换为空字符,这样一来就变成了”127.0.0.1&&
ipconfig” ,会成功执行。

+++++++++++++++++++++++++++++++++++++++

High

服务器端核心代码

<?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = trim($_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 "
{$cmd}
"; } ?>

相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。

漏洞利用

黑名单看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,于是 ”|”成了“漏网之鱼”。

127.0.0.1|net user
在这里插入图片描述

Command 1 | Command 2

“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

相关函数介绍

stripslashes(string)

stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。

explode(separator,string,limit)

把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。

is_numeric(string)

检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。

可以看到,Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

命令执行的防御:

通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数。

EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等。

下面我们来测试一下这个函数是否管用,以low级别的命令执行漏洞为例,对应的网页文件为D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.php,对文件进行如下图所示的修改,在ping命令之前加上EscapeShellCmd函数进行过滤。
在这里插入图片描述

将修改保存之后,转换到low级别测试,发现我们之前的那些命令都不管用了。

接下来再分析一下EscapeShellArg()函数,这个函数是专门用来处理命令的参数的,它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。

我们同样对网页进行修改,注意,EscapeShellArg()函数是专门对命令参数进行处理的。
在这里插入图片描述

保存修改之后,返回去进行测试,发现之前的命令同样也不管用了。

事实证明,这两个函数还是很管用的。综合比较一下,EscapeShellCmd函数是基于黑名单的,而黑名单都不是完全可靠的,黑客总有方法绕过,所以从这个意义上来说EscapeShellArg相对要更安全一些。

PHP中可以调用系统命令的函数主要包括:

exec system popen passthru proc_open
shell_exec

尽量不要执行外部命令。

使用自定义函数或者函数库来代替外部命令的功能。

使用escapeshe||arg函数来处理命令参数。

使用safe_mode_exec_dir指定可执行文件的路径。(safe_mode_exec_dir指定路径时可以把会使用的命令提前放入此路径内。)

选择不调用系统命令的实现方法

避免使用内部调用shell的函数

不将外界传入的字符串传递给命令行参数

使用安全的函数对传递给系统命令的参数进行转义

校验参数

将应用程序的权限降到最低

给web服务器系统及使用的中间件及时打上安全补丁

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水到渠成~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值