前言

在书上166面的7.2.4编码问题,讨论了宽字符集,GBK编码导致的漏洞。但是有些地方讲得有点迷糊,也许还有错别字。

所以我结合国外在06年发布的addslashes() Versus mysql_real_escape_string()这篇文章分析了一下。

问题1

白帽子讲web安全 编码问题sql注入的 笔记

这里需要知道,作者借char表达的意思是字符,不是字节

但是加的图所说的“db interprets as 2 chars”和上面的“0xbf27 和 0xbf5c都会被认为是一个字符”就让人头疼了。

所以需要对照着英文看:

In GBK, 0xbf27 is not a valid multi-byte character, but 0xbf5c is. Interpreted as single-byte characters, 0xbf27 is 0xbf (¿) followed by 0x27 ('), and 0xbf5c is 0xbf (¿) followed by 0x5c (\).

That's because 0xbf5c is interpreted as a single character, not two. Oops, there goes the backslash.

根据上面几行英文,和图上的“db interprets as ...”,可以知道

在GBK字符集中,0xbf27 不是一个有效的多字节字符,在解析为单字节字符的过程中,0xbf27 变成了 0xbf(¿) 和 0x27(') 这两个字符,0xbf5c 是GBK字符集里有效的中文字符(縗)

白帽子讲web安全 编码问题sql注入的 笔记

对照着上图,再看原文的图就清楚了。原图的意思是:当0xbf27被解释为2个字符时,是(¿)(')
当0xbf5c被解释为1个字符时,是(縗)

问题2

白帽子讲web安全 编码问题sql注入的 笔记

根据两处对比,可以看到下面的应该是“双字节字符会被认为是两个字符”,而不是字节。

只有将0xbf27认为是2个字符,才可以对0x27这个引号进行转义。所以可能是作者笔误。

扩展

另外提一下,在网上,上面那个英文博客的翻译是有问题的:

白帽子讲web安全 编码问题sql注入的 笔记

原英文:

That's because 0xbf5c is interpreted as a single character, not two. Oops, there goes the backslash.

可以知道,译文把a single character翻译成单字节字符是不对的,应该是单个字符。


我也是刚刚学习web安全,文章99%都是粘贴的。


参考:

互联网安全知多少 - 简书
PHP字符编码绕过漏洞总结 | 鬼仔's Blog