目录
引言
在CTF(Capture The Flag,夺旗赛)的Web安全赛道中,SQL注入(SQL Injection) 是最经典、最常见的考点之一。它利用的是应用程序对用户输入的SQL语句未做严格过滤的漏洞,攻击者可以通过构造恶意输入,篡改原有SQL逻辑,从而获取数据库敏感信息(如用户密码、管理员账号)、执行任意SQL命令,甚至控制整个数据库服务器。
对于刚入门的CTF选手来说,掌握SQL注入的核心原理、常见类型及实战技巧,是突破Web题目的关键。本文将结合CTF场景,从基础概念到实战技巧,带你系统梳理SQL注入的“攻防之道”。
一、SQL注入的基础概念
1. 什么是SQL注入?
SQL注入的本质是用户输入的数据被直接拼接到SQL语句中执行,导致攻击者可以操控SQL的执行逻辑。例如,一个登录验证的SQL语句原本是:
SELECT * FROM users WHERE username='admin' AND password='123456';
如果后端代码直接将用户输入的username和password拼接到SQL中(未做任何过滤),攻击者输入username=' OR '1'='1,password=' OR '1'='1,拼接后的SQL变为:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1';
此时'1'='1'恒为真,攻击者无需真实密码即可登录。
2. SQL注入的成因
- 代码层漏洞:后端未对用户输入进行合法性校验(如未使用预编译语句、未转义特殊字符)。
- 信任用户输入:将用户输入的数据直接作为SQL语句的一部分执行(如动态拼接SQL)。
二、CTF中常见的SQL注入类型
CTF题目中,SQL注入的考察形式灵活多样,但核心思路都是“构造恶意输入,触发预期外的SQL行为”。以下是最常见的几类:
1. 按参数类型分类
- 数字型注入:参数为数字(如
id=1),无需引号包裹。
示例:http://target.com/user?id=1→ 构造id=1 OR 1=1。 - 字符串型注入:参数为字符串(如
username=admin),需用引号包裹(单/双引号)。
示例:http://target.com/login?user=admin&pass=123→ 构造user=admin' --(注释后续语句)。
2. 按注入方式分类
-
报错注入:利用数据库的错误回显机制,通过构造非法SQL语句使数据库抛出错误信息,从中提取数据。
常用函数:- MySQL:
updatexml(1, concat(0x7e, (SELECT database())), 1)(updatexml的第二个参数需为XML格式,否则报错并回显内容); - MySQL:
extractvalue(1, concat(0x7e, (SELECT user())))(extractvalue类似,利用XPath解析错误); - SQL Server:
DBCC TRACEON(3604); PRINT (SELECT password FROM users)(输出到错误日志)。
- MySQL:
-
盲注(Blind Injection):数据库不会直接回显错误或数据,需通过“条件

最低0.47元/天 解锁文章
1172

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



