允许使用反斜杠的LIKE中的SQL注入

时间:2013-12-13 12:16:22

标签: php mysql sql-injection

目前,我正在测试一些代码,我注意到了这一点:

$data = str_replace( array('"', "'") , "", $_GET['input']);
$query = "SELECT * FROM tab WHERE LOWER(title) LIKE '%$data%'";

现在,我没有兴趣询问如何使这段代码安全。我很想知道你如何使用反斜杠(\\)或其他任何东西在现实世界中引入SQL注入。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

虽然可能会有一些unicode技巧来插入一个'in $ data,这不是'用PHP术语',但是被你的数据库解释为'(我知道这听起来很挑剔)我首先注意到这个例如,我无法搜索“它是”或“我是”这样的短语。

答案 1 :(得分:1)

@Laxus它不依赖于使用的编码,而是假设编码。如果php代码假设一个编码(通常不是UTF-8,因为php默认情况下不能处理多字节字符串,所以它只需要每个字节一个字符),而数据库使用另一个(例如UTF-8)

UTF-8方案可以使用多个字节将代码点编码为字符,如wikipage http://en.wikipedia.org/wiki/UTF-8上所示

使用以下方案将127以下的码点存储在单个字节中:

0xxx xxxx

其中x是代码点的位。 如果码点高于127(即:超过7位),则使用两个字节:

110x xxxx 10xx xxxx

'的代码点为27(十六进制)或10 0111(二进制)。 Normaly这是存储在一个字节

0 010 0111

仍然是十六进制:27

恶意攻击者可以选择将其存储为两个字节(用0填充)

110 0 0000 10 10 0111

和十六进制:C0 A7

现在php处理这个并假设这两个字节是两个单独的字符(因为它只使用ascii)。它试图替换27,但字符串只包含C0和A7,所以没有找到27。但是,数据库确实理解UTF-8并将此代码点解码回'。

可能注射!!

这些类型的编码称为超长编码,并不是真正有效的utf-8字符,但它可能只是通过一个错误的utf-8实现。

答案 2 :(得分:0)

目前的代码是不可能的。虽然当存在2个参数时可以执行sql注入,但想象下一段代码:

$data1 = str_replace( array('"', "'") , '', $_GET['input1']);
$data2 = str_replace( array('"', "'") , '', $_GET['input2']);
$query = "SELECT * FROM tab WHERE LOWER(title) = '$data1' AND asd = '$data2';";

现在你猜测参数的顺序(排列或尝试/错误),然后在第一个$ _GET参数中发送一个反斜杠,属性编码(%5c)。你得到:

SELECT * FROM tab WHERE LOWER(title) = '\' AND asd = '$data2';

标题字段现在必须与“\”AND asd =“匹配,我怀疑是否会发生这种情况。作为第二个$ _GET参数,您可以传递(AND 1 = 1) - 。这里的最终评论( - )非常重要,因为你必须摆脱最后的引用。你终于得到了:

SELECT * FROM tab WHERE LOWER(title) = '\' AND asd = '(AND 1=1) --';

完成了。如果你想转储impormation架构,你仍然不能使用引号,所以你必须使用十六进制值,服务器完全耗尽。