首页 文章

针对quote()的SQL注入?

提问于
浏览
0

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

我目前正在开发一个涉及利用网站漏洞的项目(在安全和受控环境下,在VM内部) . 一部分涉及利用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) .

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

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

1 回答

  • 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编码可能会因为服务器中的错误而导致触发问题,但在安全信息附近的任何地方都不会出现双重错误 .

    你是正确的,用引号括起来的哈希输出不会有用注入,特别是如果攻击者从未看到盐 .

相关问题