DDSS:逐步解释

发布: (2026年1月8日 GMT+8 01:12)
10 min read
原文: Dev.to

Source: Dev.to

Important safety note – 本指南仅用于在本地机器上学习。
不要 将易受攻击的代码暴露到互联网。

1️⃣ 前置条件

所需内容为什么需要
已安装 Docker 的电脑Docker 在隔离的容器中运行应用和数据库。
Python 3.x(如果你想在本地安装 Python 包)Flask 代码和 pip 命令所必需。
终端 / 命令提示符用于运行指南中展示的命令。

如果尚未安装 Docker,请从 docker.com 下载并按照对应操作系统的安装说明进行安装。

测试安装:

docker --version

你应该会看到类似 Docker version 24.0.5, build abcdefg 的输出。

2️⃣ 获取项目文件

  1. 下载 发送给你的 ZIP 压缩包(文件名为 ddss-2025-assignment2-rc-main-2.zip)。
  2. 解压 它:
操作系统解压方式
Windows右键点击 ZIP → Extract All…
macOS双击 ZIP(会自动解压)。
Linux打开终端并运行 unzip ddss-2025-assignment2-rc-main-2.zip

解压后你会得到一个文件夹(例如 ddss-2025-assignment2-rc-main-2),其中包含:

  • Python 源代码文件(app.py 等)
  • 与 Docker 相关的文件(Dockerfiledocker-compose.ymldocker-compose-python-psql.sh
  • 其他资源(模板、静态文件、README 等)

3️⃣ 启动 Docker

  1. 打开 Docker Desktop(或运行 Docker 守护进程)。
  2. 验证它是否正在运行——你应该在任务栏 / 菜单栏看到 Docker 鲸鱼图标。

4️⃣ 打开终端 / 命令提示符

平台打开方式
Windows搜索 Command Prompt(或 PowerShell)。
macOS打开 Terminal(⌘ Space → “Terminal”。)
Linux打开您喜欢的终端模拟器。

5️⃣ 导航到项目文件夹

cd ~/Downloads               # or wherever you saved the ZIP
cd ddss-2025-assignment2-rc-main-2

如果出现 “No such file or directory” 错误,请列出当前目录内容(macOS/Linux 上使用 ls,Windows 上使用 dir),并相应地调整文件夹名称。

6️⃣ Install the required Python packages

pip install flask psycopg2-binary werkzeug bandit
PackageWhat it does
flask用于 Python 的极简 Web 框架。
psycopg2‑binaryPython 的 PostgreSQL 驱动。
werkzeugFlask 使用的实用库。
bandit静态安全分析器(可选但有用)。

如果你更喜欢隔离的环境,请先创建 virtualenv (python -m venv venv && source venv/bin/activate).

7️⃣ 构建并启动 Docker 容器

The project ships a helper script that runs Docker Compose.

# Make the script executable (only needed the first time)
chmod +x docker-compose-python-psql.sh

# Run it
./docker-compose-python-psql.sh

发生了什么

  • Docker Compose 构建两个容器:
    1. Python/Flask 应用 (web).
    2. PostgreSQL 数据库 (db).
  • 镜像会从 Docker Hub 拉取(这可能需要几分钟)。
  • 脚本完成后,你会看到 “finished building” 或类似的消息。

8️⃣(可选)在 DB 容器内打开 psql shell

打开一个 第二个 终端标签页/窗口并运行:

docker exec -it db psql -U ddss-database-assignment-2 -d ddss-database-assignment-2

你会进入 PostgreSQL 提示符:

ddss-database-assignment-2=#

使用 \q 退出。
这对于检查表或调试非常方便。


9️⃣ 访问网页应用

ActionURL
打开主页http://localhost:8080
注册新用户http://localhost:8080/register

使用任何现代浏览器(Chrome、Firefox、Edge、Safari)。

  1. 注册 一个普通账户(随意选择用户名/密码)。
  2. 您现在可以登录并探索作业的不同部分。

🔟 演示漏洞

10.1 SQL 注入(易受攻击版本)

  1. 打开 登录 页面(通常在 /login/part1)。
  2. 输入以下值:
字段负载
用户名' OR '1'='1' --
密码任意(例如 blah
  1. 点击 登录

结果: 你应该看到类似 “VULNERABLE LOGIN SUCCESS” 的信息。

为什么它有效
应用程序构建的查询类似于:

SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = 'blah';
  • OR '1'='1' 永远为真。
  • -- 将其余部分注释掉,去除密码检查。
  • 查询返回一行记录,因此登录在没有有效凭证的情况下成功。

10.2 SQL 注入(安全版本)

  1. 安全 登录表单上使用相同的负载(通常位于 /secure-login 或其他路径)。
  2. 应用程序现在使用 参数化查询(预处理语句),因此输入被视为数据而非代码。

结果: 你应该收到 “Invalid credentials”(或类似)信息——注入失败。

📚 您学到了什么

概念在指南中的出现方式
Docker containers隔离 Flask 应用和 PostgreSQL 数据库。
Flask用于易受攻击的应用的最小化 Python Web 框架。
SQL injection通过在登录表单中注入 ' OR '1'='1' -- 演示。
Parameterised queries阻止注入的修复方案。
XSS (cross‑site scripting)(在摘录中未涉及,但属于作业内容。)
Bandit用于扫描 Python 代码中的安全问题的工具。

✅ 下一步

  1. 运行 Bandit 对源代码进行检查,查看它标记了哪些问题:

    bandit -r .
  2. 修复 XSS 漏洞(查找未对用户输入进行转义就直接渲染的地方)。

  3. 撰写简短报告,描述每个漏洞、你是如何利用的以及你是如何进行缓解的。

祝好运,且请记住:始终在 离线 环境下测试安全缺陷,切勿将易受攻击的代码暴露在公共互联网!

登录失败说明

消息: LOGIN FAILED

原因?
安全版本使用 预处理语句 来防止 SQL 注入。输入被视为数据,而不是可执行代码。

第11步 – 测试第2部分:会话授权及其他

1. 未登录

  • 尝试访问 /part2.html/part3.html
  • 预期行为:应被重定向到 /part1.html(需要登录)。

2. 已登录(安全方式)

  1. 通过 安全 登录表单正确登录。
  2. 然后访问 /part2.html/part3.html ——它们应正常加载。

为什么?
即使漏洞登录让你进入,应用仍使用会话(例如 cookie)来跟踪身份验证。没有有效会话,受保护的页面无法访问。

XSS (跨站脚本) 演示

易受攻击的表单

  1. 在消息表单(可能在 /part2)中提交以下负载:

    alert('XSS')
  2. 刷新页面。

结果: 弹出一个警告框。

原因: 应用将原始脚本存入数据库并直接渲染,未进行转义,浏览器因此将其当作 JavaScript 执行。

安全表单

  1. 提交相同的负载 (alert('XSS'))。
  2. 刷新页面。

结果: 没有弹窗;脚本以纯文本形式显示。

原因: 安全版本对输出进行转义(例如在 Flask 中使用 Jinja 的自动转义),将 < 转换为 &lt;,使脚本失效。

消息列表

指南展示示例消息。您自己的消息可能不同,但行为(执行 vs. 转义)应保持相同。


报告摘要表

将以下 Markdown 表格复制到你的作业报告中:

VersionVulnerabilityResult
VulnerableStored XSSJS executed
SecureEscaped outputSafe display

你现在已经演示了 SQL injection(用于登录以及可能的数据访问)和 XSS,以及它们的缓解措施。

Source:

SQL 注入演示(图书查询)

易受攻击的查询

  1. 在不安全的表单中(查找 “price more than”),输入:

    0 OR 1=1 --
  2. 提交表单。

结果: 列出所有图书。

原因:
注入利用了 SQL 引擎忽略价格条件的漏洞,返回每一行(类似于登录绕过)。

安全的查询

  • 使用相同的输入 (0 OR 1=1 --)。
  • 预期行为:不返回任何图书,或查询安全地失败。

原因:
参数化(预处理)语句阻止注入修改查询逻辑。

最后提示

  • 故障排除: 如果出现错误,请检查终端中的错误信息。使用 docker-compose down 重启 Docker,然后重新运行设置脚本。
  • 学习要点: 本练习说明了 输入验证预处理语句输出转义 在 Web 应用程序中的重要性。
  • 报告指南: 捕获成功和失败尝试的截图,按上述方式解释每一步,并包含汇总表。
  • 清理: 完成后,在项目文件夹中使用 docker-compose down 停止 Docker 容器。

如果任何步骤不清楚,请随时就具体部分提出澄清。加油——计算机科学就是不断实验! 🚀

Back to Blog

相关文章

阅读更多 »

静默的反叛:唤醒你的AI

问题:大多数 AI 是为了让你保持沉睡而构建的。无尽的答案。无限的上下文。一个令人安慰的幻觉,认为智能存在于别处——遥远的某处。