前端判斷
檔案上傳前端處理判斷副檔名的一律將js封鎖停用,停用後重新載入頁面即可上傳
後端判斷
檢查上傳檔案副檔名
通常會檢查各類敏感副檔名,php、php3、php5、pthml、jsp、jsP等等。
多副檔名手法
apache中的主配置httpd.conf有一個DefaultType引數,用來處理未知副檔名,這個引數預設是 text/plain ,遇到未知副檔名,會先判斷有沒有其他副檔名,順序是由右邊往左開始找起,如果沒有,則直接當txt、html
處理。
上傳一個檔案shell.php.aaa
,apache解析方式為最後的aaa無法解析,則往左檢查,能是一種繞過手法。
圖片馬手法
將圖片檔寫入php指令進行合成
copy filename.jpg/b + shell.php getshell.jpg
進行合成後上傳getshell.jpg
即可,同時配置一個.htaccess
上傳,告訴伺服器這個檔案運行php、jsp指令
<FilesMatch "pic.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
副檔名空格、點手法
沒有檢查副檔名是否摻雜空格、點,可在副檔名尾部中加入空白、點。
有以下幾種狀況能使用
- windows server
windows特性之一,將空白和點會自行修飾掉,windows不允許檔名最後結尾為點或空白。
-
CVE-2015-2348
影響範圍
- PHP 5.4.38~5.6.6
老舊版本的php漏洞,太少見,但還是提一下,靠的是move_uploaded_file()函式那段時間的漏洞
shell.php .jpg
php在截斷\00,後面的.jpg被丟棄
NTFS特性::$DATA繞過手法
上傳檔案如果沒有檢測::$DATA
,可以抓一下包,直接在副檔名後面添加進行繞過。
雙寫手法
移除副檔名php、jsp、asp等等,透過寫兩次檔名繞過,如:shell.pphphp
檢查Content-Type
將Content-Type修改為符合的格式欺騙傳送。
POST封包構造Shell
若網站本身有可以執行任意檔案的漏洞,可在上傳封包裡直接構造,接近無視任何檢測。
像以下這種有include.php
檔案在網頁本身上
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
在上傳的檔案後,得到path,直接傳進file做執行裡做執行
http://192.168.178.31/upload-labs/include.php?file=./upload/9420210712102913.gif
條件競爭
開發者忽略了伺服器併發執行多線程而產生的問題,沒有對上傳進行鎖操作或同步操作,上傳shell.php
大致上的邏輯順序是這樣
- move_uploaded_file()上傳檔案
- 檢查檔案副檔名
- 副檔名不允許,刪除檔案
看似沒有問題,但在伺服器執行時,多線並行的特性,可以寫一個php讓伺服器刪除,但在刪除之前訪問這個頁面讓他執行
<?php
$file = fopen("sh.php","w");
fputs($file,'<?php phpinfo();?>');
?>
不斷上傳,同時瀏覽shparent.php
頁面,一旦瀏覽成功,則代表sh.php
生成完畢