我不了解我在启动注入攻击时遇到的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,但我真正的问题是自动填充是在" - "之后删除了空格。我必须第一次搞砸了,然后愚蠢地依靠自动填充
答案 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