2012-09-11 53 views
-2

有一个查询,如:SQL注入澄清

select * from tablename where username='value1' and password='value2';

如果我设置为各字段的内容:

username ='admin' and password ='admin'; 

然后我登录到网站管理员。现在

,如果我想SQL注入我的查询,我将进入到用户名输入字段中的值
'or 1=1,之后查询将等执行:

select * from tablename where username ='' or 1=1

后,假设一切这个查询成功执行。

我的问题是基于上面的例子,我们将登录为什么用户?

由于:
    1.联系
    2.或者第一行中的表?
    3.或者其他用户,以及如何?

+1

几乎不足以猜测。这似乎是一个非常可疑的问题,只需修复漏洞。 –

+0

它取决于其余的登录代码。没有足够的信息在SQL中可以确定。可能是表中的第一个用户。试试看看。唯一确定的方法就是测试它。 – David

+0

@djadmin How do you say它可以解释 – thuk

回答

3

这只是一个SQL查询,它不会登录或执行任何其他应用程序功能。对检索到的数据做了什么完全取决于特定的应用程序。

代码可能会愉快地使用结果记录集中的第一行,并假定它是要登录的用户。它也可能会引发异常,例如,如果查询是使用LINQ完成的,并且使用了.SingleOrDefault()。没有看到应用程序代码,就没有办法知道。

+0

是的,这是正确的。但我需要知道,如果上面的查询用于后台登录到网站,我们将登录哪个用户..因为它返回所有行frm表,因为cnd对所有recrds都是true,那么应用程序必须发出错误或者它不能登录但一些我们如何登录。然后@这种情况下发生了什么是我的问题? – thuk

+0

@thuk里面发生的事是由你没有提供的代码决定的。所以你比我们更能回答这个问题:) – RedFilter

2

tablename表中的所有行将返回到正在运行此查询的任何行。其中返回这些行的订单没有很好定义(并且表格没有订单,所以您对“第一行”的猜测出于多种原因是错误的)

然后,我们需要查看消费代码以了解发生了什么 - 它可能需要给出第一行,可能需要给出最后一行(此查询的不同运行可能有不同第一行和最后一行,因为如我所说,订单没有明确定义)。它可能会尝试(以某种方式)将所有结果行合并在一起。

你不应该试图推理发生了什么当你的代码受SQL注入的影响时,你应该应用足够的防御(例如参数化查询),所以你不必再考虑它。


例如,可以说,为便于讨论,这个查询总是返回在某些特定的顺序行(只要月圆),使得最低UserID(或类似)是第一行,并且使用代码使用第一个返回的行并忽略其他行。所以你决定“狡猾”地创建一个虚拟用户,它不能做任何事情并警告你一个攻击。

好吧,猜猜看 - 攻击者所要做的就是在查询中注入一个ORDER BY CASE WHEN UserName='Admin' THEN 0 ELSE 1 END - 宾果,返回的第一行现在是保证是Admin用户。

+0

是的,这就是对的。但我需要知道,如果上面的查询用于后台登录到网站,我们将登录哪个用户..因为它返回所有行frm表,因为cnd对所有recrds都是true,那么应用程序必须发出错误或者它不能登录但一些我们如何登录。然后@这种情况下发生了什么是我的问题? – thuk

+1

@thuk - (在这里会有一段时间) - 你问一个你想象中的问题,它有一个明确而清晰的答案。你会收到3个答案,而且他们都不一样。 *我们*的意思是如何知道你*会对多个答案做出反应? –

+0

没有。3个答案不是我的。当我向这个问题提出同样的问题时,别人也说过了。这不是想象中的问题,这是今天的许多web应用程序的sql inection攻击的情况.. – thuk