高危核心根源开发者直接拼接用户输入到SQL语句没有使用预编译攻击者能够篡改SQL语义。基础概念Payload载荷攻击者发送给目标服务器、用来触发漏洞、实现攻击目的的一段指令 / 字符串。理解漏洞是 “门锁缺陷”Payload 就是撬开门锁的工具。在 SQL 注入场景里Payload 是我们写入参数里的恶意 SQL 片段例如1 and sleep(3)、1 union select 1,2全部属于 Payload。前置前提注入 Payload 想要生效首要任务是闭合原有 SQL 语句漏洞后端原始 SQL 两种典型形式原始后端 SQL 示例SELECT * FROM user WHERE id 1; # 数字型注入无需引号闭合 SELECT * FROM user WHERE name test; # 字符型注入需要单引号闭合攻击者利用 / / ) 截断原有 SQL追加恶意 Payload最后用 # 或 -- 注释掉 SQL 剩余代码避免语法报错。注入点不局限于 URL GET 参数POST 表单、Cookie、HTTP 请求头、JSON 请求体都能传入 Payload。主流五大注入类型1. 报错注入Error-based特征传入特殊payload网站直接抛出数据库原生报错信息。示例 Payload?id1页面爆出 MySQL语法错误泄露表名字段名攻击原理利用 MySQL 特有报错函数updatexml()、extractvalue()强制数据库在报错信息里返回数据。局限网站关闭数据库报错就无法使用。存在 32 字符截断限制MSSQL、Oracle Payload 不通用。进阶 Payload?id1 and updatexml(1,concat(0x7e,database()),1)--2. 联合查询注入Union Select特征页面存在数据回显位置可以直接打印查询结果。探测列数 Payload?id1 order by 3--核心攻击 Payload?id1 union select username,password from users执行逻辑原始 SQL 查询结果 union 拼接的恶意查询结果一同展示在页面。硬性前提union前后两条查询字段数量必须一致一般先用order by相关 Payload 探测列数?id1 order by 3--正常页面会额外打印账号密码。局限需要页面有位置输出查询结果很多网站不具备条件。3. 布尔盲注Boolean-based没有明文数据、没有数据库报错仅仅存在两种页面状态正常 / 空白/跳转。俩组对比Payload:?id1 and 11 -- 页面正常 ?id1 and 12 -- 页面空白/跳转攻击原理借助页面两种不同响应状态搭配substr()、ascii()函数构造 Payload逐字符猜测数据库名称、表名、账号密码。典型猜解 Payload?id1 and ascii(substr(database(),1,1))100--4. 时间盲注Time-based页面视觉上完全没有任何变化不会空白、不会报错跳转切换。依靠页面加载延迟判断Payload内语句真假。基础延时Payload?id1 and sleep(3)条件成立 → 网页卡住3秒再加载条件不立 → 立刻加载完成。攻击者依靠页面两种状态逐字符猜数据库内容肉眼看不出页面内容区别只能观察响应耗时。这也是最隐蔽、最难手工测试的注入。实战猜解 Payload?id1 and if(ascii(substr(database(),1,1))114,sleep(3),0)--特点隐蔽性最强肉眼看不出页面差异手工测试效率极低WAF 很容易拦截长时间延时 Payload5. 堆叠查询注入Stacked Queries使用分号;结束当前SQL语句追加一条全新独立SQL指令。破坏性Payload?id1; drop table users;关键限制语法上 MySQL 支持分号分隔多条 SQL但能否执行取决于后端数据库驱动能否使用取决于数据库驱动是否允许多条语句执行PHPmysqli_query()默认禁止多条语句MSSQLSql Server更容易触发堆叠注入Oracle 默认不支持。Payload 执行成功页面不一定返回任何执行结果不能依靠页面内容判断攻击是否生效。简单横向对比1. 能看见数据、报错 → 联合注入 / 报错注入2. 页面只有两种显示状态正常/空白 → 布尔盲注3. 页面毫无视觉差别只能看加载快慢 → 时间盲注知识点1.五类注入底层根源完全一致直接拼接用户输入只是网站错误处理机制、页面展示逻辑不同Payload 利用形式产生区别。2.sqlmap 工具会自动构造对应 Payload自动识别注入类型自动化完成盲注数据猜解。3.水平越权 ≠ SQL 注入-水平越权业务权限设计缺陷仅修改 ID 访问他人数据SQL 语句本身安全没有可供利用的 Payloadsqlmap 无法扫描出来。-SQL 注入可控输入让攻击者注入恶意 Payload篡改数据库执行逻辑两者漏洞可以同时存在、互不包含。拓展注入不在五大主流分类实战高频二次 SQL 注入前端对输入 Payload 做转义过滤恶意字符先存入数据库后续读取数据再次拼接 SQL 时Payload 触发注入可以绕过前端防护。OAST 外带注入高阶盲注 Payload当延时 Payload 被 WAF 拦截、页面无任何状态差异时使用构造 Payload 触发 DNS/HTTP 请求把数据库数据带出摆脱页面限制。防御方案1.最优方案全程使用预编译参数化查询彻底隔离 SQL 结构与用户输入让攻击者传入的 Payload 只会被当做普通字符串无法修改 SQL 语法2.数据库账号最小权限业务账号禁止drop、文件读写等高危险操作降低 Payload 攻击造成的损失3.生产环境关闭详细数据库错误堆栈切断报错注入利用条件4.特殊字符过滤仅作为辅助防护不能单独依靠过滤抵御 Payload存在大量绕过手段。
SQL注入漏洞类型
高危核心根源开发者直接拼接用户输入到SQL语句没有使用预编译攻击者能够篡改SQL语义。基础概念Payload载荷攻击者发送给目标服务器、用来触发漏洞、实现攻击目的的一段指令 / 字符串。理解漏洞是 “门锁缺陷”Payload 就是撬开门锁的工具。在 SQL 注入场景里Payload 是我们写入参数里的恶意 SQL 片段例如1 and sleep(3)、1 union select 1,2全部属于 Payload。前置前提注入 Payload 想要生效首要任务是闭合原有 SQL 语句漏洞后端原始 SQL 两种典型形式原始后端 SQL 示例SELECT * FROM user WHERE id 1; # 数字型注入无需引号闭合 SELECT * FROM user WHERE name test; # 字符型注入需要单引号闭合攻击者利用 / / ) 截断原有 SQL追加恶意 Payload最后用 # 或 -- 注释掉 SQL 剩余代码避免语法报错。注入点不局限于 URL GET 参数POST 表单、Cookie、HTTP 请求头、JSON 请求体都能传入 Payload。主流五大注入类型1. 报错注入Error-based特征传入特殊payload网站直接抛出数据库原生报错信息。示例 Payload?id1页面爆出 MySQL语法错误泄露表名字段名攻击原理利用 MySQL 特有报错函数updatexml()、extractvalue()强制数据库在报错信息里返回数据。局限网站关闭数据库报错就无法使用。存在 32 字符截断限制MSSQL、Oracle Payload 不通用。进阶 Payload?id1 and updatexml(1,concat(0x7e,database()),1)--2. 联合查询注入Union Select特征页面存在数据回显位置可以直接打印查询结果。探测列数 Payload?id1 order by 3--核心攻击 Payload?id1 union select username,password from users执行逻辑原始 SQL 查询结果 union 拼接的恶意查询结果一同展示在页面。硬性前提union前后两条查询字段数量必须一致一般先用order by相关 Payload 探测列数?id1 order by 3--正常页面会额外打印账号密码。局限需要页面有位置输出查询结果很多网站不具备条件。3. 布尔盲注Boolean-based没有明文数据、没有数据库报错仅仅存在两种页面状态正常 / 空白/跳转。俩组对比Payload:?id1 and 11 -- 页面正常 ?id1 and 12 -- 页面空白/跳转攻击原理借助页面两种不同响应状态搭配substr()、ascii()函数构造 Payload逐字符猜测数据库名称、表名、账号密码。典型猜解 Payload?id1 and ascii(substr(database(),1,1))100--4. 时间盲注Time-based页面视觉上完全没有任何变化不会空白、不会报错跳转切换。依靠页面加载延迟判断Payload内语句真假。基础延时Payload?id1 and sleep(3)条件成立 → 网页卡住3秒再加载条件不立 → 立刻加载完成。攻击者依靠页面两种状态逐字符猜数据库内容肉眼看不出页面内容区别只能观察响应耗时。这也是最隐蔽、最难手工测试的注入。实战猜解 Payload?id1 and if(ascii(substr(database(),1,1))114,sleep(3),0)--特点隐蔽性最强肉眼看不出页面差异手工测试效率极低WAF 很容易拦截长时间延时 Payload5. 堆叠查询注入Stacked Queries使用分号;结束当前SQL语句追加一条全新独立SQL指令。破坏性Payload?id1; drop table users;关键限制语法上 MySQL 支持分号分隔多条 SQL但能否执行取决于后端数据库驱动能否使用取决于数据库驱动是否允许多条语句执行PHPmysqli_query()默认禁止多条语句MSSQLSql Server更容易触发堆叠注入Oracle 默认不支持。Payload 执行成功页面不一定返回任何执行结果不能依靠页面内容判断攻击是否生效。简单横向对比1. 能看见数据、报错 → 联合注入 / 报错注入2. 页面只有两种显示状态正常/空白 → 布尔盲注3. 页面毫无视觉差别只能看加载快慢 → 时间盲注知识点1.五类注入底层根源完全一致直接拼接用户输入只是网站错误处理机制、页面展示逻辑不同Payload 利用形式产生区别。2.sqlmap 工具会自动构造对应 Payload自动识别注入类型自动化完成盲注数据猜解。3.水平越权 ≠ SQL 注入-水平越权业务权限设计缺陷仅修改 ID 访问他人数据SQL 语句本身安全没有可供利用的 Payloadsqlmap 无法扫描出来。-SQL 注入可控输入让攻击者注入恶意 Payload篡改数据库执行逻辑两者漏洞可以同时存在、互不包含。拓展注入不在五大主流分类实战高频二次 SQL 注入前端对输入 Payload 做转义过滤恶意字符先存入数据库后续读取数据再次拼接 SQL 时Payload 触发注入可以绕过前端防护。OAST 外带注入高阶盲注 Payload当延时 Payload 被 WAF 拦截、页面无任何状态差异时使用构造 Payload 触发 DNS/HTTP 请求把数据库数据带出摆脱页面限制。防御方案1.最优方案全程使用预编译参数化查询彻底隔离 SQL 结构与用户输入让攻击者传入的 Payload 只会被当做普通字符串无法修改 SQL 语法2.数据库账号最小权限业务账号禁止drop、文件读写等高危险操作降低 Payload 攻击造成的损失3.生产环境关闭详细数据库错误堆栈切断报错注入利用条件4.特殊字符过滤仅作为辅助防护不能单独依靠过滤抵御 Payload存在大量绕过手段。