當前位置:
首頁 > 新聞 > 文件上傳限制繞過技巧

文件上傳限制繞過技巧

簡介


文件上傳漏洞是web安全中經常利用到的一種漏洞形式。一些web應用程序中允許上傳圖片,文本或者其他資源到指定的位置,文件上傳漏洞就是利用這些可以上傳的地方將惡意代碼植入到伺服器中,再通過url去訪問以執行代碼。但在一些安全性較高的web應用中,往往會有各種上傳限制和過濾,導致我們無法上傳特定的文件。本文將就此展開討論,通過本文的學習你將了解到Web應用中文件上傳的處理和驗證發送流程,以及我們該如何繞過這些驗證。


客戶端驗證


客戶端驗證是一種發生在輸入被實際發送至伺服器之前進行的驗證。這類驗證大都都是通過JavaScript,VBScript或HTML5來完成的。雖然,這對於用戶來說響應速度更快體驗也更好。但對於惡意攻擊者來說,這些驗證似乎就顯得略為低級。


客戶端驗證繞過


這種類型的繞過也非常簡單,我們可以關閉瀏覽器上的JavaScript或是在瀏覽器發出請求之後,在被發送至伺服器之前來篡改該HTTP請求即可。


示例:

1. <script type="text/javascript">
2. var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"];
3. function Validate(oForm) {
4. var arrInputs = oForm.getElementsByTagName("input");
5. for (var i = 0; i < arrInputs.length; i++) {
6. var oInput = arrInputs[i];
7. if (oInput.type == "file") {
8. var sFileName = oInput.value;
9. if (sFileName.length > 0) {
10. var blnValid = false;
11. for (var j = 0; j < _validFileExtensions.length; j++) {
12. var sCurExtension = _validFileExtensions[j];
13. if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).to
LowerCase() == sCurExtension.toLowerCase()) {
14. blnValid = true;
15. break;
16. }
17. }
18.
19. if (!blnValid) {
20. alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtension
s.join(", "));
21. return false;
22. }
23. }
24. }
25. }
26.
27. return true;
28. }
29. </script>

正如你所看到的,此JavaScript僅在請求被實際發送至伺服器之前處理你的請求,以及檢查你上傳的文件擴展名是否為(jpg,jpeg,bmp,gif,png)。這樣的話,我們就可以攔截該請求並篡改文件內容(惡意代碼),然後將圖片擴展名更改為可執行文件的擴展名(如php,asp)。



如上圖所示,我們試圖上傳一個直接的PHP文件,JavaScript阻止了我們的文件上傳請求。


我們可以通過瀏覽器來上傳一個正常的圖片格式來繞過該驗證,然後攔截該請求再將其改回為php格式並將文件內容替換為我們的惡意代碼,這樣我們就能夠成功上傳我們的惡意php腳本了。


文件名驗證


顧名思義,就是在文件被上傳到服務端的時候,對於文件名的擴展名進行檢查,如果不合法,則拒絕這次上傳。檢查擴展名是否合法有兩種常用策略,即黑名單和白名單策略。


黑名單策略,即文件擴展名在黑名單中的為不合法。白名單策略,即文件擴展名不在白名單中的均為不合法。相對於黑名單,白名單策略更加安全的。通過限制上傳類型為只有我們接受的類型,可以較好的保證安全,因為黑名單我們可以使用各種方法來進行注入和突破。


文件名繞過


我們可以通過上傳一些平時不怎麼用的容易被人忽視的文件擴展名,來繞過這種類型的驗證。


繞過黑白名單策略:


黑名單繞過


通過上傳不受歡迎的php擴展來繞過黑名單。例如:pht,phpt,phtml,php3,php4,php5,php6


白名單繞過



通過某種類型的技巧來繞過白名單,例如添加空位元組注入(shell.php%00.gif),或使用雙重擴展來上傳文件(shell.jpg.php)。


此外,我們還可以嘗試擴展名大小寫來繞過,例如:pHp,Php,phP。


示例:

1. if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
2. && $imageFileType != "gif" ) {
3. echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";

以上代碼將會阻止除jpg,jpeg,gif,png擴展名以外的,所有其它文件類型上傳。在本例中我們將嘗試繞過該檢查,並在Web伺服器上傳一個php文件。


黑名單繞過


正如你所看到的,將php文件的後綴更改為.php5(Apache伺服器會將其視為php文件執行)後,就可以成功繞過該上傳驗證。


白名單繞過



如上圖所示,我們使用了雙重擴展名(shell.jpg.php)來繞過驗證。


Content-Type驗證


Content-Type(內容類型),一般是指網頁中存在的Content-Type,用於定義網路文件的類型和網頁的編碼,決定文件接收方將以什麼形式、什麼編碼讀取這個文件。例如,一些圖像文件上傳通過檢查文件的內容類型是否為圖像類型來驗證上傳的圖像。


Content-Type繞過


該類型的繞過也非常簡單,只需將「Content-Type」的參數類型更改為「image/ *」即可,例如「image/png」, 「image/jpeg」, 「image/gif」。

示例:

1. <?php
2.
3. $mimetype = mime_content_type($_FILES["file"]["tmp_name"]);
4. if(in_array($mimetype, array("image/jpeg", "image/gif", "image/png"))) {
5. move_uploaded_file($_FILES["file"]["tmp_name"], "/uploads/" . $_FILES["file"]["name"]);
6. echo "OK";
7.
8. } else {
9. echo "Upload a real image";
10. }

以上代碼會檢查Content-Type header中的MIME類型,僅接受類型為image/jpeg, image/gif, image/png的文件上傳。我們只需只需將「Content-Type」的參數類型更改為其可接受的類型即可繞過。



CONTENT-LENGTH驗證


Content-Length驗證是指伺服器會對上傳的文件內容長度進行檢查,超出限制大小的文件將不允許被上傳。雖然這種類型的驗證不是很受歡迎,但在一些應用的文件上傳中也時常能碰到。


CONTENT-LENGTH繞過


針對這種類型的驗證,我們可以通過上傳一些非常短的惡意代碼來繞過。上傳文件的大小取決於,Web伺服器上的最大長度限制。我們可以使用不同大小的文件來fuzzing上傳程序,從而計算出它的限制範圍。


示例:

1. if ($_FILES["fileToUpload"]["size"] > 30) {
2. echo "Sorry, your file is too large.";
3. }

以上代碼將限制大小超過30位元組的文件上傳。我們可以通過上傳一個30位元組以內大小的惡意payload文件來繞過它。



參考來源



http://www.securityidiots.com/Web-Pentest/hacking-website-by-shell-uploading.html


http://www.net-informations.com/faq/asp/validation.htm


https://www.owasp.org/index.php/Unrestricted_File_Upload


http://www.sitepoint.com/mime-types-complete-list/


https://www.w3schools.com/php/php_file_upload.asp


https://stackoverflow.com/


*參考來源:exploit-db,

FB小編 secist 編譯,轉載請註明來自FreeBuf.COM

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

思科設備存在硬編碼密碼,安全更新第四次刪除後門賬戶

TAG:FreeBuf |