⽂件上传漏洞的原理、危害及防御
⼀. 什么是⽂件上传漏洞
Web应⽤程序通常会有⽂件上传的功能, 例如在 BBS发布图⽚ , 在个⼈⽹站发布ZIP 压缩包, 在办公平台发布DOC⽂件等 , 只要 Web应⽤程序允许上传⽂件, 就有可能存在⽂件上传漏洞.
什么样的⽹站会有⽂件上传漏洞?
⼤部分⽂件上传漏洞的产⽣是因为Web应⽤程序没有对上传⽂件的格式进⾏严格过滤 , 还有⼀部分是攻击者通过 Web服务器的解析漏洞来突破Web应⽤程序的防护, 后⾯我们会讲到⼀些常见的解析漏洞, 最后还有⼀些不常见的其他漏洞, 如 IIS PUT 漏洞等 .
⼆. ⽂件上传漏洞的危害
上传漏洞与SQL注⼊或 XSS相⽐ , 其风险更⼤ , 如果 Web应⽤程序存在上传漏洞 , 攻击者甚⾄可以直接上传⼀个webshell到服务器上 .
三. 常见的解析漏洞
1.IIS 解析漏洞
IIS6.0 在解析⽂件时存在以下两个解析漏洞 .
①当建⽴ *.asa 、*.asp 格式的⽂件夹时 , 其⽬录下的任意⽂件⾖浆被 IIS 当作 asp ⽂件来解析 .
②在 IIS6.0 下 , 分号后⾯的扩展名不会被解析 , 也就是说当⽂件为 *.asp;.jpg
时,IIS6.0 同样会以 ASP脚本来执⾏ .
2.Apache 解析漏洞
在 Apache 1.x 和 Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同 .
Apache 在解析⽂件时有⼀个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . ⽐如 :
1.aa
下载apacheApache ⾸先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名 , 这样⼀直遍历到认识的扩展名为⽌ , 然后再将其进⾏解析 .
3.PHP CGI 解析漏洞
在 PHP的配置⽂件中有⼀个关键的选项 : cgi.fi: x_pathinfo. 这个选项在某些版本是
默认开启的 , 在开启时访问 url, ⽐如是不存在的⽂件 , 所以 php 将会向前递归解析 , 于是就造成了解析漏洞 . 由于这种漏洞常见于 IIS7.0 、IIS7.5 、 Nginx 等 Web服务器 , 所以经常会被误认为是这些 Web服务器的解析漏洞 .
4.Nginx <8.03 空字节代码执⾏漏洞
影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37
Nginx 在图⽚中嵌⼊ PHP代码 , 然后通过访问 xxx.jpg%00.php 可以执⾏其中的代码 .
5. 其他
在 windows 环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类⽂件都是不允许存在的 , 若这样命名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在⽂件名后加⼀个空格或者点绕过⿊名单 . 若上传成功 , 空格和点都会被 windows ⾃动消除 , 这样也可以 getshell.
如果在 Apache 中 .htaccess 可被执⾏ . 且可被上传 . 那可以尝试在 .htaccess 中写⼊ :
SetHandlerapplication/x-httpd-php
然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php ⽂件 .
四. ⽂件上传漏洞的防御⽅法
很多开发者仅仅通过使⽤ javascript 来防御⾮法⽂件上传 , 这样验证对于⼀些普通⽤户防⽌上传错误还可以 , 对专业的技术⼈员来说 , 这是⾮常低级的验证 . 攻击者可以通过⾮常多的⽅法来突破前端验证 , 下⾯举两个例⼦ :
1. 使⽤ FireBug
FireBug 是⼀款开源的浏览器插件, 它⽀持Firefox,Chrome 等浏览器 . 它可以让Web开发者轻松地调试HTML、javascirpt 、AJAX、 CSS等前端脚本代码 . 正是因为 FireBug 功能强⼤, 所以也成为了⿊客的必备利器 .
如何使⽤ FireBug 绕过客户端检测 .
当单击提交按钮后 ,Form 表单将会触发 onsubmit 事件 ,onsubmit 事件将会调⽤ checkFile 函数 .checkFile 函数将会检测⽂件扩展名是否合法 , 并返回⼀个布尔值 , 如果 checkFile 函数返回 true, 则表单提交 , 反之则拦截要上传的⽂件 . 知道这⼀点后 , 可以⽤ FireBug 将 onsubmit 事件删除 , 这样就可以绕过 javascript 函数验证 .
2. 中间⼈攻击
中间⼈攻击和使⽤ FireBug 的⽅法完全不同 ,FireBug 是删除客户端的 javascript 验证 , ⽽使⽤ Burp Suite 等抓包软件则是按照正常的流程通过 javascript 验证 , 然后在传输中的 HTTP层做修改 .
⾸先把⽊马⽂件的扩展名字改为⼀张正常图⽚或⽂档的扩展名 , 如 jpg 扩展名 , 在上传时使⽤ Burp 拦截上传数据 , 再将其中的扩展名 jpg 修改成 jsp, 就可以绕过客户端验证 .
通过以上例⼦ , ⼤家可以看出前端脚本验证是⼀种⾮常不可靠的验证⽅式 , 不管是对⽂件上传、XSS还是别的漏洞来说都是如此, 当然这并不是说完全不需要做前端验证 , ⽽是要把前端验证和服务器端验证相结合 .
我们来看服务端检测 , 在上传⽂件时 , ⼤多开发者会对⽂件扩展名检测 , 验证⽂件扩展名通常有两种⽅式 : ⿊名单和⽩名单 .
⿊名单过滤是⼀种不安全的⽅式 , ⿊名单定义了⼀系列不安全的扩展名 , 服务器端在接收⽂件后 , 与⿊名单扩展名对⽐ , 如果发现⽂件扩展名与⿊名单⾥的扩展名匹配 , 则认为⽂件不合法 .
为什么⿊名单过滤是⼀种不安全的⽅式呢 ?
⽐如⼀个 Web服务器为 IIS6.0,Web 语⾔为 asp 的⽹站 , 假定开发者使⽤了⿊名单过滤 ,
过滤了 asp、 asa、 cer 等⽂件格式 , 那么可以尝试以下⼏种⽅式来绕过 : 1. ⼤⼩写 , ⽐如 AsP、 cER等.
2. 被忽略的扩展名 ,IIS6.0 会把 cdx 格式的⽂件当成 asp 来解析 .
3. 配合解析漏洞 , 上传 asp;.jpg 格式⽂件 .
4. 如果 Web服务器开启了其他语⾔的⽀持 , ⽐如可以解析 php ⽂件 , 那么可以上传 php
格式的⽊马 .
5. 利⽤ Windows 系统⾃动去除 . 和空格的特性 , 如上传扩展名 asp. 格式的⽂件来绕过 .
通过以上⼏个例⼦可以看出 , ⿊名单过滤的可靠性并不⾼ , ⽩名单过滤相对来说较为可靠.
⽩名单与⿊名单的机智恰恰相反 , ⿊名单是定义不允许上传的扩展名 , ⽩名单则是定义允许上传的扩展名 , 虽然采⽤⽩名单可以防御未知风险 , 但是不能完全依赖⽩名单 , 因为⽩名单不能完全防御上传漏洞 , 例如各种解析漏洞等 , ⽩名单仅仅是防御上传漏洞的第⼀步 . 通常会结合其他验证⽅式来使⽤ , 虽然不能完全防御⽂件上传漏洞 , 但也基本上规避了绝⼤部分风险.。
其他⼏种⽂件上传漏洞防御⽅法 :
1. 检查⽂件上传路径 ( 避免 0x00 截断、 IIS6.0 ⽂件夹解析漏洞、⽬录遍历 )
2. ⽂件扩展名检测 ( 避免服务器以⾮图⽚的⽂件格式解析⽂件 )
3. ⽂件 MIME验证 ( ⽐如 GIF 图⽚ MIME为 image/gif,CSS ⽂件的 MIME为 text/css 等 ) 3. ⽂件内容检测 ( 避免图⽚中插⼊ webshell)
4. 图⽚⼆次渲染 ( 最变态的上传漏洞防御⽅式 , 基本上完全避免了⽂件上传漏洞 )
5. ⽂件重命名 ( 如随机字符串或时间戳等⽅式 , 防⽌攻击者得到 webshell 的路径 )
另外值得注意的⼀点是, 攻击者上传了webshell之后需要得到webshell 的路径才能通过⼯具连接 webshell, 所以尽量不要在任何地⽅ ( 如下载链接等 ) 暴露⽂件上传后的地址, 在这⾥必须要提⼀点 , 就是有很多⽹站的上传点在上传了⽂件之后不会在⽹页上或下载链接中暴露⽂件的相对路径, 但是在服务器返回的数据包⾥却带有⽂件上传后的路径 .
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论