你能发现SQL注入吗?

时间:2013-12-03 05:10:14

标签: mysql sql code-injection

我在2600读书,但这篇文章也在这里https://viaforensics.com/mobile-security/static-code-analysis-watchtower.html无论如何都有一个代码块:

$result = mysql_query("SELECT * FROM users WHERE username = '{$_GET['username']}' AND `password` = SHA1('{$_GET['password']}')")

作者说:“2600的读者会发现明显的SQL注入,但似乎许多程序员 - 显着 - 不会。”有人可以解释并指出他的意思吗?

对我来说,我的意思是他的意思是,因为它似乎没有为注射臭名昭着的人物清理数据,因为它很脆弱?

我对PHP5 / MySQL相对较新,并且一遍又一遍地查看这些代码,但是无法得出任何其他结论。

3 个答案:

答案 0 :(得分:6)

如果username类似'' OR ''=''#password'anything',则会使查询短路成为:

SELECT *
FROM users
WHERE username ='' OR ''=''#AND password ='anything' 

您可以通过将SQL注入参数来短路逻辑。

答案 1 :(得分:2)

缓解SQL注入的最佳方法是在所有SQL查询中使用参数。

如果连接字符串以创建查询,则可以降低注入风险,但这不是最好的方法。您可以假设连接时总是存在风险。对于上面的查询,您可以将任何所需的值注入参数。

答案 2 :(得分:2)

让我们稍微扩展一下Namphibian的答案,$ _GET ['parameter']是一个参数,它是URL的一部分,所以它看起来像。

http://link/foo.php?username=thatguy&password=whoa

$ _GET ['username']是“thatguy”而$ _GET ['password']是“whoa”

所以我们把它放在代码中。

$result = mysql_query("SELECT * FROM users WHERE username = 'thatguy' AND `password` = SHA1('whoa')")

如果我们为用户名传递“' OR ''=''#”会发生什么,让我们只为网址编码。

http://link/foo.php?username=%27%20OR%20%27%27%3D%27%27%23&password=whoa

这将返回

$result = mysql_query("SELECT * FROM users WHERE username = '' OR ''=''# AND `password` = SHA1('whoa')")

' OR ''=''#将强制查询返回所有结果,#将注释掉MySQL语句的其余部分,因此谁关心密码。

所以MySQL查询只会查看

SELECT * FROM users WHERE username = '' OR ''=''

只需要有人确认网址编码。