淺談權(quán)限獲取方法之文件上傳
概述
文件上傳漏洞是發(fā)生在有上傳功能的應(yīng)用中,如果應(yīng)用程序?qū)τ脩舻纳蟼魑募]有控制或者存在缺陷,攻擊者可以利用應(yīng)用上傳功能存在的缺陷,上傳木馬、病毒等有危害的文件到服務(wù)器上面,控制服務(wù)器。
漏洞成因及危害
文件上傳漏洞產(chǎn)生的主要原因是:應(yīng)用中存在上傳功能,但是上傳的文件沒有經(jīng)過(guò)嚴(yán)格的合法性檢驗(yàn)或者檢驗(yàn)函數(shù)存在缺陷,導(dǎo)致可以上傳木馬文件到服務(wù)器。文件上傳漏洞危害極大因?yàn)榭梢灾苯由蟼鲪阂獯a到服務(wù)器上,可能會(huì)造成服務(wù)器的網(wǎng)頁(yè)篡改、網(wǎng)站被掛馬、服務(wù)器被遠(yuǎn)程控制、被安裝后門等嚴(yán)重的后果。
下面我們就文件上傳的幾種驗(yàn)證及繞過(guò)方法:
1.本地驗(yàn)證(前端驗(yàn)證)
前端JS過(guò)濾繞過(guò)上傳漏洞是因?yàn)閼?yīng)用程序是在前端通過(guò)JS代碼進(jìn)行的驗(yàn)證,而不是在程序后端進(jìn)行的驗(yàn)證,這樣就可以通過(guò)修改前端JS代碼的方式進(jìn)行繞過(guò)上傳過(guò)濾,上傳木馬。
那么如何判斷是否為前端驗(yàn)證呢?我個(gè)人覺得我們可以看在進(jìn)行上傳抓包的時(shí)候是否能到數(shù)據(jù)包,是否有數(shù)據(jù)流過(guò),或者可以看上傳圖片是否頁(yè)面會(huì)顯示上傳的圖片地址等。
繞過(guò):將過(guò)濾代碼刪除,修改或禁用Javascript。
2.后端驗(yàn)證及繞過(guò)
文件上傳常見驗(yàn)證:后綴名(直接驗(yàn)證),文件,文件頭(間接驗(yàn)證)。
2.1 后綴名
2.1.1 黑名單(明確不允許上傳的腳本格式后綴)
文件名過(guò)濾繞過(guò)漏洞主要是因?yàn)橥ㄟ^(guò)黑名單的方式判斷了文件上傳的類型,而且并沒有完整的過(guò)濾,導(dǎo)致攻擊者通過(guò)上傳黑名單類型之外的文件。
黑名單判斷方法:上傳文件,系統(tǒng)提示不允許上傳xxx格式文件。
繞過(guò):使用其他格式(php5,Phtml,php3)或者文件大小寫,同時(shí)也可以加一些干擾符號(hào)實(shí)現(xiàn)繞過(guò)。
2.1.2 .htaccess(偽靜態(tài)協(xié)議)-重寫解析(Apache才有并且開啟偽靜態(tài)模塊)
.htaccess文件上傳是利用.htaccess文件可以對(duì)Web服務(wù)器配置的功能,實(shí)現(xiàn)對(duì)jpg、png等后綴的文件當(dāng)做PHP文件解析的過(guò)程。
.htaccess文件(分布式配置文件)提供了一種基于每個(gè)目錄進(jìn)行配置更改的方法,包含一個(gè)或多個(gè)配置指令的文件放在特定的文檔目錄中,并且文件中的指令適用于該目錄及其所有子目錄。.htaccess是Web服務(wù)器的一個(gè)配置文件,可以通過(guò).htaccess文件實(shí)現(xiàn)Web服務(wù)器中的定義文件的解析方式、重定向等配置。
繞過(guò)方法:首先上傳1.htaccess文件。2.再上傳圖片馬。
2.1.3 空格繞過(guò)
繞過(guò)方法:數(shù)據(jù)包中文件后綴名后加一個(gè)空格實(shí)現(xiàn)繞過(guò)。
2.1.4 .繞過(guò)
繞過(guò)方法:跟空格繞過(guò)方法類似,數(shù)據(jù)包中文件后綴名后加一個(gè).實(shí)現(xiàn)繞過(guò)。
2.1.5 ::$data繞過(guò)
這是windows特有的一種協(xié)議,在window的時(shí)候如果文件名+"::$DATA"會(huì)把::$DATA之后的數(shù)據(jù)當(dāng)成文件流處理,不會(huì)檢測(cè)后綴名,且保持::$DATA之前的文件名,他的目的就是不檢查后綴名。
2.1.6 循環(huán)過(guò)濾
繞過(guò):代碼將字符串里的php替換為空。
如:a.pphphp 會(huì)變成->a.
2.1.7 白名單:明確可以上傳的格式后綴(更安全)
%00截?cái)唷?x00截?cái)啵ń⒃诘刂飞系脑恚財(cái)辔募竺鏀?shù)據(jù) )00截?cái)嗬@過(guò)只能繞過(guò)前端驗(yàn)證。
截?cái)嗟漠a(chǎn)生主要原因就是存在%00這個(gè)字符,PHP<5.3.4時(shí),會(huì)把它當(dāng)做結(jié)束符,導(dǎo)致后面的數(shù)據(jù)直接忽略,造成截?cái)啵蟼鲿r(shí)如果上傳文件的路徑可控,可以通過(guò)00截?cái)?,進(jìn)行木馬上傳。
繞過(guò)方法(path%00截?cái)啵?/p>
- 將test改為test.php%00aaa,1.php改為1.jpg這樣可以通過(guò)驗(yàn)證函數(shù)。
- test.php%00aaa中的%00進(jìn)行URL編碼,選中%00選擇【Convertselection】命令,選擇【URL】命令,選擇【URL-decode】命令進(jìn)行編碼。
3.文件類型驗(yàn)證
3.1 文件頭檢測(cè):文件頭內(nèi)容信息(如gif89a)
不同的文件都有特定的文件頭格式,開發(fā)者通過(guò)檢查上傳文件的文件頭檢測(cè)文件類型,但是這種檢測(cè)方式同樣可以被繞過(guò),只要在木馬文件的頭部添加對(duì)應(yīng)的文件頭,這樣既可以繞過(guò)檢測(cè)又不影響木馬文件的正常運(yùn)行。
常見的文件頭如下:
JPEG 0xFFD8FF
PNG0 x89504E470D0A1A0A
GIF 47 49 4638 39 61(GIF89a)
繞過(guò)方法:
- 更改頭部信息達(dá)到欺騙,如在木馬的頭文件中添加圖片文件的文件頭即可繞過(guò)檢測(cè)。
GIF89a
<?php echo`$_REQUEST[cmd]`;
?>
- 制作圖片馬
直接在圖片中插入一句話木馬,進(jìn)行上傳?!梦募?。
使用cmd命令將一張正常圖片 1.jpg 與一個(gè)包含一句話木馬的 a.txt文件,合成一個(gè)新的test.php木馬文件。
cmd命令: copy 1.jpg/b+a.txt test.php。
3.2 Content-Type檢測(cè)
Content-Type用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁(yè)的編碼,用來(lái)告訴文件接收方將以什么形式、什么編碼讀取這個(gè)文件。不同的文件都會(huì)對(duì)應(yīng)的不同的Content-Type,比如jpg文件的Content-Type為image/jpeg,php文件的Content-Type為application/octet-stream。Content-Type是在數(shù)據(jù)包的請(qǐng)求包頭中,開發(fā)者會(huì)通Content-Type的類型判斷文件是否允許上傳。
繞過(guò):Content-Type的類型可以通過(guò)抓包篡改,這樣就可以通過(guò)抓包修改數(shù)據(jù)包的Content-Type來(lái)繞過(guò)Content-Type判斷。
MIME:可以通過(guò)判斷類型猜測(cè)文件后綴名,利用抓包工具將Content-Type進(jìn)行篡改,如改為image/pjpeg、image/jpeg、image/gif、image/png四個(gè)中的一個(gè)即可繞過(guò)過(guò)濾。
4. 內(nèi)容及其他
4.1 邏輯安全:條件競(jìng)爭(zhēng)(相當(dāng)于系統(tǒng)占用)
定義:競(jìng)爭(zhēng)條件是指多個(gè)線程在沒有進(jìn)行鎖操作或者同步操作同時(shí)訪問(wèn)同一個(gè)共享代碼、變量、文件等,運(yùn)行的結(jié)果依賴于不同線程訪問(wèn)數(shù)據(jù)的順序。先將文件上傳到服務(wù)器,服務(wù)器按照規(guī)則對(duì)圖片選擇保存與刪除,漏洞點(diǎn)在于文件在保存到服務(wù)器之前并沒有進(jìn)行合法性的檢查,雖然保存后進(jìn)行了文件的檢查,但是通過(guò)競(jìng)爭(zhēng)條件漏洞,通過(guò)上傳有寫文件功能的木馬,在刪除木馬之前訪問(wèn)已經(jīng)上傳的木馬,就可以寫入新的木馬。
繞過(guò):將文件上傳到服務(wù)器后,我們就不斷進(jìn)行文件路徑訪問(wèn),由于條件競(jìng)爭(zhēng),就會(huì)達(dá)到上傳Webshell的目的,漏洞利用就是發(fā)送請(qǐng)求通過(guò)不斷上傳內(nèi)容,這樣的訪問(wèn)會(huì)生成新的木馬文件,然后再發(fā)送另一個(gè)請(qǐng)求不斷訪問(wèn)此文件,如果競(jìng)爭(zhēng)條件漏洞利用成功就會(huì)生成新的木馬。
4.2 目錄命名
繞過(guò):通過(guò)添加/.后綴讓服務(wù)器識(shí)別文件為文件夾形式,達(dá)到上傳的目的,如 -x.php/.
5.其他漏洞
腳本函數(shù)漏洞-cve
CVE-2017-12615
CVE-2015-5254
CVE-2019-2618
......
這些漏洞網(wǎng)上都有利用教程,感興趣的師傅可以去查閱一下資料。
6.中間件解析漏洞
6.1 IIS 6.0+解析漏洞
解析漏洞快速判斷,/.php看是否有亂碼,有則存在,無(wú)則不存在。
6.1.1 以文件夾執(zhí)行
正常文件名:image/aa.jpg。
繞過(guò):image.asp/aa.jpg aa.jpg就會(huì)被當(dāng)作asp解析。
6.1.2 以文件執(zhí)行
正常文件名:image.jpg。
繞過(guò):image.asp;.jpg或xxx.asp;xxx.jpg 此文件會(huì)被當(dāng)作asp執(zhí)行。
asp可以換做php 如果換了php,那么就可以當(dāng)作php執(zhí)行。
7.WAF繞過(guò)
要想繞過(guò)WAF,我們需要了解哪些參數(shù)可以修改,如:
- Content-Disposition:一般可修改。
- name:表單參數(shù)值,不能修改。
- filename:文件名,可以修改。
- Content-Type(文件自帶類型):文件MIME,視情況更改。
- waf繞過(guò)的核心就是在可以修改的參數(shù)名后不斷修改測(cè)試,嘗試?yán)@過(guò)。
常見繞過(guò)方法:
7.1 數(shù)據(jù)溢出(垃圾數(shù)據(jù)填充)
利用WAF檢測(cè)上限,添加大量垃圾數(shù)據(jù),讓其匹配不到,類似于溢出漏洞,一般可在上傳參數(shù)后面添加干擾數(shù)據(jù),垃圾數(shù)據(jù)和參數(shù)之間要記得添加;,否則數(shù)據(jù)包會(huì)報(bào)錯(cuò)。
7.2 符號(hào)變異('";)
利用程序開發(fā)漏洞,對(duì)數(shù)據(jù)包中上傳參數(shù)中的符號(hào)進(jìn)行替換,添加、刪除,達(dá)到上傳目的。如
如x.jpg;.php 分號(hào)代表一個(gè)數(shù)據(jù)的結(jié)束。
7.3數(shù)據(jù)截?cái)啵?00;換行)
文件后綴名后加個(gè)%00(空格)截?cái)?x.php%00.jpg 。
換行(類似于程序中\(zhòng)n)和數(shù)據(jù)分塊傳輸差不多,如:
- x
- p
- h
- p
數(shù)據(jù)包其實(shí)識(shí)別的是x.\np\nh\np。
7.4 重復(fù)數(shù)據(jù)
相當(dāng)于函數(shù)中的遞歸 循環(huán),將參數(shù)在數(shù)據(jù)包中寫多次原理跟垃圾數(shù)據(jù)也十分類似。
8.防御
- 部署寶塔,waf等安全產(chǎn)品。
- 對(duì)上傳的內(nèi)容進(jìn)行嚴(yán)格多次校驗(yàn)。
- 對(duì)文件內(nèi)容進(jìn)行完整性檢測(cè)。