宽字节注入原理分析[通俗易懂]

宽字节注入原理分析[通俗易懂]什么是宽字节?如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节。像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节英文默认占一个字节,中文占两个字节什么是宽字节注入?原理:宽字节注入是利用了mysql的一个特性,即mysql在使用GBK编码时,在url解码时会认为两个字符是一个汉字(前一个ASCII码要大于128,才表示到汉字的范围)通常情况下,一个utf-8编码的汉子占用3个字节,一个GBK编

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

什么是宽字节?

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

  • 像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字符集
    show variables like '%char%';
    在这里插入图片描述
  • 修改字符集
    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:可结合
注:#注释后面的' LIMIT 0,1
在这里插入图片描述
例2:不可结合
在这里插入图片描述
\将'转义,使其失去了原本单引号的意义,只是一个没有灵魂的肉体(不能和左边的单引号闭合),因此id后面的第一个单引号就和最后一个单引号闭合了,也使得#注释符也失去了作用,因为''里的内容被视为了字符串。

参考

https://blog.csdn.net/u011721501/article/details/42874517
https://blog.csdn.net/william_munch/article/details/100037244
https://www.lstazl.com/666-2/

注:
URL编码的解码(GBK)
查看字符编码(简体中文)—–GBK内码查询

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 朋友圈集赞小程序 最新版_朋友圈虚拟点赞软件

    朋友圈集赞小程序 最新版_朋友圈虚拟点赞软件大家好这是一款朋友圈积攒截图小程序里面内涵三款样式生成,一款图文,一款分享,一款查看的样式也就是我们微信朋友圈所用到的样式就包含了里面的流量主那些可以用户自由的添加哈!赞的数量那些可以用户自定义的哈另外所需的内容也是用户自定义的安装方法的话和往常一样!直接微信开发者工具打开源码然后设置一个合法域名上传审核就可以了合法域名在压缩包里面,搭建解压了就可以看到了小程序源码下载地址:…

    2025年9月16日
    4
  • 十款磁盘碎片整理工具

    十款磁盘碎片整理工具说到磁盘整理工具,应该说说磁盘碎片的定义,为什么磁盘碎片会对系统性能造成影响。首先我不是专业的电脑人员,对很专业的理论知识不懂,在这里只可以用很通俗很日常的语言来表达。其实磁盘碎片应该称为文件碎片,是因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的。为什么这些碎片多了,会对系统性能造成影响呢?打个比方,你的房间你很久没有整理和清洁了,原本有条…

    2022年6月25日
    42
  • 大数据应用开发工程师,主要负责的工作内容有哪些?

    大数据应用开发工程师,主要负责的工作内容有哪些?如果我们把大数据应用看成一个嗷嗷待哺拥有无限潜力的婴儿,某一领域专业的海量的深度的数据就是喂养这个天才的奶粉。奶粉的数量决定了婴儿是否能长大,而奶粉的质量则决定了婴儿后续的智力发育水平。据数联寻英发布《大数据人才报告》显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万,越来越多人加入到大数据培训,都希望在大数据培训机构中学习最前沿的知识,找一份不错的工作。大数据应…

    2022年5月4日
    57
  • Delphi中QuotedStr介绍及使用

    Delphi中QuotedStr介绍及使用delphi函数给字符串两边加单引号并返回.声明:functionQuotedStr(constS:string):string;用函数QuotedStr把字符串S转换成为用引号括起来的字符串。单引号”‘”将被插入到字符串s的最前和最后。例如:abc->’abc’

    2022年10月18日
    4
  • 若干道Swift面试题

    1,说说你认识的Swift是什么?Swift是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MACOS和iOS平台,用于搭建基于苹果平台的应用程序。

    2021年12月23日
    59
  • ssm/php/java/net/python中小学生视频在线网站「建议收藏」

    本系统带文档lw1万字+答辩PPT+查重如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我,有时间看到机会给你发系统设计.1系统体系结构中小学生视频在线网站的结构图-1所示:图-1系统结构登录系统结构图,如图-2所示:图-2登录结构图管理员结构图,如图-3所示。图-3管理员结构图.2开发流程设计系统流程的分析是通过调查系统所涉及问题的识别、可行性、可操作性、系统分析处理能力等具体环节来调节、整理系统的设计方案以确保系统能达到理

    2022年4月7日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号