滲透之路基礎 — 文件上傳
- 2019 年 10 月 3 日
- 筆記
具體還是要根據實戰情況來判斷分析,本文僅供思路學習和參考
漏洞危害
可以直接上傳Shell,導致伺服器getshell
漏洞形成
Web應用程式沒有對上傳文件的格式進行嚴格過濾 , 還有一部分是攻擊者通過 Web伺服器的解析漏洞來突破Web應用程式的防護;通常都會出現在,上傳功能上
文件上傳格式及解析
沒有解析漏洞的情況下,格式程式碼必須要和文件格式一直,否則無法正常解析運行,如果存在解析漏洞的情況下,格式程式碼可以和不同格式相互解析
之後也會發出關於解析漏洞的文章!
漏洞防禦
可以針對文件名、文件大小、文件內容、文件類型等進行防禦
-
檢查文件上傳路徑 ( 避免 0x00 截斷、 IIS6.0 文件夾解析漏洞、目錄遍歷 )
-
文件擴展名檢測 ( 避免伺服器以非圖片的文件格式解析文件 )
-
文件 MIME驗證 ( 比如 GIF 圖片 MIME為 image/gif,CSS 文件的 MIME為 text/css 等 ) 3. 文件內容檢測 ( 避免圖片中插入 webshell)
-
圖片二次渲染 ( 最變態的上傳漏洞防禦方式 , 基本上完全避免了文件上傳漏洞 )
-
文件重命名 ( 如隨機字元串或時間戳等方式 , 防止攻擊者得到 webshell 的路徑 )
注意:若攻擊者上傳了shell之後,肯定會通過某刀劍進行連接,所以盡量不要暴露文件路徑,並且設置訪問許可權,以進一步防禦
文件上傳驗證及突破
文件過濾,驗證後綴:
-
文件頭驗證
-
文件類型驗證
-
文件後綴驗證
繞過:
- 修改文件頭,偽造文件屬性
- 修改文件類型,偽造文件類型 MIME繞過
- 增加多重後綴,偽造文件後綴 命名繞過
js 本地驗證突破
-
複製js程式碼,創建本地文件刪除相應驗證程式碼後直接上傳(無防盜鏈可用)
-
%00 截斷 shell.php%00.jpg => shell.php
測試程式碼 upload.php
<?php //文件上傳漏洞演示腳本之js驗證 $uploaddir = 'uploads/'; if (isset($_POST['submit'])) { if (file_exists($uploaddir)) { if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) { echo '文件上傳成功,保存於:' . $uploaddir . $_FILES['upfile']['name'] . "n"; } } else { exit($uploaddir . '文件夾不存在,請手工創建!'); } //print_r($_FILES); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;charset=gbk"/> <meta http-equiv="content-language" content="zh-CN"/> <title>文件上傳漏洞演示腳本--JS驗證實例</title> <script type="text/javascript"> function checkFile() { var file = document.getElementsByName('upfile')[0].value; if (file == null || file == "") { alert("你還沒有選擇任何文件,不能上傳!"); return false; } //定義允許上傳的文件類型 var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|"; //提取上傳文件的類型 var ext_name = file.substring(file.lastIndexOf(".")); //alert(ext_name); //alert(ext_name + "|"); //判斷上傳文件類型是否允許上傳 if (allow_ext.indexOf(ext_name + "|") == -1) { var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name; alert(errMsg); return false; } } </script> <body> <h3>文件上傳漏洞演示腳本--JS驗證實例</h3> <form action="" method="post" enctype="multipart/form-data" name="upload" onsubmit="return checkFile()"> <input type="hidden" name="MAX_FILE_SIZE" value="204800"/> 請選擇要上傳的文件:<input type="file" name="upfile"/> <input type="submit" name="submit" value="上傳"/> </form> </body> </html>
上傳成功之後仍然是圖片格式
*這時候需要抓包修改*
- 注意:直接通過burp抓包修改,可能上傳的文件還是shell.php%00.jpg - 需要通過修改%00的URL編碼格式: - 選中%00 右鍵選中 URL - 點擊 URL-decode - %00 亂碼則可以上傳
文件上傳MIME驗證突破
測試頁面 mime.php
<?php //文件上傳漏洞演示腳本之MIME驗證 $uploaddir = 'uploads/'; if (isset($_POST['submit'])) { if (file_exists($uploaddir)) { if (($_FILES['upfile']['type'] == 'image/gif') || ($_FILES['upfile']['type'] == 'image/jpeg') || ($_FILES['upfile']['type'] == 'image/png') || ($_FILES['upfile']['type'] == 'image/bmp') ) { if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) { echo '文件上傳成功,保存於:' . $uploaddir . $_FILES['upfile']['name'] . "n"; } } else { echo '文件類型不正確,請重新上傳!' . "n"; } } else { exit($uploaddir . '文件夾不存在,請手工創建!'); } //print_r($_FILES); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;charset=gbk"/> <meta http-equiv="content-language" content="zh-CN"/> <title>文件上傳漏洞演示腳本--MIME驗證實例</title> <body> <h3>文件上傳漏洞演示腳本--MIME驗證實例</h3> <form action="" method="post" enctype="multipart/form-data" name="upload"> 請選擇要上傳的文件:<input type="file" name="upfile"/> <input type="submit" name="submit" value="上傳"/> </form> </body> </html>
抓包修改 Content-Type
序號 | 內容類型 | 文件擴展名 | 描述 |
---|---|---|---|
1 | application/msword | doc | Microsoft Word |
2 | application/octet-stream bin | dms lha lzh exe class | 可執行程式 |
3 | application/pdf | Adobe Acrobat | |
4 | application/postscript | ai eps ps | PostScript |
5 | appication/powerpoint | ppt | Microsoft Powerpoint |
6 | appication/rtf | rtf | rtf 格式 |
7 | appication/x-compress | z | unix 壓縮文件 |
8 | application/x-gzip | gz | gzip |
9 | application/x-gtar | gtar | tar 文檔 (gnu 格式 ) |
10 | application/x-shockwave-flash | swf | MacroMedia Flash |
11 | application/x-tar | tar | tar(4.3BSD) |
12 | application/zip | zip | winzip |
13 | audio/basic | au snd | sun/next 聲音文件 |
14 | audio/mpeg | mpeg mp2 | Mpeg 聲音文件 |
15 | audio/x-aiff | mid midi rmf | Midi 格式 |
16 | audio/x-pn-realaudio | ram ra | Real Audio 聲音 |
17 | audio/x-pn-realaudio-plugin | rpm | Real Audio 插件 |
18 | audio/x-wav | wav | Microsoft Windows 聲音 |
19 | image/cgm | cgm | 電腦圖形元文件 |
20 | image/gif | gif | COMPUSERVE GIF 影像 |
21 | image/jpeg | jpeg jpg jpe | JPEG 影像 |
22 | image/png | png | PNG 影像 |
http://www.w3school.com.cn/media/media_mimeref.asp
關於編輯器上傳漏洞利用
網站程式編輯器插件,eweb,fck,ce,cfinder,ck等
利用圖片路徑判斷編輯器類型
.htaccess 文件上傳漏洞
只適用於Apache 通過配置文件來解析執行相應腳本
<FilesMatch "code"> SetHandler application/x-httpd-php </FilesMatch>
直接訪問是訪問不到的
通過修改.htaccess文件可直接訪問
可以將任意文件解析為PHP
- 如果存在上次.htaccess文件,可以直接利用規則解析
- 如果存在修改文件的許可權,修改解析規則
- 拓展利用:許可權維持