#BBQSQL# 盲SQL注入利用工具
盲SQL注入是一种令人头疼的攻击。当现成的工具能工作时效果很好,但一旦失效,你就得自己写定制的脚本。这既耗时又繁琐。BBQSQL可以帮助你解决这些问题。
BBQSQL是一个用Python编写的盲SQL注入框架。在攻击棘手的SQL注入漏洞时,它非常有用。BBQSQL也是一个半自动化工具,允许对难以触发的SQL注入结果进行大量定制。该工具设计为与数据库无关,且极其灵活。它还拥有直观的UI,使攻击设置更加容易。同时实现了Python的gevent库,使BBQSQL运行速度极快。
我们努力将工具设计得足够直观,让你在UI中设置攻击时无需过多解释。不过,为了详尽起见,我们编写了这份详细的README,帮助你进一步了解每个配置选项的具体细节。需要注意的是,UI中的每个配置选项都有对应的描述,所以即使你没有阅读本页,也能通过摸索完成一次攻击。
与其他SQL注入工具类似,你需要提供某些请求信息。
必须提供常规信息:
然后指定注入点位置以及注入的语法。详情见下文。
通常很简单,但世事难料。可以尝试运行:
sudo pip install bbqsql
如果上述方法不奏效,你可以从源码安装。该工具需要 gevent和requests。
在菜单中你会看到BBQSQL选项的位置。在这里指定以下选项:
下面会详细说明 查询语法概述。
输出结果的文件名。如果不想输出到文件,留空即可。
BBQSQL在实施盲SQL注入攻击时使用两种技术。第一种默认技术是 binary_search(二分搜索)。更多信息请参见 维基百科。
第二种技术是 frequency_search(频率搜索)。频率搜索基于对英语语言的分析,判断字母出现的频率。这种搜索方法对非熵数据非常快,但对非英语或混淆数据可能较慢。
你可以为此参数指定 binary_search 或 frequency_search。
指定你发现的SQL注入类型。在这里设置BBQSQL应该根据HTTP响应的哪个属性来判断真/假。
你可以指定:status_code、url、time、size、text、content、encoding、cookies、headers 或 history
如果你发现SQL注入导致服务器状态码不同,则在此处设置 'status_code'。如果cookie不同,则设置 'cookie'。如果响应大小不同,则设置 'size'。以此类推。
并发性基于Python的gevent库。从功能上看,它类似于多线程,但其具体工作原理可见我们在DefCon的演讲([链接待插入])。此设置控制攻击的并发数量。这有助于限制请求速率并加速攻击。对于nginx这类高性能Web服务器,我们曾将并发数设为75。默认设置为30。
如果你遇到了一个有些怪异特性的SQL注入漏洞(例如某些字符不能包含,或者ASCII/CHAR函数不起作用),你可能已经为自己编写了带有自定义注入语法的脚本。BBQSQL省去了脚本编写,提供了一种方式让你直接粘贴自定义查询语法并轻松利用。
在查询输入框中,你将构建用于从数据库窃取信息的查询。假设你已经找到了易受攻击的参数上的SQL注入,并测试了一个成功的查询。
下面是一个构建查询的示例。
此示例中,攻击者希望获取数据库版本:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
查询语法基于占位符,这些占位符告诉BBQSQL如何执行攻击。
要使攻击生效,你需要在查询中提供以下占位符信息。一旦你将它们放入查询中,BBQSQL就会自动处理其余部分:
${row_index}:告诉BBQSQL在此处迭代行。由于我们使用了LIMIT,根据${row_index}的值,我们可以查看n行。
${char_index}:告诉BBQSQL要查询子查询中的哪个字符。
${char_val}:告诉BBQSQL在哪里将子查询的结果与验证结果进行比较。
${comparator}:告诉BBQSQL如何比较响应以确定结果是否为真。默认使用 > 符号。
${sleep}:可选,告诉BBQSQL在基于时间的SQL注入中插入睡眠秒数的位置。
并非所有占位符都是必需的。例如,如果你发现了半盲布尔型SQL注入,可以省略 ${sleep} 参数。
BBQSQL有许多HTTP参数可以在设置攻击时配置。至少你必须提供URL、注入查询的位置以及方法。可以设置以下选项:
你可以使用模板 ${injection} 来指定注入查询插入的位置。如果没有注入模板,工具就不知道在哪里插入查询。
提供与请求一起发送的文件。将值设置为文件路径,BBQSQL会负责打开/包含该文件。
随请求发送的HTTP头。可以是字符串或字典。例如:
{"User-Agent":"bbqsql"}
或
"User-Agent: bbqsql"
随请求发送的cookie字典或字符串。例如:
{"PHPSESSIONID":"123123"}
或
PHPSESSIONID=123123;JSESSIONID=foobar
指定请求发送到的URL。
布尔值,决定在发起请求时是否跟随HTTP重定向。
指定用于请求的HTTP代理,格式为字典。例如:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
指定随请求发送的POST数据。可以是字符串或字典。例如:
{"input_field":"value"}
或
input_field=value
指定HTTP请求的方法。有效方法包括:
'get','options','head','post','put','patch','delete'
指定用于HTTP基本认证的用户名和密码元组。例如:
("myusername","mypassword")
在UI中设置完攻击后,你可以导出配置文件。运行工具时你会看到该选项。导出的配置文件使用ConfigParser格式,易于阅读。下面是一个示例配置文件:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
这对于计划恢复攻击或只是调整查询但不想重新配置所有选项的情况非常有用。
你也可以从命令行或用户界面导入配置。要从命令行导入配置,只需使用以下选项运行bbqsql:
bbqsql -c config_file
当你通过命令行或用户界面加载配置文件时,会对参数运行相同的验证例程以确保其有效性。
有时你需要做一些非常特殊的事情。例如,需要先加密字段值再发送请求,或者需要三重URL编码。无论如何,这些情况使得其他工具无法使用。BBQSQL允许你定义“钩子”函数,这些函数将在请求过程中的不同时刻被调用。例如,你可以指定一个 pre_request 函数,它以请求对象为参数,进行必要的修改,然后返回修改后的请求发送到服务器。
要实现这一点,创建一个Python文件并指定钩子函数。可用的函数名称如下所示。在你的钩子文件中,可以定义任意数量的这些钩子函数。然后,在菜单的 bbqsql_options 部分,你可以指定钩子文件的路径。BBQSQL会读取该文件并使用你定义的任何钩子。
重要的是,你指定的钩子函数必须具有以下确切名称,否则BBQSQL将无法知道何时调用哪个钩子。args 函数接收一个参数,该参数包含用于创建HTTP请求的所有参数。pre_request 函数在请求发送之前接收请求对象。post_request 函数在请求发送之后接收请求对象。response 函数在将响应返回给BBQSQL之前接收响应对象。
以下是可用的钩子:
args:发送给 Request() 的参数字典。
pre_request:发送前的 Request 对象。
post_request:发送后的 Request 对象。
response:从请求生成的响应。
有关这些钩子如何工作以及你的 hooks 字典应如何编写的更多信息,请查看 requests库关于钩子的文档
一个示例钩子文件可能如下所示:
# file: hooks.py
import time
def pre_request(req):
"""
this hook replaces a placeholder with the current time
expecting the url to look like this:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
请将任何Bug修复或功能请求提交至 https://github.com/Neohapsis/bbqsql/
当然!我们认为这是一个构建功能完备SQL注入框架的良好起点。欢迎fork代码,如果你觉得有用,我们可以合并你的更改。
BBQ(烧烤)非常美味,SQL注入也是如此!