Web安全-文件上传漏洞
Webshell概念
Webshell是一种利用Web服务器的漏洞或弱点,通过远程上传恶意代码到服务器上(实质上是一种网页后门),并执行命令或控制服务器的一种攻击方式。在上传过后,该文件与网站服务器web目录下的正常网页文件混在一起,然后就可以通过该文件得到一个命令执行环境
攻击者可以通过Webshell获取服务器的高权限,进而进行非法操作,例如修改服务器文件、数据库操作、执行系统命令等。Webshell具有隐蔽性高、操作方便等特点,常被用于非法攻击、入侵行为或用于进行系统安全评估和渗透测试。通常为jsp,asp,php写成的脚本文件
攻击者入侵服务器,使用webshell,无论传文件或者修改文件,必然会有一个文件包含webshell代码,我们有以下检测方式:
1.寻找静态特征,从文件代码入手检测
2.webshell通常以HTTP交互,我们可以在HTTP的请求与响应中找寻痕迹
文件上传漏洞的原因
在普通的Web程序中,用户可以上传文件,而上传的文件可以被Web应用解析。假如未对用户上传文件进行检测或者检测不严格,一旦用户上传的恶意文件(甚至是Webshell)被服务器解析后(即文件上传与解析同时出现才能利用),将造成安全问题,即有两个条件:
1.用户可以绕过服务器检测上传恶意文件
2.恶意文件可以在一定条件下被解析
常见的上传漏洞
文件解析漏洞
这类漏洞通常是伴随着Web容器解析文件(文件已经在服务器上)而产生。常见的有:IIS,Nginx,Apache,Tomcat等
IIS解析漏洞
在IIS6.0版本中有两个常见漏洞:
1.当建立起*.asa,*.asp的文件夹时,其中的任意格式文件都可以被解析为ASP脚本
2.当文件格式为*.asp;1.jpg时,该文件仍然会被当做ASP脚本被解析
Apache解析漏洞
只要是.php.结尾,且“.”无法被Apache解析,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者 xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。
用法:在一个有文件上传漏洞的有apache与php搭建的服务器上上传一个一句话木马的文件,这个文件后缀名为.php.111,我们在访问这个文件时就会被解析成php执行
PHP CGI解析漏洞
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,并将phpinfo.jpg作为PHP文件解析。如果开启了fix_pathinfo这个选项,那么就会触发在PHP中的如下逻辑:PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。
用法:在一个有文件上传漏洞的Nginx与php搭建的服务器上上传一个一句话木马的图片,当我们在上传的图片的路径下一级添加上1.php,那么图片木马就可以被解析成php语言。
文件上传漏洞
导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。
1.在客户端使用JavaScript进行文件校验,即在本地验证
2.服务端通过检测文件的Mime类型进行核验,检测出文件是否符合白名单或黑名单(部分会检测是否含恶意代码)
客户端检测
客户端检测
相较于服务端验证来说,客户端检测是非常好处理的,我们可以在客户端使用工具修改文件验证的JavaScript,也可以重新构造文件上传的HTML文档或者使用抓包软件截取报文来绕过
客户端使用工具修改文件验证的JavaScript:使用工具将报文中的表单中验证文件的对应事件删除即可
重新构造文件上传的HTML文档:通常情况下只需要删除form表单中的验证事件,将其他部分保留作为HTMl文档即可
使用抓包软件截取报文来绕过:我们可以将脚本修改成符合客户端检测的文件类型进行上传,然后进行抓包,将文件修改回原本的文件格式,这里需要注意Connect-Length的值,在修改后文件名可能会有字符长度的改变,所以为了防止可能发生的上传失败,我们需要将其修改成合适的长度
服务端检测
1.文件扩展名白名单检测:即只允许一种或几种文件类型允许被服务器接收
2.文件扩展名黑名单检测:处于黑名单中的文件类型不允许被服务器接收
3.文件重命名:即使文件上传成功,经过重命名后攻击者找到自己的脚本进行执行可能性下降
4.文件类型验证:基于MIME的验证等
绕过文件类型黑名单检测:
找到不在黑名单中的文件类型,并利用该类型的文件
针对于对字符大小写转换不敏感的平台,转换大小写绕过
3.windows平台中文件扩展名后存在 .或空格时,会自动去除,进行解析