有一个类似的查询:
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.或任何其他用户以及如何?
答案 0 :(得分:3)
这只是一个SQL查询,它不会登录或执行任何其他应用程序功能。检索到的数据完全取决于具体的应用程序。
代码可能会愉快地使用生成的记录集中的第一行并假设该用户是要登录的。它也可能抛出异常,例如,如果查询是使用LINQ完成的,.SingleOrDefault()
是用过的。没有看到应用程序代码,就没有办法知道。
答案 1 :(得分:2)
tablename
表中的所有行都将返回到运行此查询的任何行。返回这些行的订单没有明确定义(并且表没有订单,因此您对“第一行”的猜测由于多种原因而错误)
然后我们需要查看消费代码以了解发生了什么 - 它可能需要第一行,它可能需要给出最后一行(此查询的不同运行可能不同第一行和最后一行,因为正如我所说,订单没有明确定义)。它可能会(以某种方式)将所有结果行合并在一起。
当您的代码受SQL注入时,您不应该试图解释会发生什么,您应该只应用足够的防御(例如参数化查询),这样您就不必考虑它了试。
例如,假设为了参数,该查询总是以某种特定顺序返回行(只要月亮已满),这样最低UserID
(或类似)是第一行,消费代码使用第一个返回的行并忽略其他行。因此,您决定“巧妙地”创建一个UserID
0的虚拟用户,该用户无法执行任何操作并向您发出攻击警告。
嗯,猜猜是什么 - 攻击者必须做的就是在查询中注入ORDER BY CASE WHEN UserName='Admin' THEN 0 ELSE 1 END
- 而宾果游戏,返回的第一行现在保证成为管理员用户。< / p>