前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >宽字节注入原理剖析总结

宽字节注入原理剖析总结

作者头像
网络安全自修室
发布2022-01-24 08:58:43
4.3K0
发布2022-01-24 08:58:43
举报

1免责声明

本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。

2内容速览

什么是宽字节?

如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节

  • 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
  • 英文默认占一个字节,中文占两个字节

什么是宽字节注入?

原理:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)

GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),例如%df和%5C会结合;GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c

常见转义函数与配置:addslashes、mysql_real_escape_string、mysql_escape_string、php.ini中magic_quote_gpc的配置

Mysql相关知识

Mysql中有个连接层,何为连接层?在MYSQL中,有一个中间层的结构,负责客户端和服务器之间的连接,称为连接层 交互的过程如下:

(1)客户端(这里指php)以某种字符集生成的SQL语句发送至服务器端(这里指Mysql),这个“某种字符集”其实是任意规定的,PHP作为客户端连接MYSQL时,这个字符集就是PHP文件默认的编码。

(2)服务器(Mysql)会将这个SQL语句转为连接层的字符集。问题在于MYSQL是怎么知道我们传过来的这个SQL语句是什么编码呢?这时主要依靠两个MYSQL的内部变量来表示,一个是character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)。

(3)总的来说,就是php把sql语句传给mysql时,要转换character_set_connection字符集的编码,执行流程就是:将php的sql语句以character_set_client编码(也就是转为16进制数),再将16进制数以character_set_connection进行编码(也就是转换为url编码),然后以内部操作字符集进行url解码,最后以character_set_results编码输出结果 内部操作字符集怎么确定?进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,

其确定方法如下:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值; • 若上述值不存在,则使用character_set_server设定值。

可以理解的同时参考下面这幅图片

注:

  • 查看Mysql字符集
代码语言:javascript
复制
show variables like '%char%';
  • 修改字符集
代码语言:javascript
复制
set names 'gbk';

相当于下面的三句命令

mysql> set character_set_client = gbk;

mysql> set character_set_results = gbk;

mysql> set character_set_connection = gbk;

实例

以sqli-labs的第32关为例 (1)输入’,被\转义

(2)输入%df

(3)分析执行过程

① id=%df%27,浏览器执行时会自动url解码一次,断点你就会发现

注:其实那个乱码的是希腊字母β

② 此时KaTeX parse error: Can't use function ''' in math mode at position 39: …rs WHERE id='1�\̲'̲' LIMIT 0,1",接…sql转为16进制

(2)将16进制数转为url编码

(3)这里以GBK(内部操作字符集)进行url解码,执行sql语句

(4)以character_set_results编码输出结果

关键参数简单示意图:%df%27 浏览器url自动解码===> β' 转为16进制===> 0xdf0x5c0x27 转换为url编码===> %df%5c%27 进行url解码(因为是GBK编码,%df和%5c结合为汉字)===> 運'`

注:%后面跟16进制数,就表示url编码

注:在以GBK为编码的mysql中 %df和%5c才可以结合为汉字,%df和\是无法结合的 例1:可结合 注:#注释后面的

代码语言:javascript
复制
' LIMIT 0,1

例2:不可结合

\将'转义,使其失去了原本单引号的意义,只是一个没有灵魂的肉体(不能和左边的单引号闭合),因此id后面的第一个单引号就和最后一个单引号闭合了,也使得#注释符也失去了作用,因为''里的内容被视为了字符串。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全自修室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是宽字节?
  • 什么是宽字节注入?
  • Mysql相关知识
  • 实例
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档