命令注入

命令注入指的是,利用没有验证过的恶意命令或代码,对网站或服务器进行渗透攻击。

注入有很多种,并不仅仅只有SQL注入。比如:

  • 命令注入(Command Injection)
  • Eval 注入(Eval Injection)
  • 客户端脚本攻击(Script Insertion)
  • 跨网站脚本攻击(Cross Site Scripting, XSS)
  • SQL 注入攻击(SQL injection)
  • 动态函数注入攻击(Dynamic Variable Evaluation)
  • 序列化注入&对象注入
步骤2:漏洞代码审计

在之前常见危险函数一课我们已经说过,在PHP中常用到以下几个函数来执行外部命令:

system
exec
passthru
shell_exec

所以接下来,要寻找哪个文件使用了这几个函数,并进行分析。

我们对函数名进行搜索,右键点击www目录,在弹出来的菜单上选择find in folder,这个是查找整个文件夹的意思,然后我们在下方弹出的框内输入第一个敏感函数:system,点击Find,这时,编辑器就会查找WWW目录下所有内容里面有system的文件。

Alt text

可以看到,在variables文件里有system函数,但它的功能只是让我们自定义网络,对本次试验无意义,因此我们查看下一个函数exec

用同样的方法搜索exec函数:

Alt text

它出现在在admin目录下的ping.php文件中,我们打开admin目录下的ping.php文件进行查看:

Alt text

打开文件后可以看到,只有19到30行左右为PHP代码,其他均为HTML,因此核心代码应该为第19行到30行,如下:

<?php
   if( isset( $_POST[ 'submit' ] ) ) {
    $target = $_POST[ 'target' ];

    if (stristr(php_uname('s'), 'Windows NT')) { 
     $cmd = 'ping ' . $target;
    } else { 
     $cmd = 'ping -c 3 ' . $target;
    }
    $res = shell_exec( $cmd );
    echo "<br /><pre>$cmd\r\n".iconv('GB2312', 'UTF-8',$res)."</pre>";
   }
   ?>

这段代码的功能是,使用ping命令,ping用户输入的ip。

接下来大概分析一下这段代码的大意:

首先通过isset函数判断是否为POST提交过来的值,接下来将POST过来的值传递给target变量,但是没有经过任何的过滤,接下来使用if判断系统是否为windows,如果是则给cmd赋值为ping target,如果不是则赋值为ping -c 3 target。最后使用shell_exec执行cmd。

我们从上面的代码中可以得到两点可能产生漏洞的地方:

>* POST过来的数据,没有经过任何的过滤。 >* 使用shell_exec函数执行了我们传递过来的POST值。

这便是漏洞所在的地方,我们可以在ip后面添加|符,让它执行完ping命令后,继续执行我们在|符号后添加的字符,其中|:是or的意思,执行完ping命令,因为有|的存在,系统就会继续执行后面的命令。

漏洞修复

我们不仅要能发现这个漏洞,还要能对这个漏洞进行修复,那么如何修复呢?答案当然是过滤POST过来的变量,我们可以用很多方法对POST变量进行过滤。比如使用正则表达式来限制、或者首先判断POST过来的值是否为ip等等。

<?php
  if( isset( $_POST[ 'submit' ] ) ) {
  $target = $_POST[ 'target' ];

  if(preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$|^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/',$target)){
     
    if (stristr(php_uname('s'), 'Windows NT')) { 
      $cmd = 'ping ' . $target;
     } else { 
      $cmd = 'ping -c 3 ' . $target;
     }
     $res = shell_exec( $cmd );
     echo "<br /><pre>$cmd\r\n".iconv('GB2312', 'UTF-8',$res)."</pre>";
    }
  
  else{
     echo "IP is error";
    }
   }
   ?>

使用正则表达式来对用户输入的POST值进行过滤验证,这样就可以避免恶意代码的执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值