MySQL宽字节注入漏洞分析_宽字节注入
概念
单字节字符集: 所有的字符都使用一个字节来表示,比如 ASCII 编码。
多字节字符集: 在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。
两位的多字节字符有一个前导字节和尾字节。 在某个多字节字符集内,前导字节位于某个特定范围内,尾字节也一样。
UTF-8 编码: 是一种编码的编码方式(多字节编码),它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
常见的宽字节: GB2312、GBK、GB18030、BIG5、Shift_JIS
GB2312 不存在宽字节注入,可以收集存在宽字节注入的编码。
前提条件
简单理解:数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入
深入讲解:要有宽字节注入漏洞,首先要满足数据库后端使用双/多字节解析SQL语句,其次还要保证在该种字符集范围中包含低字节位是 0x5C(01011100) 的字符,初步的测试结果 Big5 和 GBK 字符集都是有的, UTF-8 和 GB2312 没有这种字符(也就不存在宽字节注入)。
SQL 执行原理
网上遇到一个能较好体现 SQL 语句的解析&执行过程的图片,在这里:
假如这个网站有宽字节注入那么我们提交:
http://127.0.0.1/GBK?id=%df%27
这时,假如我们现在使用的是addslashes来过滤,那么就会发生如下的转换过程
例子:
%df%27===(addslashes)===>%df%5c%27===(数据库GBK)===>運'
SQL 在执行过程中,会分为如下几个部分:
1.客户端以某种字符生成SQL语句发送至服务器,这里“某种字符”其实是任意规定的,当 PHP 作为客户端连接 MySQL 的时候,这个字符集就是 PHP 的默认编码。
2.服务器接收到请求后会把客户端编码的字符串转换成连接层编码字符串(具体流程是先使用系统变量character_set_client 对 SQL语句进行解码后会使用系统变量 character_set_connection 对解码后的十六进制进行编码)。
3.进行内部操作前,将请求按照如下规则转化成内部操作字符集,如下:
3.1 使用字段 CHARACTER SET 设定值;
3.2 若上述值不存在,使用对应数据表的DEFAULT CHARACTER SET设定值;
3.3 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
3.4 若上述值不存在,则使用character_set_server设定值。
4.执行完 SQL 语句之后,将执行结果按照 character_set_results 编码进行输出。
使用 SET NAMES 命令SET NAMES ‘gbk’或是 SET character_set_client =gbk,这样配置会引发编码转换从而导致的注入漏洞。
SET NAMES ‘x’语句与这三个语句等价:
mysql>SET character_set_client =x;
mysql>SET character_set_results =x;
mysql>SET character_set_connection =x;
也就是说你设置了 SET NAMES ‘x’ 时就等于同时执行了上面的3条语句
总结
在使用UTF-8 对 SQL 语句进行解析时,若想发生注入,并不是在解析 MySQL 语句的阶段,而是在客户端提交到服务器之前就已经发生了 SQL 注入,所以这种注入并不是 UTF-8 编码的锅, 统一使用 UTF-8 编码并且不要使用危险的函数 iconv 是一个比较安全的编码方案。
如果由于历史遗留原因一定要使用 GBK 的编码(解析)方式可以采用 mysql_set_charset 配合 mysql_real_escape_string 转义的方式进行防护。
在代码审计的较多需要留意一下 类似 GBK 和 BIG5 这种的双字节编码,同时存在低字节位位可以是 %5C 的字符,如果使用这种存在这种字符的编码对 SQL 语句进行解析,宽字节注入就离你不远啦。
参考:
https://paper.tuisec.win/detail/80365c7a33e34bc
https://paper.tuisec.win/detail/cb5a91c63a97b8d
相关文章:

objc runtime 动态增加属性
objective-c中,有类别可以在不修改源码的基础上增加方法 使用运行时库,必须要先引入 objc/runtime.h 可以使用的函数如下: OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy…

C#合并两张表结构相同(列数和列类型都相同)的表
DataTable appendDataTablenew DataTable(); 这个合并的大前提是两张表的结构相同且列的类型也必须相同 否则在赋值时就会出现异常。 for (int i 0; i < hostDt.Columns.Count;i ) { appendDataTable.Columns.Add(hostDt.Columns[i].ColumnName,hostDt.Columns[i].DataType…

erlang调优方法
2019独角兽企业重金招聘Python工程师标准>>> 1. 来自Scaling Erlang的方法 内核调优: # Increase the ipv4 port range: sysctl -w net.ipv4.ip_local_port_range"1024 65535" # General gigabit tuning: sysctl -w net.core.rmem_max16777…

mysql第四章_MySQL必知必会--第二章~第四章--MySQL简介
1.DBMS可分为两类:一类为基于共享文件系统的DBMS,另一类为基于客户机—服务器的DBMS。服务器部分是 负责所有数据访问和处理的一个软件。这个软件运行在称为数据库服务 器的计算机上。2.MySQL Administrator(MySQL管理器)是一个图形交互客户机,用 来简化…

Windows Phone 7编程学习点滴一——页面切换、返回键重载和工具栏
1. 页面切换和对齐方式 2 (1)XAML实现方式 <HyperlinkButton Content"TestPage1" NavigateUri"/TestPage1.xaml" Height"30" HorizontalAlignment"Left" Margin"10,10,0,0" Name"TestPage1Li…

call_user_func用法
1 //有一些函数,名字未知2 //名字在运行状态时,才知道3 4 //例如a(),b(),c()调用哪一个5 // ->index(),reg()?又调用哪一个6 7 function t(){8 echo hello;9 } 10 11 function s(){ 12 echo world; 13 } 14 15 $at; 16 //$a(); 17 18 //在…

构建现代化的命令行工具
文章源于 lambdas.dev 每当我们想要创建一个基于 NodeJS 的命令行工具时,就会衍生出一堆问题需要解决,比如如何准备开发环境,如何打包转译代码,如何使代码在转译后保持可调用的状态同时尽可能的压缩体积, 以及怎样设计…

Java怎么定义图片公共路径_【Java】springboot配置图片访问路径
springboot如何配置,就可以在地址栏输入http://localhost:9090/17AD93E86EB44287BA0D871A37017597.jpg就可以访问到图片回答需要添加下Springboot访问静态资源的Jar文件org.springframework.bootspring-boot-starter-thymeleaf直接去掉这两个配置就行,自…

PHP——文件操作
自己写的: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-e…

linux基础—课堂随笔010_系统启动和内核管理
系统启动和内核管理 Linux: kernelrootfs kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs:程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 程序:二进制执行文件 内核设计流派&…

微软技术的变迁
这个课题很大,我只是站在一个普通人的视角上写一下。 微软的看家技术是什么?vb!先有basic,再有操作系统,dos发展到windows,vb一直发展着。然而到达vb6之后,微软转型设计.net 。.net 是什么&…

java initcause_Java 异常
问:java 异常有哪几种,特点是什么?答:异常是发生在程序执行过程中阻碍程序正常执行的错误操作,只要在 Java 语句执行中产生异常,则一个异常对象就会被创建。Throwable 是所有异常的父类,它有两个…

UICollectionView之网络图片解析
1:将SDWebImage文件夹的类库导入工程,创建一个模型对象Model类,并声明好它的属性,再创建一个继承自UICollectionViewCell的自定义类 2:在自定义cell类中重写 - (instancetype)initWithFrame:(CGRect)frame { self [su…

一个中国人看了爽的笑话
某国人好战。古时几乎所有的少壮男丁都被征召去当兵打仗,根本没有时间结婚生子,所以人丁越来越少.当时一个国主就出了一个国策,让所有的男人不论何时何地,都可以随便跟任何女人发生关系,来保持人口的出生率.所以在休战…

Spring Cloud整合Redis
2019独角兽企业重金招聘Python工程师标准>>> 项目需要使用Redis来做缓存,研究了一下如何将其与Spring Boot整合。网上的demo要么就是太过于庞大,要么就是版本过于陈旧,配置时候会有各种坑。因此自己在踩过了各种坑之后,…

java case or_java – 在CriteriaBuilder中使用子句和’case w...
我想使用CriteriaBuilder构建下面显示的having子句:select objectid,sum(case when attr_meta severity then 1 else 0 end) as severity,sum(case when attr_meta priority then 1 else 0 end) as priorityfrom object dgroup by objectidhaving sum(case when a…

7 个 jQuery 最佳实践
背景 在这篇文章中,我会给大家介绍在编写、调试和审查JavaScript代码的时候一些好的实践(至少我是这么认为的)。事实上,我选择了其中7个最常见的场景。 1、使用CDN及其回退地址(fallback) CDN代表内容传递网…

关于一些Linux SVN的安装使用
关于一些Linux SVN的安装使用 SVN简介The goal of the Subversion project is to build a version control system that is a compelling replacement for CVS in the open source community. The software is released under an Apache/BSD-style open source license.SVN是一…

【转】触屏手机电话拨打链接
1、web方式: <a href"tel:4008006666">电话:4008006666</a> 2、wap方式(主要hack QQ和UC浏览器) <a href"wtai://wp/mc;4008006666">电话:4008006666</a>转载于:https://…

java redis 主从 哨兵_Redis主从复制与哨兵机制
Redis主从复制1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库…

不同变量的区别
1、形参、局部变量以及局部静态变量的区别。 形参和局部变量均属于自动对象,当到达定义所在的块末尾时被销毁;而局部静态变量自定义开始,直到程序结束才被销毁。 2、全局变量和静态全局变量的区别。 全局变量本身就是静态存储方式,…

Java 使用 Redis
2019独角兽企业重金招聘Python工程师标准>>> 安装 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Ja…

IPMSM弱磁控制策略
下面将详细介绍这种控制策略的实现过程:(l)具有快速动态响应的前馈弱磁控制策略电动汽车用永磁电动机驱动系统应具有较快的转速响应速度,而传统的的弱磁控制策略通常是先根据电机转速的变化调整交轴电流iq,而后根据转速给定值计算得出直轴电流id这种方法…

java 并发统计_java并发编程|CountDownLatch计数器
0x01,CountDownLatch介绍CountDownLatch是一个计数器,作为java并发编程中三个组件之一,这个组件的使用频率还是很多的。这里分享下自己画的java并发编程组件的图,后面一一介绍这几个组件的使用。上面图片标注的1,2,3分别是自己觉得重要性的&a…

MySQL查询随机数据的4种方法和性能对比
从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用”ORDER BY RAND()”,本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并分析了各自的优缺点。下面从以下四种方案分析各自的优缺点。方案一: 复制代码 代码如下:…

【转】CPU位数、核数、个数
转自:http://blog.chinaunix.net/uid-20344928-id-2985712.html 32 or 64 linux下查看操作CPU的运行位数: getconf LONG_BIT 如结果是32,表示当前CPU工作在32位模式下(即操作系统是32位的),但并不表示CPU一…

JPA常用注解
2019独角兽企业重金招聘Python工程师标准>>> JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一…

php pthread 实例,php 真正的多线程 pthread
对于php,有很多种多进程的实现,这里就不说了,下面介绍一种多线程的方式。php真正的多线程实现方式,通过安装php的扩展:pthread 扩展安装步骤如下:1.下载地址是这个:但是这个下载的是 版本3 也就…

Java基础学习总结(1)——equals方法
2019独角兽企业重金招聘Python工程师标准>>> 一、equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test;2 3 public class TestEquals {4 public static void main(String[] args) {5 /**6 * 这里使用构造方法Cat()在堆…

动态规划:求最大公共子串
1 /// <summary>2 /// 动态规划:求最大公共子串3 /// LCS (Longest Common Subsequence)4 /// </summary>5 private static string LCS(string str1, string str2)6 { 7 var d …