文件上傳漏洞
文件上傳漏洞是開發者在開發功能時沒有做足夠充分的驗證(包括前端和后端),導致用戶可以上傳惡意文件,比如木馬、病毒、惡意腳本和webshell等。
利用條件:
- 能夠獲取文件上傳后的文件名及路徑;(有的服務器上傳成功后會修改文件名及或者隱藏路徑,攻擊者首先必須知道文件上傳在哪個路徑下)
- 服務器能夠解析上傳的文件:
比如如果上傳的文件名為test.php,服務器能解析php代碼并執行,那么就能獲取webshell,但是如果服務器無法解析php文件,那么該webshell就是無效的。
比如上傳的文件名為test.php55,服務器無法解析php55后綴的文件,因此無法利用。
各個webserver服務器能解析的文件格式在配置文件里配置,比如apache2的配置文件是/etc/apache2
路徑下的apache2.json
文件,該文件里有如下配置,即apache2會加載mods-enabled目錄下的文件,在mods-enabled
文件夾里php.conf
文件則定義了哪種文件后綴可以被php解析器解析
# apache2.json
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# php.conf
# 正則表達式配置能解析的php文件后綴
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
繞過方法
思路:進行繞過嘗試時,需要判斷:
- 是否能控制上傳的文件路徑
- 是否能控制上傳的文件名
黑名單限制繞過
特殊后綴繞過
服務器設置黑名單,比如限制aps、aspx、php等后綴的文件,可以根據服務器類型,判斷哪種文件類型后綴能繞過黑名單限制且能被服務器解析來進行后綴繞過。
比如黑名單設置為php asp aspx
,可以嘗試php3
特殊后綴:
".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".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",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"
.htaccess繞過
.htaccess文件(分布式配置文件)提供了一種方式,使得配置文件可以隨文件夾不同而不同,它配置了網站或文件夾的訪問規則。
可以利用 .htaccess文件來繞過限制較為全面的黑名單過濾,白名單過濾無法進行這種方式的繞過。
利用方式:
- 上傳 .htaccess文件,文件內容設置為
AddType application/x-httpd-php .test
,即將 .test 文件以php格式進行解析, - 上傳一句話木馬文件,文件名為
shell.test
,服務器即可以php格式解析shell.test
如果服務器修改上傳的文件名,該方法無用
大小寫繞過
主要針對黑名單限制,可以把php
改為pHp
原因:
windows平臺大小寫不敏感,linux平臺大小寫敏感,但是很多web平臺開發人員會為了用戶方便將網頁配置修改為大小寫不敏感,可以以這種方式進行繞過。
空格或點繞過
空格或點繞過,在文件后綴名后加空格或點,windows在存儲文件時會自動去掉后面的空格,linux則不行。
比如.php
或.php.
白名單限制繞過
%00截斷繞過
利用條件:
- 能夠控制文件路徑和文件名;
- 服務器在解析文件結尾時以
.
進行判斷; - 服務器能成功解析到
%00
。
利用方法:盡量在上傳路徑中使用,在文件名處使用能繞過前端檢測,如果后端繼續對文件后綴進行校驗,無法繞過。
原理:
在url中 %00代表的是ascii碼中的0, 在ascii碼中0是特殊字符,會被解析為文件終止符,因此當讀到%00時程序會停止繼續往下解析。
可以使用burp進行抓包,然后在需要使用%00截斷的地方打一個空格,然后切換到hex16進制模式,找到20
字符,修改為00
,這是回到正常編碼模式,空格就變為文件終止符了。
一般的文件上傳代碼示例:
$uploaded_name = $_FILES[ 'file' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 獲取上傳文件后綴
$target_name = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; // 對上傳文件進行重命名
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ))
{
move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $target_name); // 將臨時文件移動到指定目錄
$result = $dir . $target_name;
echo "Stored in: $result";
}
else{
echo "Invalid file";
}
結合上述代碼來詳解%00截斷在文件名中使用和在上傳路徑中使用的區別:
當在文件名中使用%00時:
假設文件名為test.php
,將文件名修改為test.php%00.jpg
,前端檢測到文件名結尾為.jpg,這樣可以繞過前端檢測,但是后端php substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
這一行代碼對文件名后綴進行了提取,此時%00截斷已經發揮了作用,即此時uploaded_ext
是.php
。因此在下面的文件名后綴檢驗中,后綴名已經是.php
,無法繞過。
即如果在上傳文件名中使用%00截斷的方法,能否繞過需要看前后端的代碼。
當在上傳路徑中使用%00時:
假設上傳路徑為./upload
,我們修改上傳路徑為./upload/test.php%00
,上傳的文件名為test.jpg
,這樣可以成功上傳文件。
代碼的前三行都正常運行,獲取的文件后綴為.jpg
,服務器生成了隨機的文件名,假設為new.jpg
,if語句成功執行。
在If語句里,php代碼將上傳路徑和新生成的文件名進行拼接生成新的文件名,即./upload/test.php%00new.jpg
。然后上傳成功。
在接下來訪問url時,訪問的路徑就是http://xxx.com//upload/test.php%00new.jpg
,此時就會發生00截斷,瀏覽器會解析為http://xxx.com/upload/test.php
因此,在實際測試中,%00截斷要配合文件上傳路徑使用效果最好。
00截斷編碼問題
為什么網上有的%00不用改動,有的卻要進行urldecode呢?
因為在上傳表單中存在一個enctype的屬性,而且在enctype=”multipart/form-data”這里,是不會對表單中的數據進行解碼的。
而path(路徑)又大多存放在表單中,所以需要對%00進行urldecode
簡單粗暴點說,在碰到multipart/from-data的時候,就需要進行urldecode 了。
為什么有的%00不用改動呢?
因為path也有可能直接存在url、cookie里邊,在提交數據的時候,瀏覽器會對數據進行url編碼。到服務器,則會對數據進行一次解碼操作。
簡單些說,path在url、cookie或者上傳方式不是multipart/from-data的時候,就不用進行url編碼
https://blog.csdn.net/weixin_44840696/article/details/90581104
00截斷與%00截斷 : 講了00截斷的應用
關于上傳中00截斷的理解與分析 講的比較清楚明白
前端驗證繞過
有的服務器只在前端進行驗證,可以繞過前端的驗證
- 通過burp抓包,修改并重放網絡包,繞過前端驗證
- 刪除或禁用js代碼進行繞過
服務器解析漏洞繞過
IIS 5.x / 6.0解析漏洞
漏洞1: 當創建.asp的文件目錄時,在此目錄下的任意文件,服務器都解析為asp文件。
比如 http://www.xxx.com/xx.asp/xx.jpg
會被解析為asp文件
漏洞2: 服務器默認不解析“;”以后的內容
比如http://www.xxx.com/xx.asp;.jpg
會被解析為asp文件
Nginx解析漏洞
低版本的nginx中,php配置文件php.ini
中的cgi.fix_pathinfo
選項默認為開啟狀態,當url中有不存在的文件時,php會默認向前解析,直到找到能解析的文件。
比如http://www.xxx.com/phpinfo.jpg/1.php
,在服務器中1.php
不存在,會向前解析,解析phpinfo.jpg
文件,但是會以php
的格式進行解析,即解析為phpinfo.php
。
Apache 1.x / 2.x 解析漏洞
Apache從右向左判斷文件后綴,跳過非可識別的后綴,直到找到可識別的后綴然后按照可識別的后綴進行解析。
比如http://www.xxx.com/test.php.abc
,apache無法識別abc
后綴,向前識別到php
后綴,最后該文件以php文件格式進行解析
windows文件流特性繞過
windows文件流
文件內容檢測繞過
有些系統會檢測文件內容,可以將php文件和圖片文件進行結合
比如圖片文件 test.png,php文件為test.php
執行命令cat test.php >> test.png
,可以將test.php文件成功追加在test.png文件后面且可以執行
有時網上找的圖片進行拼接時無法運行php,是因為圖片里的有些字符無法被識別,可以刪除一些非關鍵內容,只保留圖片的文件頭,這樣既保存了文件格式,也可以被php解析器解析進行代碼執行。
防御方式
文件類型檢測
使用白名單、黑名單
安全的函數
使用安全啊的函數
webserver安全配置
熟悉webserver,使用安全的webserver版本,進行安全的配置
漏洞鏈
有時單一的漏洞無法完成,可以利用多個漏洞結合的方式來完成繞過
比如 文件上傳漏洞 + 本地文件包含漏洞