介绍
在本实验中,你将学习 SQL 注入(SQL injection),这是一种攻击者利用与数据库交互的 Web 应用程序中的漏洞的技术。SQL 注入攻击可能导致未经授权访问敏感数据、数据篡改,甚至完全的系统破坏。
本实验的目标是通过利用一个存在漏洞的 Web 应用程序中的漏洞,获得 SQL 注入的实践经验。你将学习如何识别潜在的 SQL 注入漏洞、构造恶意的 SQL 查询,并从数据库中提取敏感信息。此外,你还将学习防御机制和最佳实践,以减轻 SQL 注入攻击的风险。
搭建实验环境
在这一步中,你将设置实验环境,其中包括一个存在漏洞的 Web 应用程序和一个数据库服务器。
打开终端并导航到
/home/labex/project目录。cd /home/labex/project在
project目录中有两个 Python 文件:app.py和setup_db.py。app.py文件包含存在漏洞的 Web 应用程序的源代码,而setup_db.py文件包含设置数据库的代码。运行
setup_db.py脚本以创建数据库并填充示例数据。python3 setup_db.py启动 Web 应用程序服务器。
python3 app.py
你应该会看到一条消息,指示服务器正在 http://localhost:5000 上运行。
识别 SQL 注入漏洞
在这一步中,你将学习如何识别 Web 应用程序中潜在的 SQL 注入漏洞。
- 打开浏览器并访问
http://localhost:5000。
- 寻找用户数据提交到服务器的输入字段,例如搜索框。
- 尝试在输入字段中输入特殊字符或 SQL 关键字(例如
'、"、--、;),并观察应用程序的行为。 - 如果应用程序显示错误信息或行为异常,可能表明存在潜在的 SQL 注入漏洞。
当你在搜索框中输入单引号(')并点击“搜索”按钮时,应用程序仅显示No results found,而没有显示任何错误信息。这种行为表明应用程序可能存在 SQL 注入漏洞。
利用 SQL 注入漏洞
在这一步中,你将学习如何利用已识别的 SQL 注入漏洞从数据库中提取敏感信息。
找到上一步中识别的存在漏洞的输入字段或参数。
尝试在输入字段或参数中插入不同的 SQL 注入 payload。
尝试使用 SQL 注入 payload 从数据库中提取敏感信息。例如,你可以使用以下 payload 从数据库中提取数据:
' UNION SELECT username, password FROM users --上述 payload 可用于从数据库的
users表中检索用户名和密码。观察应用程序的响应,并查找是否显示了任何敏感信息,或者是否出现了可能揭示数据库结构或内容的错误。
缓解 SQL 注入漏洞
在这一步中,你将学习防御机制和最佳实践,以缓解 SQL 注入漏洞。
审查存在漏洞的 Web 应用程序的源代码,并识别在数据库查询中未经过适当清理的用户输入区域。
实施输入验证和清理技术,例如:
- 参数化查询或预编译语句(Prepared Statements)
- 输入验证和清理(例如,移除或转义特殊字符)
- 数据库账户的最小权限原则
更新应用程序代码,在使用用户输入执行数据库查询时使用参数化查询或预编译语句。将
app.py文件从:sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query) cur.execute(sql_query)修改为:
sql_query = "SELECT username, password FROM users WHERE username LIKE ?" cur.execute(sql_query, ('%' + query + '%',))并将
results = cur.fetchall()移动到logging.info(f"Search query: {query}")行下方。logging.info(f"Search query: {query}") results = cur.fetchall()完成上述更改后,保存文件并重新启动 Web 应用程序服务器。
使用
ctrl+c停止服务器,然后使用以下命令重新启动:python3 app.py测试更新后的应用程序,确保 SQL 注入攻击不再可能发生。
总结
在本实验中,你学习了 SQL 注入,这是一种攻击者利用与数据库交互的 Web 应用程序中的漏洞的技术。你设置了一个存在漏洞的 Web 应用程序和数据库服务器,识别了潜在的 SQL 注入漏洞,并利用这些漏洞从数据库中提取了敏感信息。此外,你还学习了缓解 SQL 注入攻击的防御机制和最佳实践,例如输入验证、清理以及使用参数化查询或预编译语句(Prepared Statements)。
通过这次实践,你更深入地理解了 SQL 注入攻击以及如何在 Web 应用程序中预防它们。你还了解了安全编码实践的重要性,以及在数据库交互中未能正确清理用户输入可能导致的后果。