针对quote()的SQL注入?

时间:2012-03-05 01:15:26

标签: sql sql-injection

注意:这是一个在虚拟机中具有虚拟站点的项目。这是我正在研究的高级大学项目。我不是想利用一个真实的,真实的网站。这是出于教育目的,即使使用给定的函数,也可以了解此类漏洞利用程序的强大程度。

我目前正在开发一个涉及利用网站漏洞的项目(在虚拟机内的安全和受控环境下)。一部分涉及利用SQL语句。目标是只能输入一个用户名和一个不正确的密码,并且仍然可以登录。我已经工作了几个小时而没有这样的运气,我做了很多研究了解哪些漏洞可用。

当一个人提交他们的用户名和密码时(在这种情况下,它可以是任何东西),使用以下准备好的SQL语句运行一个函数:

$query = "SELECT Salt FROM Accounts WHERE Username = '$quoted'";

$quoted的位置:

$quoted = $this->db->quote($user);

这实质上为每个提供的单/双引号添加了额外的单/双引号。尽管尝试了其他可能性(例如' OR 1=1'等),但我最接近的是:

SELECT Salt FROM Accounts WHERE Username = '\'' OR 1=1 -- '

$user变量最初为\' OR 1=1 --。第一个和最后一个引号通过quote()函数自动添加,以及转义单引号后的附加引号。然而,这似乎不是正确的SQL语法,可能是因为它将整个$user输入解释为用户名。

在这之后还有另一个准备好的声明,但它依赖于与salt连接的密码的md5哈希,我认为在md5返回后,在语句中确实没有任何方法可以进行任何注入哈希。出于好奇,声明如下:

$query = "SELECT * FROM Accounts WHERE Username = '$user' AND Password = '$hash';

$hash = md5($pass.$salt)

有没有人想透露任何可能性?也许我只是真的忽略它,但我觉得我已经尝试了一切。

编辑:我解决了这个问题。它与处理另一个功能以解决注入问题有关。它最终添加了一个带注入代码的用户名(二阶注入),然后它会进行登录。登录过程引用了第一个查询的用户名,但第二个查询没有;因此,用户将自动登录。

1 个答案:

答案 0 :(得分:2)

SQL中的反斜杠是一个烦恼的主题,而非依赖于正在使用的DBMS。

标准SQL对他们没有任何意义。要转义字符串中的引号,请将引号加倍。您使用的quote方法似乎遵循以下原则:

  • 输入:\' OR 1=1 --
  • 输出:'\'' OR 1=1 --'

某些DBMS实际上可能会定义反斜杠的含义。但是,为了使事情进一步复杂化,您通常会有不确定数量的中间语言(PHP,ODBC等),这些语言也可能会修改字符串,并且可能将含义应用于纯SQL不支持的反斜杠。

如果你键入X' OR 1=1 --,(用X代替反斜杠),你将得到相同的映射字符串,反斜杠替换为X.所以,如果攻击有效,你需要quote()方法要混淆DBMS将如何处理反斜杠,但这相当于quote()方法中的错误。

如果您设法嵌入Unicode转义序列,您可能会获得更多牵引力。例如,U + 0027(十进制39)是单引号。这种技巧可能会让你过去quote(),但可能不会。类似于quote()的方法背后的想法是,你不应该将文本蠕动过去,这意味着不同于预期的东西。由于服务器中的错误,字符的非最小UTF-8编码可能会导致触发问题,但并非所有这些都是可能的。 Unicode标准很清楚,不应接受无效的UTF-8编码 - 在安全信息附近的任何地方都是如此。

你是对的,用引号括起来的哈希的输出不会有用的注入,特别是如果攻击者永远不会看到盐。