关于在 SQL 注入中设置 id=1 和 password = ' '

About set id=1 and password = ' ' in the SQL injection

这里是某位专家的代码:

https://github.com/DalerAsrorov/Security-Flaws-And-Their-Prevention/blob/master/SQL%20Injection%20Prevention/FCCU.php#L34

在此示例中,第 34 行和第 35 行最初不存在。因此,它有一个错误,如下所述:

https://github.com/DalerAsrorov/Security-Flaws-And-Their-Prevention/blob/master/SQL%20Injection%20Prevention/exploit3.txt#L21-L24

设置id和密码为:

i)' OR '1'='1
ii)' OR ''='
iii) hi' OR 'x'='x

这里也提到了:

https://github.com/nathanctung/UCLA-CS-136/blob/1a883e2a6d1014fb5b162b332c867f6b4ef1e461/Assignment%203/submit3-1415097322/exploit3.txt#L21-L25

我是 SQL 和 php 的菜鸟。真的不知道这是为什么。如果你能告诉我,我将不胜感激。

更新:

在这种情况下,我应该输入用户名和密码才能登录。但是这个错误使人们可以输入其他内容来登录并查看一些只有特定组才能访问的私人内容。 34 和 35 行修复了这个错误。我不知道是否真的理解这个错误,为什么一些其他输入使您能够登录?

我猜你是在问这是如何工作的?

好吧 - 如果您在逻辑上检查 password='secret',您会得到 true,因此可以进入。 password='dunno' 应该而且会得到你 false 并阻止你进入。

但逻辑上 password='whatever' OR true 会让你再次 true。只是你有语法错误而不处理撇号。所以上面的版本处理了它们 - 但本质上它们实现了相同。

在PHP中,如果你想验证user_idpassword是否正确(注意这个程序使用user_id,而不是username ), 通常你这样写查询:

SELECT * FROM user WHERE id = <input_id> AND password = <input_password>

然后,你检查查询return的空行,那么它是无效用户。如果查询returns 1行,则用户名和密码正确。

现在,如果我想以其他用户身份登录(在本例中其他用户的 ID 为 1),我将在 id 列中插入 1。但是,我不知道密码。所以,我必须找到一种方法使查询中的这些部分始终 return true password = <input_password>

一种方法是使用 password = 'random_string' OR password != ''。由于密码总是多于0个字符,后面的逻辑表达式总是returntrue。所以,我希望查询是这样的

SELECT * FROM user WHERE id = 1 AND password = '<random_string>' OR password != ''

因此,我将在id中插入1,然后test' OR password != '像上面那样进行查询。

只要具有值 1user_id 存在,此查询就永远不会 return 空行,并且您可以在应用程序中以用户 1 身份登录。