文件上传漏洞

文件上传漏洞一般是指“上传web脚本能够被服务器解析”的问题,也就是常说的webshell的问题,要完成这个攻击需要满足以下几个条件

  • 首先,上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是web容器所覆盖到的路径。
  • 其次,用户能够从web上访问这个文件,如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那么也不能称之为漏洞。
  • 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则可能导致攻击不成功。

绕过文件上传检查功能:

  • 在针对上传文件的检查中,很多应用都是通过判断文件名后缀的方法来验证文件的安全性的。如果攻击者手动修改了上传过程的POST包,在文件名后添加一个%00字节,则可以截断某些函数对文件名的判断。因为在许多语言的函数中,例如C、PHP等语言的常用字符串处理函数中,0x00被认为市终止符。比如应用原本只允许上传JPG图片,那么可以构造文件名为xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的文件上传类型判断,但对于服务器来说,此文件因为0x00字符的截断最终会变成xxx.php。
  • 除了常见的检查文件名后缀的方法外,有的应用还会通过判断上传文件的文件头来验证文件的类型。在正常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。浏览器的MIME Sniff功能实际上也是通过读取文件的前256个字节,来判断文件的类型。为了绕过此功能常见的攻击技巧是伪造一个合法的文件头,而将真实的PHP等脚本代码附在合法的文件头之后。但此时,仍需要通过PHP来解释此图片文件。

     

Apache文件解析问题:在Apache1.x、2.x中,对文件名的解析就存在以下特性。

Apache对于文件名的解析是从后往前解析的,直到遇见一个Apache认识的文件类型为止。比如

Phpshell.php.rar.rar.rar.rar

因为Apache不认识.rar这个文件类型,所以会一直遍历后缀到.php,然后认为这是一个PHP类型的文件。

 

IIS文件解析问题:IIS6在处理文件解析时,也出过一些漏洞。前面提到的0x00字符截断文件名,在IIS和Windows环境下出现过类似的漏洞,不过截断字符变成了分号“;”。

当文件名为abc.asp;xx.jpg时,IIS 6会将此文件解析为abc.asp,文件名被截断了,从而导致脚本被执行。比如:

http://www.target.com/path/xyz.asp;abc.jpg

除此漏洞外,ISS 6还出过一个漏洞,因为处理文件夹拓展名出错,导致将/*.asp/目录下所有文件都作为ASP文件进行解析。比如:

http://www.target.com/path/xyz.asp;abc.jpg

 

设计安全的文件上传功能:

1.文件上传的目录设置为不可执行

只要web容器无法解析该目录下的文件,即攻击者上传了脚本文件,服务器本身也不会受到影响。在实际应用中,很多大型网站的上传应用,文件上传后会放到独立的存储上,做静态文件处理。

2.判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单的方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片可能包含的HTML代码。

3.使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。如果使用随机数改写了文件名和路径,将极大地增加攻击的成本。

4.单独设置文件服务器的域名

由于浏览器同源问题策略的关系,一系列客户端攻击将失效。

posted on 2019-03-29 10:43  TFpI  阅读(611)  评论(0编辑  收藏  举报

导航