-
前端代碼
-
邏輯繞過
-
文件內容檢測
-
文件包含、文件備份
-
容器及語言特性
-
畸形報文
-
系統特性
-
SQLI方面
上傳文件時WAF檢測點:
1)請求的url,url是否合法
2)Boundary邊界,通過Boundary邊界確定內容來檢測內容
3)MIME類型,即content-type
4)文件擴展名
5)文件內容
文件上傳後導致的常見安全問題一般有:
1)上傳文件是Web腳本語言,服務器的Web容器解釋並執行了用戶上傳的腳本,導致代碼執行。
2)上傳文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在該域下的行爲(其他通過類似方式控制策略文件的情況類似);
3)上傳文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行。
4)上傳文件是釣魚圖片或爲包含了腳本的圖片,在某些版本的瀏覽器中會被作爲腳本執行,被用於釣魚和欺詐。
本文重點是web層面的web shell
需要注意的要點:
1)上傳後的路徑在哪裏
2)上傳後的文件名是否被修改了
前端代碼繞過
主要是通過前端的JavaScript進行過濾,可以十分簡單地繞過。如正常發包,之後抓包修改。
邏輯繞過
2.1MIME檢測
- 後臺代碼通過檢測客戶端請求報文中的Content-Type字段來判斷文件類型.,可以先上傳正常文件再修改文件內容與文件名進行繞過。
- 各類文件的mime類型,百度即可,此處不列舉。
2.2文件後綴檢測
邏輯不嚴謹,過濾不嚴謹,導致被繞過
-
採用黑名單,簡單地過濾了“php”,但通過大小寫的方式可以繞過WAF;或是替換了php等關鍵字符,通過雙寫 pphphp 即可繞過,這種簡單的過濾方式可以通過上傳之後查看文件名來判斷。
-
沒有過濾.htacess文件上傳。這時可以藉助.htaccess文件來上傳惡意代碼並解析。如:上傳一個.htaccess文件,內容爲AddTypeapplication/x-httpd-php .jpg,上傳的jpg文件就可以當作php來解析
- 新建一個.htaccess 文件,裏面的內容如下:
<FilesMatch "pino"> SetHandler application/x-httpd-php </FilesMatch>
這個時候就上傳一個文件名字是pino,這個時候我們上傳一個文件名字叫做pino的文件,不要後綴名,然後裏面是一句話木馬,用菜刀連接,可以成功!
- 沒有過濾掉可以被解析的.asa、.cdx、.cer等,所以還應該使用白名單來防禦。
2.3 二次上傳
主要是代碼的邏輯漏洞,用戶上傳一次文件後,網站系統就設置允許用戶下一次的上傳,不再對用戶的上傳文件進行檢測,這個比較奇葩。
文件內容檢測
-
通過檢測文件內容是否含有正常文件的一些關鍵字符
-
是否含有惡意代碼
-
檢測文件的大小,如果文件太小了或是太大了都可能上傳失敗。可以添加一些無用的字符來增加文件的大小。
針對(1),我們可以在文件之中添加一些相應文件的標識,如下表;
類型 | 標識 |
---|---|
JPEG | 頭標識 ff d8 ,結束標識 ff d9 |
PNG | 頭標識89 50 4E 47 0D 0A 1A 0A |
GIF | 頭標識 (6 bytes) 47 49 46 38 39(37) 61 GIF89(7)a |
BMP | 頭標識 (2 bytes) 42 4D BM |
或是使用windows下的copy命令來將.php文件內容附加到正常的.png文件,合成後的文件後綴名根據情況修改。
- 假設選擇我的圖片是:1.jpg
- 一句話是:2.php
- 命令:
copy 1.jpg/b+2.php/a 1.jpg
文件包含、文件備份
-
假如網站存在文件包含漏洞,可利用文件包含 來包含任意文件,如包含png文件解析一句話木馬。
-
有的網站存在文件備份,數據庫備份等一些可以利用的功能,如將.doc文件備份爲.php文件,這些都是需要細心注意的。
容器及語言特性
PHP 版本 <5.3.4
-
據說是因爲PHP沿用了C語言空字符截斷的特性,官方認爲這不是一個漏洞,但最後還是修改了。截斷漏洞的發生是有條件的。
-
首先需要知道,在代碼層面,假如“文件名不分離”,截斷是無法作用的。比如,filename=hack.php%00.gif,PHP代碼拿到的文件名是hack.php。但是,有的程序員可能會寫下 $_FILES[ ‘uploaded’ ][‘name’ ].'png’之類的代碼導,也不檢查文件名,就導致漏洞的發生。
-
假如不是在代碼層面上檢測上傳的文件名,這個檢測者 WAF 拿到的文件名就是 hack.php%00.gif,它認爲%00是正常字符串,然後漏洞就發生了。
-
最後一點,在使用截斷%00時需要urlencode 一下。
Apache解析漏洞(Apache1.x 2.x)
文件名解析漏洞,遇到不認識的後綴類型會忽略並繼續向前尋找後綴來解析,比如a.php.gif或a.php.aaa
IIS 6.0/IIS 5.X
- 目錄名,包含 .asp.asa .cer,則該目錄下的文件都將被解析爲 .asp文件
- 文件名中,分號本身以及後面的都會被系統忽略 a.asp;.gif
- 文件名,文件後綴名字中爲.asp .asa .cer,cdx 之一,都會被解析爲 .asp文件
Nginx <8.03 空字節代碼執行漏洞
- 版本 0.5.* |0.6.* | 0.7 - 0.7.65 | 0.8 - 0.8.37
利用0截斷,如shell.jpg%00.php
訪問以下網址,服務器將把xx.jpg文件當做php解析並執行。
http://www.xxx.com/xx.jpg.php - 版本0.8.41-1.5.6
利用0截斷,如shell.png%20%00.php
IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞
PHP CGI解析漏洞
在默認Fast-CGI開啓狀況下,訪問以下網址,服務器將把xx.jpg文件當做php解析並執行。
http://www.xxx.com/xx.jpg/.php
CVE-2013-4547 Nginx解析漏洞
http://www.xxx.com/a.jpg\0.php
畸形報文
WAF對報文格式過於信任,沒有處理這類問題,可能導致被繞過。
Multi Content-Disposition:
在IIS的環境下,上傳文件時如果存在多個Content-Disposition的話,IIS會取第一個
Content-Disposition中的值作爲接收參數,而如果waf只是取最後一個的話便會被繞過。
請求正文格式問題
- 順序
Content-Disposition: form-data; name=“file1”;filename=“shell.asp”
Content-Type: application/octet-stream
正常的upload請求都是以上這樣,然而這個格式也並非強制性的,在IIS6.0下如果我們換一種書寫方式,把filename放在其他地方:
2. 插入特殊字符
一個空格導致安全狗被繞過:
Win + IIS6.0 + ASP
邊界多了兩橫槓導致,邊界匹配不成功
Win2k3 + IIS6.0 + ASP
3. 長度
數據過長導致的繞過:
waf如果對Content-Disposition長度處理的不夠好的話可能會導致繞過,例如:
基於構造長文件名,需要文件被重命名。
特殊的長文件名,文件名使用非字母數字,比如中文等最大程度的拉長,不行的話再結合一下其他的特性進行測試:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
文件覆蓋
php環境下, 開發者沒有意識到一個請求包可能包含“兩個文件”,開發者雖然對前面一個進行了十分嚴格的檢測,但是最後一個文件可以覆蓋掉前面的文件。如前面文件爲 image/gif . xx.gjf,但後面跟了一個 image/gif xx.php,最終保存的只是後面一個。
下面是一個請求包的示例。
在畸形報文方面,大家應該天馬行空地想象,大膽嘗試。
系統特性
Windows特殊字符:
當我們上傳一個文件的filename爲shell.php{%80-%99}時:
waf可能識別爲.php{%80-%99},就會導致被繞過。
Win+ IIS7.0 + PHP
NTFS ADS特性:
ADS是NTFS磁盤格式的一個特性,用於NTFS交換數據流。在上傳文件時,如果waf對請求正文的filename匹配不當的話可能會導致繞過。
Windows在創建文件時,在文件名末尾不管加多少點都會自動去除,那麼上傳時filename可以這麼寫shell.php…也可以這麼寫shell.php::$DATA…。
Win+ IIS7.0 + PHP
SQLI方面
SQLI漏洞利用
用SQLI漏洞直接寫入文件,需要滿足四個條件,要求高
-
寫的權限,通常爲 dba權限方可
-
單引號或雙引號沒有被過濾,因爲文件名必須要用它們括起來
-
知道網站在服務器中的絕對路徑
-
文件名不能重複,不算條件的條件
例如:select0xaaaa into outfile “/var/www/html/shell.php”
遇到一些網站雖然有寫的權限,但是由於寫入的文件名必須要帶單引號或是雙引號(無法用十六進制的方式),導致無法寫入,這也是蛋疼的地方。本人暫時不知道有沒有什麼辦法繞過。
phpmyadmin
假如發現並進入phpmyadmin後臺,也可以嘗試拿shell,不過還是要知道網站的據對路徑信息。
1)利用SQL執行來寫入一句話到網站後臺中。
如果網站的my.ini文件中沒有包含“secure_file_priv=
”這句話,就會提示如下錯誤信息。
如果提示寫入失敗可以嘗試其他目錄,多試試,名字爲uploads等的目錄能夠被寫的可能性更高。
2)通過日誌來GetShell
選擇變量功能
搜索關鍵字 log 找到,下面兩個東西,將"generallog"編輯爲“ON”,且修改 “general log file”位置爲網站的絕對路徑
之後在“SQL”執行功能中輸入一句話並執行就OK了,log將記錄這一句話。
競爭條件上傳
有時木馬上傳會被waf查殺,但waf查殺木馬需要時間。所以如果上傳的文件命令是生成一個新的木馬時,則可能繞過
具體做法是:
文件上傳後馬上訪問此文件,使得在未被查殺前生成一個新的木馬,新的木馬不在檢測範圍之內,於是成功繞過
開源編輯器上傳漏洞
fckeditor
文件上傳漏洞修復
-
服務器配置不當
重新配置好服務器。
服務器PUT方法配置不當可參見HTTP請求方法(PUT)。 -
開源編輯器上傳漏洞
若新版編輯器已修復漏洞,請更新編輯器版本。 -
本地文件上傳限制被繞過
在服務器後端對上傳的文件進行過濾。 -
過濾不嚴或被繞過
建議使用白名單的方法對文件進行過濾。 -
文件解析漏洞導致文件執行
升級web服務器版本或安裝相應的官方補丁。 -
文件路徑截斷
使用隨機數改寫文件名和文件路徑,不要使用用戶定義的文件名和文件路徑。
除了以上的方法之外,還可將被上傳的文件限制在某一路徑下,並在文件上傳目錄禁止腳本解析。