iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >在mysql中宽字节注入的示例分析
  • 450
分享到

在mysql中宽字节注入的示例分析

2023-06-17 09:06:04 450人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关在mysql中宽字节注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在Mysql中,用于转义的函数有addslashes,mysql_real_escape_s

这篇文章将为大家详细讲解有关在mysql中宽字节注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

Mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。

在mysql中宽字节注入的示例分析

首先,宽字节注入与html页面编码是无关的,笔者曾经看到

<meta charset=utf8>

就放弃了尝试,这是一个误区,SQL注入不是XSS。虽然他们中编码的成因相似,不过发生的地点不同。

很多网上的材料都说程序使用了宽字节来处理程序,却又不指出具体是指什么程序。本文就介绍一下具体漏洞发生的原理与简单的利用。在这里我们限定使用的语言是php5.4,数据库MYSQL5.6。

涉及到的一些概念

字符、字符集与字符序

字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。

字符序(collation)指同一字符集内字符间的比较规则。

UTF8

由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal TransfORMation Format)。

宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。

MYSQL的字符集转换过程

MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

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

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

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

&bull; 若上述值不存在,则使用character_set_server设定值。

将操作结果从内部操作字符集转换为character_set_results。

重点:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。

PHP测试代码:

<!DOCTYPE html>  <meta charset="gbk"><!--仅用于基础的显示,换成utf8也行就是不好看-->  <?php  error_reporting(0);  $conn = mysql_connect('127.0.0.1','root','');  mysql_select_db('mysql',$conn);  mysql_query("set names gbk");  //不安全的编码设置方式  $res = mysql_query("show variables like 'character%';"); //显示当前数据库设置的各项字符集  while($row = mysql_fetch_array($res)){  var_dump($row);  }  $user = addslashes($_GET['sql']); //mysql_real_escape_string() magic_quote_gpc=On addslashes() mysql_escape_string()功能类似  $sql = "SELECT host,user,passWord FROM user WHERE user='{$user}'";  echo $sql.'</br>';  if($res = mysql_query($sql)){  while($row = mysql_fetch_array($res)){  var_dump($row);  }  }  else{  echo "Error".mysql_error()."<br/>";  }  ?>
Http://localhost/xl.php?sql=root%df%27%20or%201=1%23

是可以执行成功的!

在mysql中宽字节注入的示例分析

URL解码sql=root&szlig;&rsquo; or 1=1#

解析过程:

$_GET[&lsquo;sql&rsquo;] 经过 addslashes编码之后带入了&lsquo;\&rsquo;1、root%df%5C%27%20or%201=1%232、带入mysql处理时使用了gbk字符集%df%5c -> 運 成功的吃掉了%5c%27 -> &lsquo; 单引号成功闭合

执行了插入的sql语句。

怎么吃的:

GBK编码,它的编码范围是0&times;8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,因此吃掉&lsquo;\&rsquo;,而%27、%20小于ascii(128)的字符就保留了。

补充:

GB2312是被GBK兼容的,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。

其它的宽字符集也是一样的分析过程,要吃掉%5c,只需要低位中包含正常的0x5c就行了。

安全过滤

上文中代码使用了mysql_query(“set names gbk”)来设置编码,其实在mysql中是推荐mysql_set_charset(“gbk”);函数来进行编码设置的,这两个函数大致的功能相似,***不同之处是后者会修改mysql对象中的mysql->charset属性为设置的字符集。

同时配套的过滤函数为mysql_real_escape_string()。上面代码中列出了几个过滤的函数,他们之间的区别就是mysql_real_escape_string()会根据mysql对象中的mysql->charset属性来对待传入的字符串,因此可以根据当前字符集来进行过滤。

具体差别可参考:http://www.laruence.com/2010/04/12/1396.html

同理可得

由上文可得宽字节注入是由于转编码而形成的,那具有转编码功能的函数也成了漏洞的成因。

转码函数

mb_convert_encoding()

iconv()

以下用iconv()来演示,修改上面的代码:

<!DOCTYPE html>  <meta charset="gbk">  <?php  error_reporting(0);  $conn = mysql_connect('127.0.0.1','root','');  mysql_select_db('mysql',$conn);  mysql_set_charset("utf8"); //推荐的安全编码  $user = mysql_real_escape_string(($_GET['sql'])); //推荐的过滤函数  $user = iconv('GBK', 'UTF-8',$user);  $sql = "SELECT host,user,password FROM user WHERE user='{$user}'";  echo $sql.'</br>';  $res = mysql_query($sql);  while($row = mysql_fetch_array($res)){  var_dump($row);  }  ?>

在mysql中宽字节注入的示例分析

http://localhost/xl.php?sql=root%e5%27or%201=1%23

同样可以执行成功,编码解析的过程依然如上。

总结一下漏洞成因:

代码一

使用了不安全的字符集设置函数与过滤函数。

漏洞发生在PHP请求mysql时使用character_set_client值进行一次转码。

代码二

使用了推荐的设置函数与过滤函数。

解析错误发生在iconv()函数转码时,GBK转向UTF8吃掉了“\”

PHP请求mysql时转码安全。

另外:

当改变编码方向时$user = iconv(&lsquo;UTF-8&prime;, &rsquo;gbk&rsquo;,$user);

通过访问http://localhost/xl.php?sql=root%e9%8c%a6可以带入一个\,进而注释掉单引号。

这种情况下需要两个参数来配合注入。

例如:

http://localhost/xl.php?sql=root%e9%8c%a6&para;=%20or%201=1%23

关于“在mysql中宽字节注入的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 在mysql中宽字节注入的示例分析

本文链接: https://www.lsjlt.com/news/288227.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在mysql中宽字节注入的示例分析
    这篇文章将为大家详细讲解有关在mysql中宽字节注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在mysql中,用于转义的函数有addslashes,mysql_real_escape_s...
    99+
    2023-06-17
  • Web中宽字节注入攻击原理的示例分析
    这篇文章主要为大家展示了“Web中宽字节注入攻击原理的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Web中宽字节注入攻击原理的示例分析”这篇文章吧。宽字节注入攻击宽字节注入攻击的测试地...
    99+
    2023-06-25
  • MySQL中SQL的单字节注入与宽字节注入的区别
    这篇文章主要讲解了“MySQL中SQL的单字节注入与宽字节注入的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中SQL的单字节注入与宽字节注入的区别”吧!一、单字节SQL注入M...
    99+
    2023-06-17
  • Java IO中字节输入输出流的示例分析
    这篇文章主要介绍Java IO中字节输入输出流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内...
    99+
    2023-06-26
  • 宽字节注入%df的理解
    宽字节注入是sql注入的一种手段,利用mysql使用GBK编码(因为GBK占用2个字节,而ascii占用1个字节),将两个字符看作一个汉字,从而消除转义字符\。(当某字符的大小为一个字节时,称其字符为窄字节当某字符的大小为两个字节时,称其字...
    99+
    2023-08-31
    sql mysql php web安全 1024程序员节
  • java IO中字节和字符的示例分析
    这篇文章给大家分享的是有关java IO中字节和字符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
    99+
    2023-06-14
  • Java中char字节占用的示例分析
    这篇文章给大家分享的是有关Java中char字节占用的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
    99+
    2023-06-14
  • SQL注入的示例分析
    这篇文章主要为大家展示了“SQL注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL注入的示例分析”这篇文章吧。SQL注入攻击的总体思路 ...
    99+
    2024-04-02
  • Angular中依赖注入的示例分析
    这篇文章主要介绍Angular中依赖注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!依赖注入:设计模式依赖:程序里需要的某种类型的对象。依赖注入框架:工程化的框架注入器Injector:用它的API创建依...
    99+
    2023-06-06
  • Vue中依赖注入的示例分析
    这篇文章主要介绍了Vue中依赖注入的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单粗暴型:<el-select ...
    99+
    2024-04-02
  • JVM中Java字节码文件的示例分析
    小编给大家分享一下JVM中Java字节码文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每一个class字节码文件都唯一对应一个类或接口,class文...
    99+
    2023-06-02
  • sql注入之手工注入的示例分析
    这篇文章将为大家详细讲解有关sql注入之手工注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了方便说明,我们还是用之前的数字型的注入点为例来进行说明。得到字...
    99+
    2024-04-02
  • JavaScript中节流的示例分析
    小编给大家分享一下JavaScript中节流的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言我们来聊一聊节流——另一个优化函数的思想。我们还是以移动事...
    99+
    2023-06-06
  • 数据库中sql注入的示例分析
    这篇文章将为大家详细讲解有关数据库中sql注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先可能大家都会问什么是sqlSql是数据库的一种类型,是用来存储网...
    99+
    2024-04-02
  • SQL Server中WAITFOR DELAY注入的示例分析
    这篇文章主要为大家展示了“SQL Server中WAITFOR DELAY注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL Server中WAITFOR DELAY注入的示例分...
    99+
    2023-06-04
  • Mysql注入中outfile、dumpfile、load_file函数的示例分析
    这篇文章将为大家详细讲解有关Mysql注入中outfile、dumpfile、load_file函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所...
    99+
    2024-04-02
  • SQL注入绕过的示例分析
    这篇文章主要介绍了SQL注入绕过的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言sql注入在很早很早以前是很常见的一个漏洞。后来...
    99+
    2024-04-02
  • SQL报错注入的示例分析
    小编给大家分享一下SQL报错注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL报错注入概述通过构造特定的SQL语句,让攻击者想要查询的信息(如数据...
    99+
    2023-06-29
  • Angular4依赖注入的示例分析
    这篇文章给大家分享的是有关Angular4依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基础知识Angular CLI 基本使用1、安装 Angular CLI...
    99+
    2024-04-02
  • Spring依赖注入的示例分析
    这篇文章给大家分享的是有关Spring依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.依赖简介一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作