原理
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串---PHP addslashes()函数
在mysql中,用于转义(即在字符串中的符号前加上”\”)的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。
mysql 在使用 GBK 编码的时候, 会认为两个字符为一个汉字, 例如%aa%5c 就是一个
汉字(前一个 ascii 码大于 128 才能到汉字的范围) 。 我们在过滤 ’ 的时候, 往往利用的思
路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍) 。
因此我们在此想办法将 ‘ 前面添加的 \ 除掉, 一般有两种思路:
1、 %df 吃掉 \ 具体的原因是 urlencode(‘\) = %5c%27, 我们在%5c%27 前面添加%df, 形
成%df%5c%27, 而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字, 此
事%df%5c 就是一个汉字, %27 则作为一个单独的符号在外面, 同时也就达到了我们的目的。
2、 将 \’ 中的 \ 过滤掉, 例如可以构造 %**%5c%5c%27 的情况, 后面的%5c 会被前面的%5c
给注释掉。 这也是 bypass 的一种方法。
涉及到的基本概念
字符、字符集
字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。
UTF8
由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal Transformation Format)。
宽字节
GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。
本文探讨了宽字节注入的原理,特别是在GBK编码下如何利用%df和%**%5c%5c%27等方式绕过字符串转义。文章详细解释了addslashes()函数在PHP和MySQL中的作用,以及如何通过字符集特性来规避过滤。同时,介绍了字符、字符集的基本概念,如UTF8和宽字节的概念。
347

被折叠的 条评论
为什么被折叠?



