Python 渗透测试 - SQLi Web 攻击

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

SQL 注入攻击可以出于以下目的进行 −

  • 修改数据库的内容

  • 修改数据库的内容

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

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

检测 Web 应用程序是否容易受到 SQL 注入攻击的最简单方法是使用字符串中的"'"字符,然后查看是否出现任何错误。

SQLi 攻击的类型

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

  • 带内 SQL 注入 (简单 SQLi)

  • 推理 SQL 注入 (盲 SQLi)

带内 SQL 注入 (简单 SQLi)

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

  • 基于错误的 SQL 注入 − 基于错误的 SQL 注入技术依赖于数据库服务器抛出的错误消息来获取有关数据库结构的信息。

  • 基于联合的 SQL 注入 − 这是另一种带内 SQL 注入技术,它利用 UNION SQL 运算符将两个或多个 SELECT 语句的结果组合成一个结果,然后作为 HTTP 响应的一部分返回。

推理 SQL 注入 (Blind SQLi)

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

  • 基于布尔的盲目 SQLi − 这种技术依赖于向数据库发送 SQL 查询,这会强制应用程序根据查询返回的结果是 TRUE 还是 FALSE 返回不同的结果。

  • 基于时间的盲目 SQLi − 这种技术依赖于向数据库发送 SQL 查询,这会强制数据库等待指定的时间(以秒为单位)后再响应。响应时间将向攻击者表明查询的结果是 TRUE 还是 FALSE。

示例

所有类型的 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:

现在我们将发送每个 arrack 向量的请求

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

通过检查和分析响应,我们可以识别可能的攻击。例如,如果它提供的响应包含句子您的 SQL 语法有错误,则意味着表单可能受到 SQL 注入的影响。