注意:这是一个在虚拟机中有一个虚拟站点的项目.这是我正在做的一个高级大学项目。我不是想利用一个真实的,真实的网站。这是为了教育目的,了解这样的功绩是多么强大,即使在给定的功能。
我目前正在从事一个项目(在一个安全和受控的环境下,在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 --。第一个和最后一个引号是通过()函数自动添加的,以及转义单引号之后的附加引号。然而,这似乎不是适当的SQL语法,可能是因为它将整个$user输入解释为用户名。
在这个语句之后还有另一个准备好的语句,但是它依赖于与salt连接的密码的md5散列,而且我认为在md5返回哈希之后,没有任何方法可以在语句中注入任何内容。出于好奇,声明如下:
$query = "SELECT * FROM Accounts WHERE Username = '$user' AND Password = '$hash';用$hash = md5($pass.$salt)。
有人想弄清楚什么可能性吗?也许我真的忽略了它,但我觉得我已经试过了所有的东西。
编辑:我解决了这个问题。它与利用注入的另一个功能有关。它最终添加了一个用户名和注入代码(二阶注入),然后它将进行登录。登录过程引用第一个查询的用户名,但第二个查询没有;因此,用户将自动登录。
发布于 2012-03-05 01:41:50
SQL中的反斜杠是一个令人烦恼的主题,它依赖于正在使用的DBMS。
标准SQL没有赋予它们任何意义。若要在字符串中转义引号,请将引号加倍。您使用的quote方法似乎遵循了这一原则:
\' OR 1=1 --
'\'' OR 1=1 --'输入:
有些DBMS可能实际上定义了反斜杠的含义。然而,更复杂的是,您通常有数量不定的中介语言(PHP、ODBC等),这些语言也可能修改字符串,并可能将意义应用于纯SQL所不具备的反斜杠。
如果键入X' OR 1=1 --,(用X代替反斜杠),您将得到相同的映射字符串,反斜杠由X代替。因此,如果攻击要工作,则需要quote()方法来混淆数据库管理系统将如何处理反斜杠,但这相当于quote()方法中的一个错误。
如果您成功地嵌入了Unicode转义序列,您可能会得到更多的支持。例如,U+0027 (十进制39)是单引号。这种诡计可能会让你通过quote(),但它可能不会。quote()-like方法背后的想法是,你不应该在它们之前扭曲文本,这意味着除了预期之外的其他东西。对于字符的非最小UTF-8编码可能会因为服务器中的错误而触发问题,但这并不完全可能。Unicode标准很清楚,不应该接受无效的UTF-8编码--这在安全信息附近的任何地方都是双重的。
您说得对,包含在引号中的散列的输出将无法有效地注入,特别是当攻击者从未看到盐分时。
发布于 2022-01-03 08:16:42
‘或1=1限制1--从tsdf选择* sdf=’
要对付最后一个引号,只需添加一个SELECT查询,以使语句有效。它将不会有任何效果,因为
https://stackoverflow.com/questions/9560520
复制相似问题