zoukankan      html  css  js  c++  java
  • [web安全原理]PHP命令执行漏洞基础

    前言

       

    PHP命令执行漏洞

    应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命令执行漏洞。

    基本函数

    1.system()用于执行外部程序,并且显示输出

    <?php system('whoami'); ?>

    2.exec()函数用于执行一个外部程序

    <?php exec('whoami');?>

    3.shell_exec()函数通过shell环境执行命令,并且将完整的输出以字符串的方式返回

    <?php shell_exec('whoami'); ?>

    4.passthru函数用于执行外部程序并且显示原始输出

    <?php passthru('whoami'); ?>

    5.popen()函数用于打开进程文件指针

    • r: 只读。
    • w: 只写 (打开并清空已有文件或创建一个新文件)
    <?php touch popen("3.txt","r"); ?> 在当前目录创建名为3.txt的文件

    6.Proc_popen函数用于执行一个命令,并且打开来输入输出的文件指针(有问题)

    proc_open (字符串 $cmd ,数组 $descriptorspec ,数组 &$pipes [,字符串 $cwd=NULL [,数组 $env=NULL[,数组 $other_options=NULL ]]])

    <?php $proc=proc_open("whoami",
    
                      array(
    
                          array("pipe","r"),
    
                          array("pipe","r"),
    
                          array("pipe","r")),$pipes);
    
            print stream_get_contents($pipes[i]);
    
    ?>
    View Code

    7.反单引号

    反单引号(`)是PHP执行运算符,PHP将尝试将返单引号中的内容作为shell命令来执行,并将其输出信息返回 执行下面代码返回whoami的结果

    <?php echo `whoami`;?>

    Windows下的命令执行漏洞

    1.windows下面的命令连接符

    windows下的命令连接符:&、&&、|、||

    (1)&命令连接符

    &前面的语句为假,则直接执行&后面的语句:&前面的语句为真,则&前后的语句都执行

    (2)&&命令连接符

    &&前面的语句为假,则直接报错,&&后面的语句也不执行;&&前面的语句为真,则&&前后的语句都执行

    (3)|命令连接符

    |前面的语句为假,则直接报错,|后面的语句也不执行;|前面的语句为真,则执行|后面的语句

    (4)||命令连接符

    ||前面的语句为假,则执行||后面的语句;||前面的语句为真,则执行||前面的语句,不执行||后面的语句

     

    2.windows下的执行命令漏洞利用

    代码

    <?php
      $ip=$_GET['ip'];
      system("ping ".$ip);
    ?> 

    代码中调用了system函数执行ping命令

     

    $ip是可控参数,可以通过Windows下的命令连接符执行多条命令,达到攻击的目的。输入?=127.0.0.1|whoami,成功执行,返回当前用户的信息,当然我们也可以进行其他的恶意操作。

    linux下的命令执行漏洞

    1linux下的命令连接符

    Linux下的命令连接符:&、&&、|、||

      (1).;命令连接符

      ;使多个命令顺序执行,前面的命令和后面的命令都会执行

       

      2.&命令连接符

      &的作用是使命令在后台运行,这样就可以同时执行多条命令

       

      3.&&命令连接符

      &&的作用是:如果前面的命令执行成功,则执行后面的命令

       

      4.|命令连接符

      |的作用是:将前面的命令的输出作为后面命令的输入,前面的命令和后面的命令都会执行,但只显示后面的命令执行结果  

      

      5.||命令连接符

      ||的作用类似于程序中的if-else语句。若前面的命令执行成功,则后面的命令就不会执行;若前面的命令执行失败,则执行后面的命令。

       

      漏洞利用部分和windows下面代码一样就是命令连接符部分不一样!!!!

    命令执行绕过方法

    命令执行绕过

    开发人员在开发过程中,为了避免命令执行漏洞,可能会过滤一些命令或者比较常见的攻击payload。攻击者会通过多种方式绕过过滤规则。

    (1)   绕过空格过滤

      1.${IFS}绕过

      $IFS是shell的特殊环境变量,是Linux下的内部区域分隔符。$IFS中存储的值可以使空格、制表符、换行符或者其他自定义符号。

      

           Payload: http://127.0.0.1/test.php?ip=127.0.0.1;ls${IFS}-l

      2.$IFS$9绕过

       

      Payload: http://127.0.0.1/test.php?ip=127.0.0.1;ls$IFS$9-l

      3.制表符绕过

      %09是制表符的URL编码,可以通过%09来代替空格,绕过空格过滤

      Payload: http://127.0.0.1/test.php?cmd=ping%09127.0.0.1

      

           4.{ }绕过

           

           5.<绕过

             

     

    (2)   绕过关键字过滤

      1.     变量拼接绕过

      Linux支持变量赋值,可以通过变量拼接来绕过过滤规则

      绕过ls命令

      

       2.     空变量绕过

      

       3.     系统变量绕过

      ${SHELLOPTS}是系统变量,可以利用系统变量的字符拼接绕过过滤

      

       4.     绕过

      

       5.     通配符绕过

      Linux支持利用通配符进行字符匹配。通配符的作用是在模糊查询时表示文件名中某些不确定的字符

            *代表0到多个任意字符

            ?代表任意一个字符

            []内为字符范围,代表该字符范围中的任意一个字符

      

       6.     shell反弹绕过

      在利用shell反弹进行攻击时,如果存在过滤,可以通过通配符来绕过过滤

      7.     BASE64编码绕过

      利用系统函数base64对命令进行Base64编码,以绕过过滤。例如,id命令的Base编码为aWQ=,在利用base64 -d对aWQ=进行解码,这样就绕过了过滤,并且正常执行了命令

       

      8.     expr和awk绕过

      通过expr和awk命令从其他文件中获取字符并进行命令构造

      xiaohua文件内容为字符串xiaohua,通过以下命令可以获取xiaohua文件中存储的第一个字符。

       

      9.     无回显的命令执行

      如果存在命令执行漏洞,但是没有回显,可以通过shell反弹的方式将shell反弹到VPS上,然后通过VPS执行命令。如果无法反弹shell,也可以通过DNS管道解析的方式获取命令的执行结果。

    PHP命令执行漏洞的修复

    1.服务器配置修复

    可以通过PHP配置文件中的disable_functions禁用敏感函数来修复命令执行漏洞

    2.函数过滤

      (1)escapeshellarg()函数:把字符串转码为可以在shell命令里使用的参数,以过滤命令中的参数。

        (2)  escapeshellcmd()函数:可以对shell元字符进行转义,过滤命令

     其他学习文章

      https://www.freebuf.com/articles/web/137923.html

    参考学习:《web安全原理分析与实践》

  • 相关阅读:
    mysql 导入导出
    spring3.1 profile 配置不同的环境
    <context:annotation-config />和 <context:component-scan
    NPM 使用介绍
    产品每生产一个消费一个
    通过Lock对象以及Condition对象实现多线程同步
    Spring定时任务的几种实现
    详解java定时任务
    设计模式-享元模式
    堆栈简析
  • 原文地址:https://www.cnblogs.com/xhds/p/12250975.html
Copyright © 2011-2022 走看看