使用 Nmap 挖掘 SQL 注入漏洞

Beginner

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习 SQL 注入(SQL injection),这是一种攻击者利用与数据库交互的 Web 应用程序中的漏洞的技术。SQL 注入攻击可能导致未经授权访问敏感数据、数据篡改,甚至完全的系统破坏。

本实验的目标是通过利用一个存在漏洞的 Web 应用程序中的漏洞,获得 SQL 注入的实践经验。你将学习如何识别潜在的 SQL 注入漏洞、构造恶意的 SQL 查询,并从数据库中提取敏感信息。此外,你还将学习防御机制和最佳实践,以减轻 SQL 注入攻击的风险。


Skills Graph

设置实验环境

在这一步中,你将设置实验环境,其中包括一个存在漏洞的 Web 应用程序和一个数据库服务器。

  1. 打开终端并导航到 /home/labex/project 目录。

    cd /home/labex/project
  2. project 目录中有两个 Python 文件:app.pysetup_db.pyapp.py 文件包含存在漏洞的 Web 应用程序的源代码,而 setup_db.py 文件包含设置数据库的代码。

  3. 运行 setup_db.py 脚本以创建数据库并填充示例数据。

    python3 setup_db.py
  4. 启动 Web 应用程序服务器。

    python3 app.py

你应该会看到一条消息,指示服务器正在 http://localhost:5000 上运行。

识别 SQL 注入漏洞

在这一步中,你将学习如何识别 Web 应用程序中潜在的 SQL 注入漏洞。

  1. 打开浏览器并访问 http://localhost:5000
    Web 应用程序主页
  2. 寻找用户数据提交到服务器的输入字段,例如搜索框。
  3. 尝试在输入字段中输入特殊字符或 SQL 关键字(例如 '"--;),并观察应用程序的行为。
  4. 如果应用程序显示错误信息或行为异常,可能表明存在潜在的 SQL 注入漏洞。
    搜索框输入测试
    当你在搜索框中输入单引号(')并点击“搜索”按钮时,应用程序仅显示 No results found,而没有显示任何错误信息。这种行为表明应用程序可能存在 SQL 注入漏洞。

利用 SQL 注入漏洞

在这一步中,你将学习如何利用已识别的 SQL 注入漏洞从数据库中提取敏感信息。

  1. 找到上一步中识别的存在漏洞的输入字段或参数。

  2. 尝试在输入字段或参数中插入不同的 SQL 注入 payload。

  3. 尝试使用 SQL 注入 payload 从数据库中提取敏感信息。例如,你可以使用以下 payload 从数据库中提取数据:

    ' UNION SELECT username, password FROM users --

    上述 payload 可用于从数据库的 users 表中检索用户名和密码。

  4. 观察应用程序的响应,并查找是否显示了任何敏感信息,或者是否出现了可能揭示数据库结构或内容的错误。

缓解 SQL 注入漏洞

在这一步中,你将学习防御机制和最佳实践,以缓解 SQL 注入漏洞。

  1. 审查存在漏洞的 Web 应用程序的源代码,并识别在数据库查询中未经过适当清理的用户输入区域。

  2. 实施输入验证和清理技术,例如:

    • 参数化查询或预编译语句(Prepared Statements)
    • 输入验证和清理(例如,移除或转义特殊字符)
    • 数据库账户的最小权限原则
  3. 更新应用程序代码,在使用用户输入执行数据库查询时使用参数化查询或预编译语句。将 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()
  4. 完成上述更改后,保存文件并重新启动 Web 应用程序服务器。

    使用 ctrl+c 停止服务器,然后使用以下命令重新启动:

    python3 app.py
  5. 测试更新后的应用程序,确保 SQL 注入攻击不再可能发生。

总结

在本实验中,你学习了 SQL 注入,这是一种攻击者利用与数据库交互的 Web 应用程序中的漏洞的技术。你设置了一个存在漏洞的 Web 应用程序和数据库服务器,识别了潜在的 SQL 注入漏洞,并利用这些漏洞从数据库中提取了敏感信息。此外,你还学习了缓解 SQL 注入攻击的防御机制和最佳实践,例如输入验证、清理以及使用参数化查询或预编译语句(Prepared Statements)。

通过这次实践,你更深入地理解了 SQL 注入攻击以及如何在 Web 应用程序中预防它们。你还了解了安全编码实践的重要性,以及在数据库交互中未能正确清理用户输入可能导致的后果。