使用两个单引号转义单引号时的SQL注入

时间:2015-01-31 00:17:32

标签: mysql sql

当单引号被两个单引号转义时,有没有办法执行SQL注入?我知道MySQL服务器正在使用这种特定的技术来防止攻击。我尝试以特定用户身份登录,但我为密码尝试的所有常见注入都没有成功(例如'或' 1' =&## 39; 1,'或' 1 = 1,等等。

2 个答案:

答案 0 :(得分:4)

不,是的。

无法获得不安全的价值观"突破"如果提供的值是"转义"用单引号括起来的字面值通过单引号前加一个单引号。

也就是说,假设您的语句保证字符串文字用引号括起来,作为" static"的一部分。 SQL文本。

示例perl-ish / php-ish

$sql = "...  WHERE t.foo = '" . $safe_value . "' ... ";
                           ^                   ^

我在此强调,包含文字的单引号是SQL文本的一部分。如果$safe_value已被"转义"通过在"不安全"之前的每个单引号前面价值与另一个单一值,以使其安全" ...

$unsafe_value  $safe_value
-------------  ------------
I'm going      I''m going
'she''s'       ''she''''s''
1'='1 --       1''=''1 --

只要正确处理转义,我们保证可以通过转义运行潜在的不安全值,那么在数据值中包含单引号并不是一种可行的方法来突破"突破"带有SQL文本的文字。

" no"部分答案。

"是"部分答案。

最大的问题之一是确保无处不在,并且在某个地方没有犯错,假设潜在的不安全字符串是"安全",并且没有被转义。 (例如,假设从数据库表中提取的值是" safe",并且在将它们包含在SQL文本中之前不会转义它们。)

此外,单引号技巧是SQL注入的唯一途径。代码可能仍然容易受到攻击。

首先,如果我们不小心语句的其他部分,比如包含字符串文字的单引号。或者,例如,如果代码在提交到数据库之前通过其他函数运行$sql

$sql = some_other_function($sql);

some_other_function的返回可能会返回实际上容易受到攻击的SQL文本。 (作为一个荒谬的例子,some_other_function可能用一个单引号替换所有出现的两个连续单引号.DOH!)

此外,对于大量可能的unicode字符,如果我们经历了字符集翻译,那么某些unicode字符也可能被映射到单引号字符。我没有任何具体的例子,但在某些地方的甜甜圈,在过多的多字节编码中,在某个地方会有一些unicode字符转换为某个目标中的单引号。

目标中的默认字符是源中未映射的字符,并且通常是问号(或黑色菱形中的白色问号)。如果是目标中的默认字符(对于源中未映射的字符)是单引号。

结论:通过用两个单引号替换单引号来转义不安全字符串对于调解(减轻?)SQL注入漏洞有很长的路要走。但就其本身而言,它并不是保证代码不会以其他方式受到攻击。

答案 1 :(得分:2)

如果输入接受unicode并在数据库中隐式转换为ascii(并非听起来不常见),那么攻击者可以简单地用'或'(0x02BB或0x02BC)代替单个tick来绕过转义机制并且隐式转换会将这些字符映射到单个刻度(至少在SQL Server中就是这种情况)