网站安全之上传漏洞 webshell 防范

2019年4月27日21:33:51 发表评论 17
最近公司站点经常被爆 webshell 漏洞,今天与大家聊一下上传漏洞 webshell 相关防范
 

一个问题:只要有上传功能就一定有漏洞吗?

让我们假设两种场景:

(1)公司的网站管理员经常接到各种修改网站的需求,并且很多时候不在办公网内也被要求修改网站,这时管理员为了方便开发出一个单独的上传页面(不与其他页面相互引用),且这个页面只是为了方便管理员远程上传各种资源、文档,修改网站,同时他认为不会被他人发现,并没有做任何安全措施,这时如果被别有用心之辈发现,上传任意的资源,这种情况可以被称为上传漏洞么?

(2)一个网站为了更好的方便网站用户进行互动,允许上传各种图片,video 等多媒体资源,被居心不良的人发现了,通过各种手段绕过了限制,上传了任意资源,这种情况可以被称为上传漏洞么?

两个概念:上传漏洞与解析漏洞

私以为第一种是真正的上传漏洞,因为原本的目标是只打算自己偷偷用,并不希望被别人发现用来做上传,人性中懒惰的弱点被放大成为网站上的漏洞。而第二种,本意是希望被用来上传,同时对上传文件的类型加以限制,但是由于 Web 服务器开发者的某些意图、失误或者系统的某些特性,导致被别有用心的人绕过了限制,并且使 Web 服务器解析了上传的任意文件,这种应该被称为通过上传途径,利用 Web 服务器的解析漏洞导致的任意文件上传,本质上出现漏洞的是 Web 服务器的解析方式,而不是上传,既然我们说到了上传漏洞和解析漏洞的区别,那我们先来看看常见的 Web 上传方式吧。

上传漏洞表单提交是最常见的提交数据、上传资源的方式,不同的编码类型,影响着浏览器对服务端提交数据的格式,表单常见的编码类型有三种:

1、application/x-www-form-urlencoded

2、text/plain 

3、multipart/form-data

首先,让我们构造一个表单提交的场景:

前端显示为:

网站安全之上传漏洞 webshell 防范
1、application/x-www-form-urlencoded 编码

(1)表单源码

网站安全之上传漏洞 webshell 防范
(2)提交数据格式

网站安全之上传漏洞 webshell 防范

(3)说明

当编码格式为“application/x-www-form-urlencoded”时,提交的 content-type 为“application/x-www-form-urlencoded”,提交的数据为 key-value 对,这里只提交了 file=2.jpg,并没有提交 2.jpg 的具体内容。

2、text/plain 编码

(1)表单源码

网站安全之上传漏洞 webshell 防范

(2)提交数据格式

网站安全之上传漏洞 webshell 防范

(3)说明

当编码为 text/plain 时,content-type 为 text/plain,提交的数据为 key-value 对,与

“application/x-www-form-urlencoded”编码的区别在于没有使用“&”连接,这里也只提交了 file=2.jpg,并没有提交 2.jpg 的具体内容。

3、multipart/form-data 编码

(1)表单源码

网站安全之上传漏洞 webshell 防范

(2)提交数据格式

网站安全之上传漏洞 webshell 防范
(3)说明

当编码格式为 multipart/form-data 时,content-type 为 multipart/form-data,构造的表单提交,并非单纯的提交了 key-value 对,从提交数据中可以看出,提交了“2.jpg”文件的具体内容。这部分有单独的 content-type,这里为“image/jpeg”,但是最终决定在服务器上生成的文件类型,并不是由这里的 content-type 决定的,所以会出现利用解析漏洞产生的上传攻击。

解析漏洞网站允许用户上传文件到服务器一般是有限制的,若不限制上传内容,则非常容易被上传木马,从而被攻击者控制服务器,这些限制一般为只允许上传期望的文件类型,比如只允许上传图片,作为头像等,这时攻击者的目的从简单的上传木马变为怎样绕过限制上传木马,这里攻击者利用的就是各种各样的 web 服务器解析漏洞。

当编码格式为 multipart/form-data,客户端可以上传文件内容到服务器,也就会出现多种上传攻击,其本质目的都是在服务器上生成一个可解析执行的文件。

接下来让我们介绍 7 种常见的利用解析漏洞进行上传攻击的方式:

1、对 Content-type 类型进行检测

例如:当 content-type 为 image/jpeg 时(或者其他非可解析执行类型),修改 filename=”2.jpg”,为 filename=” 2.php”,这样会在服务器上产生一个 php 文件,发生了上传攻击,服务器侧编码一般类似下图:

网站安全之上传漏洞 webshell 防范

2、对图片文件头标识检测

有些情况下,防护设备识别 cotent-type 为图片的时候会检查上传的图片头部是否是图片的特殊编码,这时候在上传的 webshell 文件中写入图片的特殊标识就可以进行绕过,但是文件后缀依旧要为可执行文件的后缀,例如.php。

不同的图片文件都有不同文件头,如:

PNG: 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A

JPEG: 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)

GIF: 文件头标识 (6 bytes) 47 49 46 38 39(37) 61

3、配置文件的修改

用户的配置不可控,可能会出现特殊后缀也被当成可解析执行的文件进行解析,例如在 AddHandler、AddType 中配置 php3 当做 php 进行解析,则上传 2.php3 也发生上传攻击。这种情况严格说起来,可算作用户配置不当造成的漏洞。

4、大小写变形

针对大小写不敏感的系统(例如 windows),后缀改为 2.PhP,用于绕过对后缀的限制,服务器侧编码一般类似下图:

网站安全之上传漏洞 webshell 防范
5、空字节代码执行漏洞

在图片中嵌入 PHP 代码然后通过上传木马文件“2.jpg%00.php”,则木马文件会被当成 php 进行解析。需要注意的是要在关闭 magic_quotes_gpc 的情况下,服务器侧的编码一般如下图:

网站安全之上传漏洞 webshell 防范
6、截断

因为 IIS6 不解析“;”后面的内容,因此上传木马文件“2.asp;.jpg”,就被解析为 asp 文件。

7、目录解析

在网站有文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被 IIS6 当作 asp 文件来解析并执行。这样如果有个目录为 a.asp,那么把木马文件 2.jpg 上传到该目录下,则会被当成 asp 文件进行解析。

总结

上传 webshell,本质是利用 web 服务器的解析漏洞、系统特性绕过各种防护措施达到上传可解析执行文件的目的,以上提到的 7 种上传绕过的情况,针对不同 web 服务器、系统还可能会有其他上传漏洞的存在,在此就不一一列举。随着 Web 服务器的不断更新迭代,旧的漏洞被弥补,但是也会产生新的漏洞,现在所言的漏洞,在未来不一定还有效,现在未说的,在未来也不一定不存在。当然,360 网站云防护不仅支持防御以上提到的 7 种上传漏洞,还有更强大的漏洞防护能力等待您来亲自一探究竟~

历史上的今天:

  • 博主微信
  • 赶快加我来聊天吧
  • weinxin
  • 站长技术资源群
  • 群号:483950522
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: