- 檔案上傳漏洞
上傳檔案的時候,如果服務器端后端語言未對上傳的檔案進行嚴格的驗證和過濾,就容易造成上傳任意檔案的情況,常見場景是web服務器允許用戶上傳圖片或者普通文本檔案保存,而用戶繞過上傳機制上傳惡意代碼并執行從而控制服務器, - 必備條件
檔案上傳功能能正常使用
上傳檔案路徑可知
上傳檔案可以被訪問
上傳檔案可以被決議 - 檢測方式
客戶端JavaScript檢測(檢測檔案擴展名)
服務端MIME型別檢測(檢測content-type內容)
服務端檔案擴展名檢測 (檢測跟檔案extension相關的內容)
服務端檔案內容檢測(檢測內容是否合法是否含有惡意代碼)等
檔案上傳漏洞
- 1.客戶端檢測
- 1.1.概述
- 1.2.繞過方法
- 2.MIME型別檢測
- 2.1.概述
- 2.2.MIME型別
- 2.3.繞過方法
- 3.黑名單檢測
- 3.1.概述
- 3.2.繞過方法
- 3.2.1.利用后綴大小寫不敏感繞過
- 3.2.2.利用空格繞過
- 3.2.3.利用點號(·)繞過
- 3.2.4.利用(::$DATA)繞過
- 3.2.5.利用雙寫后綴繞過
- 3.2.6.利用.htaccess檔案繞過
- 4.白名單檢測
- 4.1.概述
- 4.2.繞過方法
- 4.2.1.利用%00截斷繞過
- 4.2.2.利用0x00截斷繞過
- 5.檔案內容檢測
- 5.1.概述
- 5.2.檔案幻數
- 5.2.1.概述
- 5.2.2.繞過方法
- 5.3.檔案加載
- 5.3.1.概述
- 5.3.2.繞過方法
- 6.條件競爭繞過檔案洗掉
- 6.1.概述
- 6.2.繞過方法
- 7.漏洞防御
1.客戶端檢測
1.1.概述
當用戶在客戶端選擇檔案點擊上傳的時候,客戶端還沒有向服務器發送任何訊息,就對本地檔案進行檢測來
判斷是否是可以上傳的型別,這種方式稱為前臺腳本檢測擴展名,
1.2.繞過方法
在本地瀏覽器客戶端禁用JS:可使用火狐瀏覽器的Noscript插件、瀏覽器禁用JS等方式實作(快捷鍵瀏覽器先按F2再按F1,高級設定中勾選即可),
2.MIME型別檢測
2.1.概述
當瀏覽器在上傳檔案到服務器的時候,服務器對所上傳檔案的Content-Type型別進行檢測,如果是允許的,
則可以正常上傳,否則上傳失敗,
2.2.MIME型別
MIME (Multipurpose Internet Mail Extensions) 是描述訊息內容型別的因特網標準,用來表示檔案、檔案或字
節流的性質和格式,在http資料包中在Content-Type欄位顯示,
MIME型別詳解
常見MIME型別:
超文本標記語言.html檔案:text/html
普通文本.txt檔案:text/plain
PDF檔案.pdf:application/pdf
Microsoft Word檔案.word:application/msword
PNG影像.png:image/png
GIF影像.gif:image/gif
MPEG檔案.mpg、.mpeg:video/mpeg
AVI檔案.avi:video/x-msvideo
2.3.繞過方法
利用Burp Suite截取并修改資料包中的Content-Type欄位的值為正常值從而進行繞過,
3.黑名單檢測
3.1.概述
一般情況下,代碼檔案里會有一個陣列或者串列,該陣列或者串列里會包含一些非法的字符或者字串,當
資料包中含有符合該串列的字串時,即認定該資料包是非法的,
確認黑名單方法:
因為黑名單是不允許我們的資料包含有符合黑名單串列的字串,所以我們只需要隨意構造一個不在它串列
中的資料包即可,
3.2.繞過方法
3.2.1.利用后綴大小寫不敏感繞過
在Windows中,大小寫是不敏感的,
例如:“test.php” 和 “test.PHp訪問結果是一樣的,
3.2.2.利用空格繞過
在Windows中,檔案保存的時候如果檔案后綴名末尾有空格會自動去掉,
例如:“test.php ”Windows會自動去掉末尾的空格變成"test.php",
3.2.3.利用點號(·)繞過
在Windows中,檔案保存的時候會自動去掉檔案后綴后的點號,
例如:“test.php.”在保存的時候就變成了“test.php”,
3.2.4.利用(::$DATA)繞過
在Windows中如果檔案名+“::
D
A
T
A
”
會
把
:
:
DATA”會把::
DATA”會把::DATA之后的資料當成檔案流處理,不會檢測后綴名,且保
持::
D
A
T
A
之
前
的
文
件
名
,
例
如
:
“
t
e
s
t
.
p
h
p
:
:
DATA之前的檔案名, 例如:“test.php::
DATA之前的文件名,例如:“test.php::DATA”Windows會自動去掉末尾的::$DATA變成“test.php”,
3.2.5.利用雙寫后綴繞過
有些代碼中,會將資料包中符合黑名單串列的字串替換為空,
例如:“test.php”變為“test”,那么可以構造”test.pphphp“在保存的時候就變成了”test.php“,
3.2.6.利用.htaccess檔案繞過
.htaccess檔案(或者"分布式組態檔"),全稱是Hypertext Access(超文本入口),提供了針對目錄改變配置的
方法, 即,在一個特定的檔案目錄中放置一個包含一個或多個指令的檔案, 以作用于此目錄及其所有子目錄,
作為用戶,所能使用的命令受到限制,
.htaccess檔案內容:
<FilesMatch "as.png">
setHandler application/x-httpd-php
</FilesMatch>
通過一個.htaccess 檔案呼叫 php 的決議器去決議一個檔案名中只要包含"as.png"這個字串的任意檔案,所以無論檔案名是什么樣子,只要包含"as.png"這個字串,都可以被以 php 的方式來決議,一個自定的.htaccess檔案就可以以各種各樣的方式去繞過很多上傳驗證機制,
例如:上傳 ”as.png“就會當作 ”as.php“來決議,
4.白名單檢測
4.1.概述
一般情況下,代碼檔案里會有一個陣列或者串列,該陣列或者串列里會包含一些合法的字符或者字串,當資料包中含有不符合該串列的字串時,即認定該資料包是非法的,
確認白名單的方法
因為白名單是只允許我們的資料包含有符合白名單串列的字串,所以我們只需要隨意構造一個資料包,如果可以上傳,說明是黑名單,不可以上傳則是白名單,
4.2.繞過方法
原理及條件:
服務端判斷檔案型別是從后往前判斷,而對檔案決議是從前往后決議,可以利用00截斷的方式進行繞過,包括%00截斷與0x00截斷, 前提php小于5.3.29,
4.2.1.利用%00截斷繞過
原理:
%00是一個url編碼,url發送到服務器后就被服務器解碼,這時還沒有傳到驗證函式,也就是說驗證函式里接收到的不是%00字符,而是%00解碼后的內容,即解碼成了0x00,在url中%00表示ascll碼中的0 ,而ascii中0作為特殊字符保留,表示字串結束,所以當url中出現%00時就會認為讀取已結束,
具體用法:
利用Burp Suite修改post請求頭Url結尾處添加%00,
4.2.2.利用0x00截斷繞過
原理:
系統在對檔案名進行讀取時,如果遇到0x00,就會認為讀取已經結束,但要注意是檔案的十六進制內容里的00,而不是檔案名中的00,
具體用法:
利用Burp Suite在檔案名后添加資料,再在Hex中將其修改為00將其截斷,
5.檔案內容檢測
5.1.概述
主要有兩種檢測方法:
檔案幻數檢測:一般通過判斷前10個位元組,基本就能判斷出一個檔案的真實型別,
檔案加載檢測:一般是呼叫API或函式對檔案進行加載測驗,
5.2.檔案幻數
5.2.1.概述
檔案格式幻數(magic number),它可以用來標記檔案或者協議的格式,很多檔案都有幻數標志來表明該檔案的格式,
常見的檔案頭:
JPEG (jpg):FFD8FF
PNG (png):89504E47
GIF (gif):47494638
HTML (html):68746D6C3E
ZIP Archive (zip):504B0304
RAR Archive (rar):52617221
Adobe Acrobat (pdf):255044462D312E
MS Word/Excel (xls.or.doc):D0CF11E0
5.2.2.繞過方法
- 通過Burp Suite在請求包檔案內容添加檔案頭
- 制作圖片馬:
1.使用16進制編輯器打開一個圖片,在圖片后面插入WebShell即可得到圖片馬
2.在cmd下執行:copy a.jpg/b + test.php/a shell.jpg(a.jpg要足夠小,test.php為一句話木馬)也可以得到圖片馬,
5.3.檔案加載
5.3.1.概述
影像渲染測驗,再嚴格點的甚至是進行二次渲染,
5.3.2.繞過方法
用工具對檔案空白資料區或注釋區進行代碼注入繞過(影像僅能繞過渲染測驗,而不能繞過二次渲染),
6.條件競爭繞過檔案洗掉
6.1.概述
條件競爭指多個執行緒或者行程在讀寫一個共享資料時結果依賴于它們執行的相對時間的情形,
例如:兩個行程P1和P2共享了變數a,在某一執行時刻,P1更新a為1,在另一時刻,P2更新a為2,因此兩個任務競爭地寫變數a,在這個例子中,競爭的“失敗者”(最后更新的行程)決定了變數a的最終值,
6.2.繞過方法
大量發包繞過檔案洗掉,
test.php內容:
<?php fputs(fopen('t.php','w'),'<?php eval($_REQUEST[a]);?>');?>
上傳"test.php’后通過Burp Suite爆破模塊大量發包產生條件競爭在上傳路徑中生成"t.php"內容為:
<?php eval($_REQUEST[a]);?>
其為一句話木馬
然后通過訪問t.php即可getshell
7.漏洞防御
1. 上傳的目錄設定為不可執行,只要web容器無法決議該目錄下面的檔案,即使攻擊者上傳了腳本檔案,服務器本身也不會受到影響,
2. 對檔案后綴的判斷中使用白名單的方式,
3. 檔案服務器和web服務器分離,也就是上傳的檔案單獨存放到其他的服務器之中,
4. 不需要回傳檔案路徑的情況下,隨機改寫檔案名,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295568.html
標籤:其他
上一篇:Python安全編程