文件上传漏洞总结:原理与利用技巧
一、形成原理
攻击者突破了服务端的限制成功上传了可执行的恶意脚本文件。(或是上传大量文件——DOS攻击)
二、绕过技巧
0x01.文件后缀拦截绕过
Ⅰ.前端验证
前端验证没有安全性可言
- 在浏览器禁用JS
- 在浏览器正常发包,用代理软件抓包并篡改
Ⅱ.黑名单验证
黑名单验证有一定的安全性,绕过的思路是利用解析漏洞(Ⅰ.利用后端验证代码存在的匹配缺陷(过滤不全)Ⅱ.利用中间件的解析漏洞)
A.利用服务端代码存在的匹配缺陷(过滤不全)
1. 可被脚本程序解析的其他后缀
php:(.phpar | .php3 | .php4 | .php5 | .phps
等)
其他参考某靶场的一个黑名单:
$deny_ext = array( ".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".ini"
);
2. 大小写绕过
.php
=> .Php
、.pHp
…
3. 双写绕过
.php
=> .phphpp
B.利用其他“组件”的漏洞
1.Apache
1.1. Apache解析漏洞
(从右往左识别,并跳过无法识别的后缀名)
如webshell.php.abc.def
=> Apache解析 => webshell.php
1.2. 上传.htaccess
来修改Apache的解析配置项
如上传这样的.htaccess文件:
<FilesMatch "webshell">
SetHandler application/x-httpd-php
</FilesMatch>
2.IIS
2.1.分号截断
webshell.php;xxx.jpg
=>webshell.php
(6.x)
2.2.斜杠绕过
webshell.jpg/1.php
=>webshell.php
(7.0、7.5)
3.Nignx
3.1.斜杠绕过
webshell.jpg/1.php
=>webshell.php
(<8.03)
4.Windows
4.1. 点绕过
.php
=> .php.
4.2. 空格绕过
后端验证代码未删除空格(从而绕过黑名单),而Windows在处理文件名时会把空格省略
.php
=> .php(空格)
4.3. ::$DATA
绕过
Windows的NTFS会将文件名后带
::$DATA
的当作文件流处理,躲过验证并保留之前的文件名
.php
=> .php::$DATA
那么文件名为“webshell”的文件都会被当作php脚本执行(这里的文件名不包含后缀,如webshell.jpg
或webshell.png
)
Ⅲ.白名单验证
白名单一般有更好的安全性(不会漏掉过滤项),绕过思路是找服务端文件操作的逻辑漏洞或更底层的截断漏洞(C语言将
0
认为是程序语句结束的标志)
1. MIME-Type绕过、Content-Type绕过(可尝试大小写)
在BurpSuite中修改即可
2. %00
绕过——GET
对于GET,在BurpSuite的Raw视图下,对请求行添加
%00
3. 0x00
绕过——POST
对于POST,则需要在BurpSuite的Hex视图下,修改对应的二进制数据
0x02.文件内容拦截绕过
1.对文件内容进行二进制验证(仅对文件头验证)
-
在文件二进制内容的开头添加文件幻数
-
GIF:
47 49 46 38 39 61
(GIF89a) -
JPG:
FF D8 FF E0 10 4A 46 49 46
-
PNG:
89 50 4E 47 0D 0A 1A 0A
-
2.进行二次渲染
对比经由服务器渲染前后的图片的二进制内容(用WinHex等),尝试把“仍然存活,未变化”的内容替换为一句话木马
3.先存再判断是否删除
条件竞争:多线程快速上传并访问一个能生成新webshell的脚本文件
4.多文件上传
在POST的body中写入多个文件数据,一个合法文件,第二个为非法内容
0x03.Ⅵ.其他
1. 制作图片马
2. 更多绕过Tips
1.多文件上传
在POST的body中写一个合法文件,再写一个webshell文件
2.上传`.user.ini`
除了上传`.htaccess`,还可以上传`.user.ini`来指定更多规则
如内容为`auto_prepend_file=webshell.jpg`,则表明php将自动包含解析`webshell.jpg`中的内容,可以配合图片马getshell
3.字符拼接
Content-Disposition: form-data; name="webShell"; filename="webshell.php"
=>
Content-Disposition: fo+rm-da+ta; name="webShell"; filename="webshell.php"
4.filename后添加空格
Content-Disposition: form-data; name="webShell"; filename="webshell.php"
=>
Content-Disposition: form-data; name="webShell"; filename ="webshell.php"