前言
文件上傳是很常用的功能點璧瞬,如:上傳頭像登刺、上傳附件亡鼠、保存文件等,文件上傳漏洞的思想很簡單华嘹,即可以將包含惡意代碼的文件上傳到服務(wù)器,并且能夠解析執(zhí)行确封,從而實現(xiàn)getshell除呵。
首先再菊,本文將介紹如何解析執(zhí)行文件以及已知的一些解析漏洞;
然后颜曾,本文將講解常見文件上傳漏洞的防御方式以及繞過方法纠拔;
最后,本文會提供修復(fù)文件上傳漏洞的建議泛豪。
解析&解析漏洞
Apache默認(rèn)解析的后綴名
FilesMatch ".+\.ph(p[3457]?|t|tml)$">
IIS默認(rèn)解析的后綴名
IIS6.0
.asp .asa .cer .cdx
通過aspnet_isapi.dll解析
Tomcat默認(rèn)解析的后綴名
<servlet-mapping>
? ? ? ? <servlet-name>jsp</servlet-name>
? ? ? ? <url-pattern>*.jsp</url-pattern>
? ? ? ? <url-pattern>*.jspx</url-pattern>
</servlet-mapping>
IIS解析漏洞
IIS6.0:*.asa或*.asp格式的目錄下的任意文件會被IIS當(dāng)作asp文件來解析
IIS6.0:當(dāng)文件名為*.asp;1.jpg類型的格式時稠诲,會被IIS當(dāng)做ASP腳本執(zhí)行
順帶提一下,當(dāng)開啟WebDav拓展诡曙,并且只是PUT臀叙、Move、Copy价卤、Delete等方法時劝萤,可被上傳惡意腳本
OPTIONS查看支持的方法
PUT上傳文件
Move或Copy修改文件名
Apache解析漏洞
Apache 1.x & 2.x:當(dāng)Apache遇到不認(rèn)識的后綴名時,如:1.php.xx慎璧,會從后往前依次嘗試解析床嫌,直到發(fā)現(xiàn)認(rèn)識的php后綴名,遂當(dāng)做PHP腳本解析胸私。(apache認(rèn)識的后綴名儲存在/etc/mime.types)
Nginx解析漏洞
(PHP CGI解析漏洞):http://ultramangaia.cn/gg.jpg厌处,在這個網(wǎng)址后面加上1.php,即http://ultramangaia.cn/gg.jpg/1.php岁疼,會被解析成PHP腳本阔涉。(php.ini文件中cgi.fix_pathinfo開啟時/此漏洞也可能會出現(xiàn)在IIS7.0、IIS7.5捷绒、Lighttpd等瑰排,因為是PHP CGI的問題)
空字節(jié):http://ultramangaia.cn/gg.jpg,在這個網(wǎng)址后面加上%00.php疙驾,即http://ultramangaia.cn/gg.jpg%00.php會導(dǎo)致解析為PHP腳本
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
文件上傳漏洞防御及繞過方法
客戶端校驗
? JavaScript 檢查后綴名
? 繞過:Burp Suite 改后綴名
服務(wù)端校驗
? 文件頭content-type字段校驗(eg. image/gif)
? 繞過:修改content-type字段
? 文件頭校驗(eg. GIF89a)
? 繞過:生成圖片馬繞過
? 后綴名黑名單/正則黑名單
? 繞過:黑名單覆蓋不全時凶伙,可換后綴名繞過
? 繞過:大小寫繞過
? 后綴名白名單/正則白名單
其他特性利用
Windows環(huán)境的奇葩規(guī)則,如會自動去掉不符合規(guī)則符號后面的內(nèi)容
gaia.php[空格]
gaia.php.
gaia.php:1.jpg? ? (注:生成的文件內(nèi)容是空白的)
gaia.php::$DATA
gaia.php::$INDEX_ALLOCATION (注:生成文件夾)
gaia.php::$DATA.jpg? (注:生成0.jpg)
gaia.php::$DATA\aaa.jpg (注:生成aaa.jpg)
上傳.htaccess改變解析方式
AddType application/x-httpd-php xxx
會將xxx后綴的文件它碎,用PHP解析
或者
<FilesMatch "shell.jpg">
? SetHandler application/x-httpd-php
</FilesMatch>
會將shell.jpg用PHP解析函荣。
文件上傳漏洞修復(fù)建議
白名單機制
強行重命名為特定后綴名
檢查文件內(nèi)容
文件保存隨機的文件名,在數(shù)據(jù)庫中映射后綴扳肛,返回時傻挂,設(shè)置Content-Type
隱藏文件路徑
文件路徑在web目錄之外,不能直接訪問到
將上傳的文件保存到OSS(阿里云)