由 webdav 功能引发的 RCE

本文作者:Jerry Shah (Jerry)

翻译作者:myh0st(文末点击阅读原文查看英文全文)

再开始今天的内容之前,首先理解一个东西 WebDav,WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

如果网站服务器启用 WebDav 并且给与所有权限,那么任意用户都可以远程上传、删除和修改服务器上的文件,从而导致服务器被上传 webshell。

大部分网站并非未授权就可以访问,如果未经授权去访问资源会提示 401 Unauthorized ,而验证方式是通过 basic 认证,在 header 中添加如下格式:

Authenticate: Basic YWRtMW46cEBzJHdvcmQ=

其中 amlnc2F3OmppZ3Nhdw== 是 base64 编码,编码前的内容是 adm1n:p@s$word,也就是认证需要的账号密码。

漏洞发现过程

下面就是我发现漏洞的过程:

1、首次访问时,未加任何认证信息,返回信息认证错误的信息,如图:

图片

2、由于是账号密码错误,所以尝试去找找看,webdav 的默认账号密码是什么,说不定目标没有改呢:

图片

3、使用 burp 对默认账号密码的组合,进行 base64 编码,然后尝试认证,发现账号密码还是不对:

图片

4、在一个博客中发现 xampp 的默认 webdav 的账号密码:

图片

5、再次使用 burp 编码之后,进行尝试,发现认证成功了:

图片

尝试 webdav 文件,返回 301 自动跳转 webdav 目录:

图片

尝试 webdav 目录,返回 200 状态码:

图片

6、接下来使用 OPTIONS 方法来看看目标允许那些方法,发现允许 PUT 方法:

图片

7、那么就使用 PUT 方法来上传一个文本文件试试,发现创建成功了:

图片

8、尝试上传一个 html 文件,填入 xss 的 payload,也成功上传:

图片

访问验证一下:

图片

9、由于目标网站是 xampp 搭建的 php 网站,所以尝试上传一个 php 的 webshell:

图片

访问发现 phpinfo 运行结果:

图片

10、当我再次上传 php 文件时,返回 204 状态码,可能是因为文件已存在,没有新创建文件,而是重写了文件:

图片

11、然而,在验证 shell 是否可用时,访问链接:

https://www.mytarget.com/webdav/Jerry.php and added *?JerryCommand=id*

发现命令执行成功:

图片

12、接下来尝试反弹 shell,参考反弹 shell 的备忘录:

Reverse Shell Cheat Sheet

图片

13、在 vps 上使用 nc 监听一个端口:

图片

14、看看目标系统上是否存在 python:

图片

使用 which python 命令能告诉我们目标系统使用的是 python2 还是 python3。

15、接下来使用 python 的反弹 shell payload 进行尝试,反连我的服务器:

图片

vps 上获得了一个 shell,说明反弹 shell 成功:

图片

到这里整个测试就结束了。

这个漏洞是怎么发现的?

1、首先目标启用了 webdav,并且使用了默认的账号密码,如果不是默认账号密码,那么就需要进行暴力破解,但是爆破的成功率不见得有多高,如果无法获取账号密码,则无法进行后续的测试。

2、webdav 允许所有方法,尤其是比较危险的 PUT、DELETE、COPY 等

安全建议

1、不要使用默认的认证信息

2、在无法禁用 webdav 的情况下,禁止 PUT 等危险方法

发表评论

登录后才能评论
网站客服
网站客服
申请收录 侵权处理
分享本页
返回顶部