【发布时间】:2012-03-22 13:31:00
【问题描述】:
注意:这是一个在虚拟机内有一个虚构站点的项目。这是我正在从事的一个高级大学项目。我并不是想利用一个真实的、真实的网站。这是出于教育目的,以了解此类漏洞利用的强大程度,即使具有给定的功能。
我目前正在从事一个涉及利用网站漏洞的项目(在安全和受控的环境下,在 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 输入解释为用户名。
在此之后还有另一个准备好的语句,但它依赖于与盐连接的密码的 md5 哈希,我认为一旦 md5 返回,我认为真的没有任何方法可以在语句中注入任何内容哈希。出于好奇,声明是这样的:
$query = "SELECT * FROM Accounts WHERE Username = '$user' AND Password = '$hash';
$hash = md5($pass.$salt)。
有人想阐明任何可能性吗?也许我只是真的忽略了它,但我觉得我已经尝试了一切。
编辑:我解决了这个问题。它与解决另一个函数来利用注入有关。它最终添加了一个带有注入代码的用户名(二阶注入),然后它会进行登录。登录过程引用了第一个查询的用户名,但第二个查询没有;因此,用户会自动登录。
【问题讨论】:
-
“我想到的最接近的注射方法是:” --- 我不相信。
\' OR 1=1 --这应该并且将被引用,没有任何问题 -
@zerkms 糟糕,我忘了解释我也尝试过其他注射。但它们似乎都是通过引用函数引用的。
-
那你期望得到什么?他们被引用是因为这就是引用的用途
-
@zerkms 当然可以。我明白这一点。我正在尝试利用该功能进行任何可能的注入。我只是征求意见。
-
1.我们不知道
quote()到底是什么 - 你没有解释 2. 如果有任何公开的已知漏洞 - 它们将在几天内修复
标签: sql sql-injection