宽字节注入和二次编码注入(绕过/‘转义)less32 |
您所在的位置:网站首页 › MySQL转义字符 › 宽字节注入和二次编码注入(绕过/‘转义)less32 |
Unicode
统一码,也叫万国码、单一码(Unicode)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。 宽字符(两个以上字节)宽字符是指两个字节宽度的编码技术,如UNICODE、GBK、BIG5等。 宽字节注入原理在使用PHP连接MySQL的时候,当设置“set character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入,当存在宽字节注入的时候,注入参数里带入% DF%27,即可把(%5C)吃掉 我们这里的宽字节注入是利用的MySQL的一个特性,MySQL的在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)。这就是MySQL的的特性,因为GBK是多字节编码,他认为两个字节代表一个汉字,所以%DF和后面的\也就是%5c中变成了一个汉字“运”,而“逃逸了出来。 方法:在注入点后键入%df’(单引号),然后进行正常注入 %27---------单引号 %20----------空格 %23-----------#号 %5c------------/反斜杠 防御1.使用mysql_set_charset(utf8)指定字符集 2、 使用mysql_real_escape_string进行转义 用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等 和宽字节注入一样的原理,都是为了绕过反斜杠的转义; 这里用的是键入%25–>%; %27---------单引号 %20----------空格 %23-----------#号 %5c------------/反斜杠 %25-----------%号 原理场景: 输入的特殊字符进行转义,且在转义操作之后存在编码函数 常规注入: 用户输入【1%27】=>php自身编码【1’】=>php检查到单引号,触发函数,进行转义【1\’】=>带入sql语句【select * from users where ID=’1\’’】=>不能注入 二次编码注入: 用户输入【1%2527】=>php自身编码,%25转换成%【1%27】=>php未检查到单引号,不转义【1%27】=>遇到一个函数编码,使代码进行编码转换【1’】=>带入sql语句=>能注入 关键:编码函数的位置,必须在转义函数之后,带入sql语句之前,sql语句中%27并不会转换成单引号 实战输入(宽字节) less32(preg_replace)源代码: 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; } mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); preg_replace()函数preg_replace ( pattern , replacement , subject ) 搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。 返回值 如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。 注入: 输入:?id=%df’ order by 4–+ 输入:?id=%df’ union select 1,2,3–+ 源代码: function check_addslashes($string) { $string= addslashes($string); return $string; } $id=check_addslashes($_GET['id']); mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); addslashes() 函数addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是: 单引号(’)双引号(")反斜杠(\)NULL注入: 输入:?id=%df’ order by 4–+ 输入:?id=%df’ union select 1,2,3–+ 爆库过程不再赘述 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |