sql注入布尔语法

时间:2015-08-05 17:55:59

标签: sql sql-injection operator-precedence

我不了解我在启动注入攻击时遇到的sql语法问题,因此非常感谢任何解释它们的帮助。我有一个目标php登录脚本,它采用用户名/密码组合,然后非常简单地运行。

 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') --

正在以适当的方式登录我,评估为

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

那么为什么我采用" OR"我的方法与'或'有用吗?

已解决:感谢您的指导。我现在更了解sql,但我真正的问题是自动填充是在" - "之后删除了空格。我必须第一次搞砸了,然后愚蠢地依靠自动填充

enter image description here

1 个答案:

答案 0 :(得分:3)

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