風炫安全web安全學習第三十六節課 15種上傳漏洞講解(一)javascript
文件上傳漏洞能夠說是平常滲透測試用得最多的一個漏洞,由於用它得到服務器權限最快最直接。可是想真正把這個漏洞利用好卻不那麼容易,其中有不少技巧,也有不少須要掌握的知識。俗話說,知己知彼方能百戰不殆,所以想要研究怎麼防禦漏洞,就要了解怎麼去利用。php
網站web應用都有一些文件上傳功能,好比文檔、圖片、頭像、視頻上傳,當上傳功能的實現代碼沒有嚴格校驗上傳文件的後綴和文件類型,此時攻擊者就能夠上傳一個webshell到一個web可訪問的目錄上,並將惡意文件傳遞給PHP解釋器去執行,以後就能夠在服務器上執行惡意代碼,進行數據庫執行、服務器文件管理,服務器命令執行等惡意操做。
根據網站使用及可解析的程序腳本不一樣,此處能夠上傳的惡意腳本能夠是PHP、ASP、JSP文件,也能夠是篡改後綴後的這幾類腳本。html
WebShell 就是以 asp、php、jsp 或者 cgi 等網頁文件形式存在的一種命令執行環境,也能夠將其稱之爲 一種網頁後門。攻擊者在入侵了一個網站後,一般會將這些 asp 或 php 後門文件與網站服務器 web 目錄 下正常的網頁文件混在一塊兒,而後使用瀏覽器來訪問這些後門,獲得一個命令執行環境,以達到控制網站服務器的目的(能夠上傳下載或者修改文件,操做數據庫,執行任意命令等)。前端
$_FILES['file']['name'] 客戶端文件名稱 $_FILES['file']['type'] 文件的MIME類型 $_FILES['file']['size'] 文件大小 單位字節 $_FILES['file']['tmp_name'] 文件被上傳後再服務器端臨時文件名,能夠在php.ini中指定
要注意的是在文件上傳結束後,默認的被儲存在臨時文件夾中,這時必須把他從臨時目錄中刪除或移動到其餘地方,不然,腳本運行完畢後,自動刪除臨時文件,可使用copy或者move_uploaded_file
兩個函數java
MIME類型格式: 類別/子類別;參數 Content-Type: [type]/[subtype]; parametergit
MIME主類別: text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;github
Multipart:用於鏈接消息體的多個部分構成一個消息,這些部分能夠是不一樣類型的數據;web
Application:用於傳輸應用程序數據或者二進制數據;shell
Message:用於包裝一個E-mail消息;數據庫
Image:用於傳輸靜態圖片數據;
Audio:用於傳輸音頻或者音聲數據;
Video:用於傳輸動態影像數據,能夠是與音頻編輯在一塊兒的視頻數據格式。
一、客戶端javascript校驗(通常只校驗後綴名)
二、服務端校驗
三、文件頭content-type字段校驗(image/gif)
四、後綴名黑名單校驗
五、文件內容頭校驗(GIF89a)
六、後綴名白名單校驗
七、自定義正則校驗
八、WAF設備校驗(根據不一樣的WAF產品而定)
這次咱們用的靶場是:upload-labs: https://github.com/c0ny1/upload-labs
這個漏洞已通過時,幾乎不會再出此類漏洞
WebDAV是一種基於 HTTP 1.1協議的通訊協議.它擴展了HTTP 1.1,在GET、POST、HEAD等幾個HTTP標準方法之外添加了一些新的方法。使應用程序可直接對Web Server直接讀寫,並支持寫文件鎖定(Locking)及解鎖(Unlock),還能夠支持文件的版本控制。當WebDAV開啓PUT,MOVE,COPY,DELETE方法時,攻擊者就能夠向服務器上傳危險腳本文件。
此時可使用OPTIONS探測服務器支持的http方法,若是支持PUT,就進行上傳腳本文件,在經過MOVE或COPY方法更名。當開啓DELETE時還能夠刪除文件
<?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>
繞過方式
去掉前端的提交時候的驗證checkFile
函數既可
演示地址:Pass-01/index.php
MIME type的縮寫爲(Multipurpose Internet Mail Extensions)表明互聯網媒體類型(Internet media type),MIME使用一個簡單的字符串組成,最初是爲了標識郵件Email附件的類型,在html文件中可使用content-type屬性表示,描述了文件類型的互聯網標準。
?php if($_FILE['userfile']['type'] != "image/gif"){ //檢測content-type echo "sorry,we only allow uploading GIF images"; exit; } else { echo "Upload success!"; } ?>
以上是一個簡單的服務器上傳驗證代碼,只要content-type符合image/gif就容許上傳
繞過方式
使用Burp截取上傳數據包,修改Content-Type的值,改成image/gif便可成功繞過上傳webshell
演示地址:Pass-02/index.php
使用黑名單,禁止上傳.asp,.aspx,.php,.jsp
結尾的文件。
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array('.asp','.aspx','.php','.jsp'); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//刪除文件名末尾的點 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //轉換爲小寫 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if(!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload = true; } else { $msg = '上傳出錯!'; } } else { $msg = '不容許上傳.asp,.aspx,.php,.jsp後綴文件!'; } } else { $msg = UPLOAD_PATH . '文件夾不存在,請手工建立!'; } }
繞過方式
使用特殊文件.php,.phtml、php二、php三、php五、phtml、pht
。來突破上傳,在特定狀況下一樣也能夠解析
演示地址:Pass-03/index.php
參考
http://blog.evalshell.com/2020/12/20/風炫安全web安全學習第三十六節課-15種上傳漏洞講解/