Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL注入澄清_Sql_Security_Sql Injection_Owasp - Fatal编程技术网

SQL注入澄清

SQL注入澄清,sql,security,sql-injection,owasp,Sql,Security,Sql Injection,Owasp,有这样一个查询: 从表名中选择*,其中username='value1'和password='value2' 如果我将以下字段设置为: username ='admin' and password ='admin'; 然后我以管理员身份登录网站 现在,如果我想用SQL注入我的查询,我会在用户名字段中输入值”或1=1,然后执行查询,如下所示: 从用户名为“”或1=1的tablename中选择* 假设在此之后所有操作都已完成,则查询将成功执行 我的问题是基于上面的例子,我们将作为什么用户登录 A

有这样一个查询:

从表名中选择*,其中username='value1'和password='value2'

如果我将以下字段设置为:

username ='admin' and password ='admin'; 
然后我以管理员身份登录网站

现在,如果我想用SQL注入我的查询,我会在用户名字段中输入值
”或1=1
,然后执行查询,如下所示:

从用户名为“”或1=1的tablename中选择*

假设在此之后所有操作都已完成,则查询将成功执行

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

As:
1.管理员
2.还是表中的第一行?

3.或者任何其他用户以及如何使用?

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


代码可能会很高兴地使用结果记录集中的第一行,并假设这是要登录的用户。它还可能引发异常,例如,如果使用LINQ执行查询并且使用了
。SingleOrDefault()
。如果看不到应用程序代码,就无法知道。

表名中的所有行都将返回到运行此查询的任何行。这些行的返回顺序没有很好的定义(而且表没有顺序,因此您对“第一行”的猜测是错误的,原因有很多)

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

当您的代码受到SQL注入时,您不应该试图推理会发生什么,您应该应用适当的防御措施(例如参数化查询),这样您就不必再考虑它了


例如,为了便于讨论,假设此查询总是以某种特定顺序返回行(只要月亮是圆的),这样最低的
用户ID
(或类似的)就是第一行,并且使用代码的代码使用返回的第一行,而忽略其他行。因此,您决定“狡猾地”创建一个用户ID为
UserID
0的虚拟用户,该用户无法执行任何操作,并警告您可能受到攻击


好吧,猜猜看——攻击者所要做的就是在UserName='Admin'然后0 ELSE 1结束时,按大小写向查询中注入一个
顺序,然后宾果,返回的第一行现在保证是Admin用户。

几乎没有足够的信息来猜。这似乎是一个非常可疑的问题;只需修复该漏洞。它取决于其余的登录代码。SQL中没有足够的信息来确定。可能是表中的第一个用户。试试看。唯一确定的方法就是测试它。@djadmin你怎么说它可以呢explain@thuk请阅读我最近关于SQL注入的帖子,你会发现它很有趣:是的,没错。但我需要知道,如果上面的查询在后台用于登录网站,我们将作为什么用户登录。。因为cnd对于所有的RECRD都为true,所以它返回frm表中的所有行,所以应用程序必须发出错误消息,或者它不能登录,而是我们如何登录。那么,@这个案例里面发生了什么是我的问题?@thuk-(在这里停留一会儿)-你问了一个你认为有一个明确答案的问题。你收到3个答案,它们都不同。我们怎么知道你对多个答案的反应?不,这三个答案不是我的。当我问thm同样的问题时,其他人也这么说。这不是想象中的问题,这是今天针对许多web应用程序的sql InAction攻击的情况。@thuk-我的意思是,运行此查询的任何程序都需要1行,而不是3行。如果不显示代码,它对这种情况的反应是不可知的。我在打个比方。是的,没错。但我需要知道,如果上面的查询在后台用于登录网站,我们将作为什么用户登录。。因为cnd对于所有的RECRD都为true,所以它返回frm表中的所有行,所以应用程序必须发出错误消息,或者它不能登录,而是我们如何登录。那么@this case里面发生的事情是我的问题吗?@thuk里面发生的事情是由你的代码决定的,你还没有提供。所以你比我们更能回答这个问题:)