专栏首页小白帽学习之路Kali Linux Web渗透测试手册(第二版) - 5.7 - 使用ZAP测试WebSokets

Kali Linux Web渗透测试手册(第二版) - 5.7 - 使用ZAP测试WebSokets

5.7、使用ZAP测试WebSokets

由于HTTP是一种无状态协议,它将每个请求视为惟一的,与上一个和下一个请求无关,这就是为什么应用程序需要实现会话cookie等机制来管理会话中单个用户执行的操作。作为克服这一限制的替代方案,HTML5合并了WebSockets。WebSockets通过HTTP协议在客户端和服务器之间提供了一个持久的、双向的通信通道。

在这个小节中,我们将展示如何使用OWASP_ZAP来监控、拦截和修改WebSockets通信,就像我们在渗透测试期间处理普通请求一样。

环境准备

OWASP_BWA还没有包含一个使用WebSockets的应用程序,因此我们需要使用同样来自OWASP的Damn Vulnerable Web Sockets(DVWS) (https://www.owasp.org/index.php /OWASP_Damn_Vulnerable_Web_Sockets_(DVWS))来完成这个小节。

DVWS是一个基于php的开源应用程序;从它的GitHub存储库下载到您的KaliVM: https://github.com/interfer-security/dvws/。

在理想的情况下,我们只需要下载应用程序,将其复制到Apache根目录,并启动服务使其运行,但不幸的是,在Kali Linux中并非如此。

首先,您需要使用apt install php-mysqli包来安装php-mysqli。注意它的PHP版本;在我们的例子中是7.2。检查Apacheconfig文件中的PHP版本并相应地进行调整。确保PHP模块的正确版本在/etc/apache2/mods-enabled/;如果没有,从/etc/apache2/mod-available删除不必要的:

另外,检查MySQL模块是否在php.ini启用(/etc/php/<php_version>/apache2/php.ini)。查找DynamicExtensions部分并启用(删除之前的),在这行写入extension=mysqli。

接下来,配置数据库。首先,启动MySQL服务(service mysql start),然后从终端启动MySQL客户端(mysql)。在MySQL提示符下,使用createdatabase dvws_db创建DVWS数据库;然后退出MySQL。创建数据库时,我们需要创建它的表结构。DVWS包含了一个实现此目的的脚本,因此在终端中执行以下操作:mysqldvws_db < /var/ www/html/dvws/includes/dvws_db.sql(假设/var/www/html/是Apache的根目录):

由于DVWS使用预定义的主机名,我们需要将该名称的名称解析固定到本地地址,我们将使用该地址进行测试。使用您最喜欢的文本编辑器打开/etc/hosts并添加行:

127.0.0.1 dvws。

现在,我们可以使用service apache2 start启动Apache服务并浏览到http://dvws.local/ DVWS/。按照这里给出的说明操作,包括启动WebSockets侦听器(php ws-socket),并运行steup脚本来完成数据库的配置(http://dvws.local/DVWS/setup.php):

现在,我们准备继续向下进行。

实战演练

我们选择ZAP作为这个练习,因为它可以监视、拦截和重放WebSockets消息。Burp Suite可以监控websocket通信;但是,它不能拦截、修改和重放消息:

1. 将浏览器配置为使用ZAP作为代理,在ZAP中,通过单击底部面板中的plus图标启用WebSockets选项卡:

2. 现在,在浏览器中转到http://dvws.local/DVWS/,从菜单中选择Stored XSS:

3. 输入一些评论然后切换到ZAP。在History选项卡中,查找到http://dvws.local:8080/post-comments;这是启动WebSockets会话的握手包:

发起websocket通信的请求包括Sec-WebSocket-Key报头和base64编码的值。此密钥不是身份验证机制;它只帮助确保服务器不接受来自非websockets客户端的连接:

服务器的响应是101的交换协议代码,其中包括一个头Sec-WebSocket-Accept,其目的与客户机使用的键类似。

4. 在ZAP的WebSockets选项卡中,你可以看到有多个通信通道,也就是建立了多个连接,所有的消息都有一个方向(进出),一个操作码,一个有效载荷,这也就是要传输的信息:

5. 要拦截WebSocket,请单击WebSockets选项卡中的break图标添加断点。选择需要与拦截匹配的操作码、通道和载荷模式:

6. 当一个断点被命中时,消息将显示在上面的面板中,就像ZAP中的其他所有断点一样,在这里我们可以更改内容并发送或丢弃消息:

7. ZAP还具有重放/重发现有消息的能力;右键单击WebSockets选项卡中的任何一行,选择Open/Resend withMessage Editor:

8. 然后,我们将看到WebSocket Message Editor窗口,在这里我们可以更改消息的所有参数,包括消息的方向和内容,然后再次发送:

如果web应用程序易受攻击,则可以通过websocket重复的利用web应用程序中固有的大多数安全缺陷。

原理剖析

WebSocket通信是客户端通过JavaScript中的WebSocket类发起的。当创建WebSocket实例时,客户机启动与服务器的握手。当服务器响应握手并建立连接时,HTTP连接随后被WebSocket连接替换,它就变成了一个双向的二进制协议,不一定与HTTP兼容。

WebSockets是纯文本,HTTP也是。服务器仍然需要实现HTTPS来提供加密层。如果我们嗅出前面练习中(非https)与Wireshark的通信,则我们可以很容易地读取消息:

请注意客户机发送的消息是如何被隐藏的(未加密),而来自服务器的消息是如何以明文形式发送的;这是RFC 6455协议定义的一部分(http://www.rfc-base.org/txt/rfc-6455.txt)。

本文分享自微信公众号 - 小白帽学习之路(bat7089),作者:掣雷小组

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 代码审计 | Ecms定制版代码审计实战思路分享

    朋友买了一套php源码,要做类似于证书查询的功能,让我帮忙审计一下有没有高危的漏洞,仅挖掘getshell,告知我这个系统是由ecms也就是帝国cms简化来的,...

    7089bAt@PowerLi
  • 严重:PHP远程代码执行漏洞复现

    9 月 26 日,PHP 官方发布漏洞通告,其中指出:使用 Nginx + php-fpm 的服务器,在部分配置下,存在远程代码执行漏洞。并且该配置已被广泛使用...

    7089bAt@PowerLi
  • 『实战渗透』Zabbix-弱口令再到命令执行Getshell

    通过DOCUMENT_ROOT函数得知网站的绝对路径是/opt/httpd-2.4.29/htdocs:

    7089bAt@PowerLi
  • Kali Linux Web渗透测试手册(第二版) - 5.7 - 使用ZAP测试WebSokets

    thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt

    用户1631416
  • python调用PHP

    py3study
  • 解决修改 Linux 下的 PHP 环境变量不生效的方法

    这个问题出现服务器有多个 PHP 版本,php -v和phpinfo()显示两个不同的版本

    沈唁
  • PHP脚本指南-解析GNU C风格命令行选项

    我们先来说一下如何获取当前执行的脚本是什么,我们可以使用$argv来获取,$argv包含当运行于命令行下时传递给当前脚本的参数的数组

    沈唁
  • 代码审计之php.ini配置详解

    apache在启动时php.ini被读取。对于服务器模块版本的php,仅在web服务器启动时读取一次。对于CGI和CLI版本,每次调用都会被读取

    FB客服
  • php扩展模块安装

    叶瑾
  • 任意文件包含漏洞(2)

    操作系统存在最大路径长度的限制。windows系统,文件名最长256个字符,可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名被中途截断

    宸寰客

扫码关注云+社区

领取腾讯云代金券