Python Penetration Testing 简明教程

Python Penetration Testing - SQLi Web Attack

SQL 注入是一组 SQL 命令,它们被置于 URL 字符串或数据结构中,以便从与 Web 应用程序连接的数据库中检索我们想要的响应。这类攻击通常发生在使用 PHP 或 ASP.NET 开发的网页上。

SQL 注入攻击可用于以下目的 −

  1. 修改数据库内容

  2. 修改数据库内容

  3. 执行应用程序不允许的不同查询

当应用程序在将输入传递到 SQL 语句之前未正确验证输入时,这种类型的攻击就会发生。注入通常放在地址栏、搜索字段或数据字段中。

检测 Web 应用程序是否容易受到 SQL 注入攻击的最简单方法是在字符串中使用 " ‘ " 字符,并查看是否会收到任何错误。

Types of SQLi Attack

在本节中,我们将了解不同类型的 SQLi 攻击。攻击可分为以下两种类型 −

  1. 带内 SQL 注入(简单 SQLi)

  2. 推理 SQL 注入 (盲注 SQLi)

In-band SQL injection (Simple SQLi)

这是最常见的 SQL 注入。此类 SQL 注入主要发生在攻击者能够使用相同通信渠道发起攻击和集合结果的情况下。带内 SQL 注入进一步分为两种类型 −

  1. Error-based SQL injection - 一种基于错误的 SQL 注入技术依赖于数据库服务器抛出的错误消息来获取有关数据库结构的信息。

  2. Union-based SQL injection - 这是另一种带内 SQL 注入技术,它利用 UNION SQL 运算符将两个或更多 SELECT 语句的结果组合成一个结果,然后将该结果作为 HTTP 响应的一部分返回。

Inferential SQL injection (Blind SQLi)

在这种类型的 SQL 注入攻击中,攻击者无法通过带内方式看到攻击结果,因为没有数据通过 Web 应用程序传输。这就是它也被称为盲注 SQLi 的原因。推理 SQL 注入还有两种类型 −

  1. Boolean-based blind SQLi - 此类技术依赖于向数据库发送 SQL 查询,这会强制应用程序返回不同的结果,具体取决于查询返回的是 TRUE 还是 FALSE 结果。

  2. Time-based blind SQLi - 此类技术依赖于向数据库发送 SQL 查询,这会强制数据库在响应之前等待指定的时间(以秒为单位)。响应时间会向攻击者指示查询结果是 TRUE 还是 FALSE。

Example

所有的 SQLi 类型都可以通过操控应用程序的输入数据来实现。在以下示例中,我们编写一个 Python 脚本来向应用程序注入攻击向量,并分析输出以验证攻击的可能性。在此处,我们将使用名为 mechanize 的 Python 模块,该模块提供从网页中获取 Web 表单,并便于提交输入值的功能。我们还针对客户端验证使用了此模块。

以下 Python 脚本有助于通过 mechanize 提交表单并分析响应 −

首先,我们需要导入 mechanize 模块。

import mechanize

现在,提供在提交表单后获取响应的 URL 的名称。

url = input("Enter the full url")

下面这一行代码将打开 url。

request = mechanize.Browser()
request.open(url)

现在,我们需要选择表单。

request.select_form(nr = 0)

在此,我们将设置列名“id”。

request["id"] = "1 OR 1 = 1"

现在,我们需要提交该表单。

response = request.submit()
content = response.read()
print content

上述脚本将打印 POST 请求的响应。我们提交了一个攻击向量来破坏 SQL 查询,并打印表中的所有数据,而不是一行。所有攻击向量都将保存在纯文本文件中,例如 vectors.txt。现在,下面给出的 Python 脚本将从文件中获取这些攻击向量,并逐个发送到服务器。它还将输出保存到文件。

首先,让我们导入 mechanize 模块。

import mechanize

现在,提供在提交表单后获取响应的 URL 的名称。

url = input("Enter the full url")
   attack_no = 1

我们需要从文件中读取攻击媒介。

With open (‘vectors.txt’) as v:

现在可以用每个阵列向量发送请求

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

现在,以下代码行将响应写入输出文件。

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

通过检查和分析响应,我们可以识别可能的攻击。例如,如果它提供包含句子 You have an error in your SQL syntax 的响应,则说明表单可能受到 SQL 注入的影响。