文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力
产生条件
- 上传的文件能够被Web容器解释并执行(所以上传后文件所在目录是Web容器所覆盖到的路径)
- 用户能够从Web上访问这个文件
- 上传文件时,服务端代码没有对客户端上传的文件进行严格的验证和过滤
危害:
非法用户利用上传的恶意脚本文件控制整个网站甚至控制服务器,这个恶意文件被称为WebShell,WebShell脚本具有非常强大的功能,比如,查看服务器目录,服务器文件,系统命令等
利用:
- 首先,找到文件上传点
- 通过BurpSuite抓包,判断是否存在文件上传漏洞
- 尝试上传文件,来判断文件验证方式,并尝试绕过
上传一句话木马,并找到文件上传的路径
通过菜刀或冰蝎连接一句话木马
修复:
- 在服务器端进行验证,设置黑白名单,限制可以上传文件的类型
- 对上传的文件进行重命名
- 隐藏文件上传的路径
- 文件上传目录设置为不可执行
绕过:
- 前端检测
- 在文件未上传时就进行验证和没有验证没有任何区别,可以通过抓包的形式,截取数据包进行绕过
- 使用 0x00 或 [\0] 截断某些函数对文件名的判断(如,1.php[\0].jpg最终会变成1.php)
- 后端检测
- 在文件上传后,服务器端进行检测,会检查文件拓展名是否合法,是否包含恶意代码等,但是进行后端验证也不是绝对安全,当服务器存在解析漏洞时,也可以绕过进行上传,常见的解析漏洞有IIS解析漏洞,Apache解析漏洞,PHP CGI 解析漏洞等
IIS解析漏洞
- 版本:IIS6.0
IIS6.0在解析文件时存在两个解析漏洞
建立.asp,.asa格式的文件夹时,其目录下的任意文件都将被当作asp文件来解析。
如,
1. 在demo.asp文件夹下建立test.txt文件
test.txt在demo.asp文件夹下,所以test.txt会被当做ASP脚本执行
2. 当文件为*.asp;1.jpg时,IIS6.0同样会以ASP脚本来执行
如,建立test.asp;1.jpg,文件中内容会当作ASP脚本执行
WebDav扩展漏洞
WebDav是一种基于HTTP1.1协议的通信协议,扩展了HTTP协议,在GET,POST,HEAD等几个HTTP标准方法中添加了新方法
如:
1. 使用OPTIONS探测服务器所支持的HTTP方法
请求:
OPTIONS / HTTP/1.1
Host:www.secbug.org
2. 使用PUT方法向服务器上传脚本文件
请求:
PUT /a.txt HTTP/1.1
Host:www.secbug.org
<%eval request(“chopper”)>
3. 使用MOVE方法改名
请求:
MOVE /a.txt HTTP/1.1
Host www.secbug.org
Destination:https://www.secbug.org/cmd.sap
4. 使用DELETE方法删除服务器上任意文件
请求:
DELETE /a.txt HTTP/1.1
Host: www.secbug.org
Apache解析漏洞
版本:Apache1.*和Apache2.*
- Apache解析文件原则:
当碰到不认识的扩展名时,将会从后向前解析,直到碰上认识的为止,如果都不认识,就会暴露源码
如
Test.php.rar.xs.aa
Apache首先解析aa,然后向前解析,直到遇到可以解析的后缀
在Apache安装目录下,有 “/confi/mime.types” 保存文件扩展名详细列表
PHP CGI 解析漏洞
- 访问<www.xxx.com/1.jpg/2.php>,此时1.jpg会被当作php脚本解析(2.php是不存在的文件)
(在IIS7.0,IIS7.5等WEB容器也存在)
产生原因:在PHP配置文件有一个选项:cgi.fi:x_pathinfo,在某些版本中是默认开启的,这就导致PHP在解析URL时,遇到不存在的文件时,继续向前解析
MS08067安全实验室
Frieza