从业者-盲注-条件响应
# 实验室:带有条件响应的SQL盲注入
# 题目
此实验室包含一个SQL盲注 (opens new window)漏洞。应用程序通过跟踪 Cookie 进行分析,并执行包含所提交 Cookie 值的SQL查询。
SQL 查询的结果不会返回,也不会显示任何错误消息。但是,如果查询返回任何行,应用程序将在页面中包含 “Welcome Back” 消息。
数据库包含另一个名为users
的表,其中的列名为username
和password
。您需要利用 SQL 盲注漏洞 获取administrator
用户的密码。
要解决实验室问题,请以administrator
用户身份登录。
提示
假设密码只包含 小写字母 和 数字字符。
- name: 实验室-从业者
desc: 带有条件响应的SQL盲注入 >>
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/blind/lab-conditional-responses
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实验室
根据题意,可得实验目标:
- 在 Cookie 中存在 SQL 注入漏洞,利用 SQL 盲注技术,构造带有条件响应的 SQL 注入查询语句;
- 从 users 表中查询 administrator 用户的用户名和密码,并以该用户身份登录应用程序。
点击 “Access the lab” 进入实验室
实验室页面如下
# 基本环节
由于注入点在 Cookie 的TrackingId
参数当中,所以我们需要启动 Burp Suite ,开启浏览器代理,刷新当前页面 并拦截 HTTP 数据包

右键数据包,点击 “Send to Repeater”
在 “Repeater” 模块中,我们可以重复发送 HTTP 数据包
在响应数据包中,我们可以看到应用程序返回了 “Welcome back!”,说明当前 SQL 查询成功
在TrackingId
参数后面添加一个引号'
,此时的 SQL 查询如下:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4''
由于多了一个引号,导致 SQL 查询出现错误,所以应用程序不会返回 “Welcome back!”
添加注释符号--
'-- qwe
SQL 查询正确,应用程序返回了 “Welcome back!”
通过前面所学知识,判断原始查询列数
' UNION SELECT NULL-- qwe

判断列数据类型
' UNION SELECT 'abc'-- qwe

# SQL盲注-手动
使用length()
函数,确定administrator
用户的密码长度范围
' AND length((SELECT password FROM users WHERE username = 'administrator')) > 1-- qwe
应用程序返回 “Welcome back!”,说明 SQL 查询成功,并且密码的长度 大于 1
继续比大小的操作,最后使用=
来确定密码的长度
' AND length((SELECT password FROM users WHERE username = 'administrator')) = 20-- qwe
administrator
用户的密码长度为20
确定密码长度之后,使用substring()
函数,对密码的 20 位字符进行猜测操作
' AND substring((SELECT password FROM users WHERE username = 'administrator'), 1, 1) = '3
# 此时的 SQL 查询为:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = '参数'
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4' AND substring((SELECT password FROM users WHERE username = 'administrator'), 1, 1) = '3'
2
3
4
5
此处确定密码的第 1 个字符为3
继续猜测操作,
' AND substring((SELECT password FROM users WHERE username = 'administrator'), 2, 1) > 'a
此处判断第 2 个字符的范围 大于字符 a
最后通过=
符号,确定密码的第 2 个字符为o
' AND substring((SELECT password FROM users WHERE username = 'administrator'), 2, 1) = 'o

# SQL盲注-自动化
如果手动猜测 20 个字符,则需要消耗大量的时间和精力,我们可以用 Burp Suite 来简化这个过程
(PS:上一个实验室过期了,以下是新开的实验室,猜测的密码会有所不同)
右键 HTTP 数据包,点击 “Send to Intruder”
点击 “Clear” 清除默认选区
选中字符2
,然后点击 “Add” 添加选区
重复上述操作,将字符o
也添加到选区当中
选择攻击类型为“Cluster bomb”
为第一个选区 设置攻击载荷
- 选择载荷类型 Numbers
范围,从 1 到 20,步长为 1:
- From:1
- To:20
- Step:1
为第二个选区 设置攻击载荷
- 选择载荷类型“Brute forcer”
配置参数:
- Character set:默认 不用管
- Min length:1
- Max length:1
当 SQL 查询正确执行的时候,应用程序会返回 “Welcome back!”
我们可以通过这个返回的信息,来判断密码是否猜测成功
选择“Settings” -> Grep - Match,该功能可以匹配 Response 中的内容,以查找我们想要的字符串
点击 “Clear” 清除默认规则
在输入栏中 输入 “Welcome back!” -> “Add”,添加匹配规则
然后勾选✔选项,以启用该功能
最后,回到选区界面,点击右上角的 “Start attack” 开始攻击
如果你使用的是 BurpSuite 社区版,则会有一个提示,不用理会,点击 OK
开始攻击后,BurpSuite 会使用你设置的攻击载荷,自动猜测 20 个字符的密码
- 1 - 20,密码长度
- a - z 以及 0 - 9 共36个字符
- BurpSuite 会依次对 20 个位置 进行 36 个字符的猜测,总共 720 次猜测
如果猜测成功,则应用程序会返回 “Welcome back!”
由于我们提前设置了 Response 匹配,所以 BurpSuite 会帮我们标识正确的请求
等待 720 个猜测运行完毕,对列表进行排序,可以看到 成功猜测了 20 个字符
将 20 个字符组合起来,得到密码:g8iejo4m40qubyuwfy1i

访问登录页面,输入用户名administrator
,以及刚刚猜测出的密码g8iejo4m40qubyuwfy1i
点击 “Log in” 之后,成功登录,实验完成