文件上傳漏洞
文件上傳漏洞是開發(fā)者在開發(fā)功能時沒有做足夠充分的驗證(包括前端和后端)千元,導(dǎo)致用戶可以上傳惡意文件哈误,比如木馬暖眼、病毒惕耕、惡意腳本和webshell等。
利用條件:
- 能夠獲取文件上傳后的文件名及路徑诫肠;(有的服務(wù)器上傳成功后會修改文件名及或者隱藏路徑司澎,攻擊者首先必須知道文件上傳在哪個路徑下)
- 服務(wù)器能夠解析上傳的文件:
比如如果上傳的文件名為test.php,服務(wù)器能解析php代碼并執(zhí)行栋豫,那么就能獲取webshell挤安,但是如果服務(wù)器無法解析php文件,那么該webshell就是無效的丧鸯。
比如上傳的文件名為test.php55蛤铜,服務(wù)器無法解析php55后綴的文件,因此無法利用丛肢。
各個webserver服務(wù)器能解析的文件格式在配置文件里配置围肥,比如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>
繞過方法
思路:進行繞過嘗試時,需要判斷:
- 是否能控制上傳的文件路徑
- 是否能控制上傳的文件名
黑名單限制繞過
特殊后綴繞過
服務(wù)器設(shè)置黑名單派敷,比如限制aps蛹批、aspx、php等后綴的文件篮愉,可以根據(jù)服務(wù)器類型,判斷哪種文件類型后綴能繞過黑名單限制且能被服務(wù)器解析來進行后綴繞過差导。
比如黑名單設(shè)置為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文件(分布式配置文件)提供了一種方式,使得配置文件可以隨文件夾不同而不同设褐,它配置了網(wǎng)站或文件夾的訪問規(guī)則颠蕴。
可以利用 .htaccess文件來繞過限制較為全面的黑名單過濾泣刹,白名單過濾無法進行這種方式的繞過。
利用方式:
- 上傳 .htaccess文件犀被,文件內(nèi)容設(shè)置為
AddType application/x-httpd-php .test
椅您,即將 .test 文件以php格式進行解析, - 上傳一句話木馬文件寡键,文件名為
shell.test
掀泳,服務(wù)器即可以php格式解析shell.test
如果服務(wù)器修改上傳的文件名,該方法無用
大小寫繞過
主要針對黑名單限制西轩,可以把php
改為pHp
原因:
windows平臺大小寫不敏感员舵,linux平臺大小寫敏感,但是很多web平臺開發(fā)人員會為了用戶方便將網(wǎng)頁配置修改為大小寫不敏感藕畔,可以以這種方式進行繞過马僻。
空格或點繞過
空格或點繞過,在文件后綴名后加空格或點注服,windows在存儲文件時會自動去掉后面的空格韭邓,linux則不行。
比如.php
或.php.
白名單限制繞過
%00截斷繞過
利用條件:
- 能夠控制文件路徑和文件名溶弟;
- 服務(wù)器在解析文件結(jié)尾時以
.
進行判斷女淑; - 服務(wù)器能成功解析到
%00
。
利用方法:盡量在上傳路徑中使用可很,在文件名處使用能繞過前端檢測诗力,如果后端繼續(xù)對文件后綴進行校驗,無法繞過我抠。
原理:
在url中 %00代表的是ascii碼中的0苇本, 在ascii碼中0是特殊字符,會被解析為文件終止符菜拓,因此當讀到%00時程序會停止繼續(xù)往下解析瓣窄。
可以使用burp進行抓包,然后在需要使用%00截斷的地方打一個空格纳鼎,然后切換到hex16進制模式俺夕,找到20
字符,修改為00
贱鄙,這是回到正常編碼模式劝贸,空格就變?yōu)槲募K止符了。
一般的文件上傳代碼示例:
$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";
}
結(jié)合上述代碼來詳解%00截斷在文件名中使用和在上傳路徑中使用的區(qū)別:
當在文件名中使用%00時:
假設(shè)文件名為test.php
逗宁,將文件名修改為test.php%00.jpg
映九,前端檢測到文件名結(jié)尾為.jpg,這樣可以繞過前端檢測瞎颗,但是后端php substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
這一行代碼對文件名后綴進行了提取件甥,此時%00截斷已經(jīng)發(fā)揮了作用捌议,即此時uploaded_ext
是.php
。因此在下面的文件名后綴檢驗中引有,后綴名已經(jīng)是.php
瓣颅,無法繞過。
即如果在上傳文件名中使用%00截斷的方法譬正,能否繞過需要看前后端的代碼宫补。
當在上傳路徑中使用%00時:
假設(shè)上傳路徑為./upload
,我們修改上傳路徑為./upload/test.php%00
导帝,上傳的文件名為test.jpg
守谓,這樣可以成功上傳文件。
代碼的前三行都正常運行您单,獲取的文件后綴為.jpg
斋荞,服務(wù)器生成了隨機的文件名,假設(shè)為new.jpg
虐秦,if語句成功執(zhí)行平酿。
在If語句里,php代碼將上傳路徑和新生成的文件名進行拼接生成新的文件名悦陋,即./upload/test.php%00new.jpg
蜈彼。然后上傳成功。
在接下來訪問url時俺驶,訪問的路徑就是http://xxx.com//upload/test.php%00new.jpg
幸逆,此時就會發(fā)生00截斷,瀏覽器會解析為http://xxx.com/upload/test.php
因此暮现,在實際測試中还绘,%00截斷要配合文件上傳路徑使用效果最好。
00截斷編碼問題
為什么網(wǎng)上有的%00不用改動栖袋,有的卻要進行urldecode呢拍顷?
因為在上傳表單中存在一個enctype的屬性,而且在enctype=”multipart/form-data”這里塘幅,是不會對表單中的數(shù)據(jù)進行解碼的昔案。
而path(路徑)又大多存放在表單中,所以需要對%00進行urldecode
簡單粗暴點說电媳,在碰到multipart/from-data的時候踏揣,就需要進行urldecode 了。
為什么有的%00不用改動呢匾乓?
因為path也有可能直接存在url呼伸、cookie里邊,在提交數(shù)據(jù)的時候钝尸,瀏覽器會對數(shù)據(jù)進行url編碼括享。到服務(wù)器,則會對數(shù)據(jù)進行一次解碼操作珍促。
簡單些說铃辖,path在url、cookie或者上傳方式不是multipart/from-data的時候猪叙,就不用進行url編碼
https://blog.csdn.net/weixin_44840696/article/details/90581104
00截斷與%00截斷 : 講了00截斷的應(yīng)用
關(guān)于上傳中00截斷的理解與分析 講的比較清楚明白
前端驗證繞過
有的服務(wù)器只在前端進行驗證娇斩,可以繞過前端的驗證
- 通過burp抓包,修改并重放網(wǎng)絡(luò)包穴翩,繞過前端驗證
- 刪除或禁用js代碼進行繞過
服務(wù)器解析漏洞繞過
IIS 5.x / 6.0解析漏洞
漏洞1: 當創(chuàng)建.asp的文件目錄時犬第,在此目錄下的任意文件,服務(wù)器都解析為asp文件芒帕。
比如 http://www.xxx.com/xx.asp/xx.jpg
會被解析為asp文件
漏洞2: 服務(wù)器默認不解析“歉嗓;”以后的內(nèi)容
比如http://www.xxx.com/xx.asp;.jpg
會被解析為asp文件
Nginx解析漏洞
低版本的nginx中,php配置文件php.ini
中的cgi.fix_pathinfo
選項默認為開啟狀態(tài)背蟆,當url中有不存在的文件時鉴分,php會默認向前解析,直到找到能解析的文件带膀。
比如http://www.xxx.com/phpinfo.jpg/1.php
志珍,在服務(wù)器中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文件流
文件內(nèi)容檢測繞過
有些系統(tǒng)會檢測文件內(nèi)容办铡,可以將php文件和圖片文件進行結(jié)合
比如圖片文件 test.png,php文件為test.php
執(zhí)行命令cat test.php >> test.png
琳要,可以將test.php文件成功追加在test.png文件后面且可以執(zhí)行
有時網(wǎng)上找的圖片進行拼接時無法運行php寡具,是因為圖片里的有些字符無法被識別,可以刪除一些非關(guān)鍵內(nèi)容稚补,只保留圖片的文件頭童叠,這樣既保存了文件格式,也可以被php解析器解析進行代碼執(zhí)行。
防御方式
文件類型檢測
使用白名單厦坛、黑名單
安全的函數(shù)
使用安全啊的函數(shù)
webserver安全配置
熟悉webserver五垮,使用安全的webserver版本,進行安全的配置
漏洞鏈
有時單一的漏洞無法完成杜秸,可以利用多個漏洞結(jié)合的方式來完成繞過
比如 文件上傳漏洞 + 本地文件包含漏洞