Python渗透测试 - SQL注入网页攻击
SQL注入是一组SQL命令,这些命令放置在URL字符串或数据结构中,以便从与Web应用程序连接的数据库中检索我们想要的响应。这种类型的攻击通常发生在使用PHP或ASP.NET开发的网页上。
SQL注入攻击可以出于以下目的进行:
修改数据库的内容
修改数据库的内容
执行应用程序不允许的不同查询
当应用程序在将输入传递给SQL语句之前没有正确验证输入时,这种类型的攻击就会起作用。注入通常放置在地址栏、搜索字段或数据字段中。
检测Web应用程序是否容易受到SQL注入攻击的最简单方法是在字符串中使用“ ‘ ”字符,看看是否出现任何错误。
SQL注入攻击类型
在本节中,我们将学习不同类型的SQL注入攻击。攻击可以分为以下两种类型:
带内SQL注入(简单SQL注入)
推断式SQL注入(盲注SQL注入)
带内SQL注入(简单SQL注入)
这是最常见的SQL注入。这种SQL注入主要发生在攻击者能够使用相同的通信通道发起攻击和收集结果时。带内SQL注入进一步分为两种类型:
基于错误的SQL注入 - 基于错误的SQL注入技术依赖于数据库服务器抛出的错误消息来获取有关数据库结构的信息。
基于联合的SQL注入 - 这是另一种带内SQL注入技术,它利用UNION SQL运算符将两个或多个SELECT语句的结果组合成单个结果,然后将其作为HTTP响应的一部分返回。
推断式SQL注入(盲注SQL注入)
在这种类型的SQL注入攻击中,攻击者无法通过带内方式看到攻击的结果,因为没有数据通过Web应用程序传输。这就是它也被称为盲注SQL注入的原因。推断式SQL注入进一步分为两种类型:
基于布尔的盲注SQL注入 - 这种技术依赖于向数据库发送SQL查询,这会强制应用程序根据查询返回TRUE还是FALSE结果返回不同的结果。
基于时间的盲注SQL注入 - 这种技术依赖于向数据库发送SQL查询,这会强制数据库等待指定的时间量(以秒为单位)后再响应。响应时间将向攻击者指示查询结果是TRUE还是FALSE。
示例
所有类型的SQL注入都可以通过操纵应用程序的输入数据来实现。在以下示例中,我们编写了一个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
通过检查和分析响应,我们可以识别可能的攻击。例如,如果它提供的响应包含句子“您的SQL语法有错误”,则表示该表单可能受到SQL注入的影响。