DDSS:逐步解释
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️⃣ 获取项目文件
- 下载 发送给你的 ZIP 压缩包(文件名为
ddss-2025-assignment2-rc-main-2.zip)。 - 解压 它:
| 操作系统 | 解压方式 |
|---|---|
| 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 相关的文件(
Dockerfile、docker-compose.yml、docker-compose-python-psql.sh) - 其他资源(模板、静态文件、README 等)
3️⃣ 启动 Docker
- 打开 Docker Desktop(或运行 Docker 守护进程)。
- 验证它是否正在运行——你应该在任务栏 / 菜单栏看到 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
| Package | What it does |
|---|---|
| flask | 用于 Python 的极简 Web 框架。 |
| psycopg2‑binary | Python 的 PostgreSQL 驱动。 |
| werkzeug | Flask 使用的实用库。 |
| 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 构建两个容器:
- Python/Flask 应用 (
web). - PostgreSQL 数据库 (
db).
- Python/Flask 应用 (
- 镜像会从 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️⃣ 访问网页应用
| Action | URL |
|---|---|
| 打开主页 | http://localhost:8080 |
| 注册新用户 | http://localhost:8080/register |
使用任何现代浏览器(Chrome、Firefox、Edge、Safari)。
- 注册 一个普通账户(随意选择用户名/密码)。
- 您现在可以登录并探索作业的不同部分。
🔟 演示漏洞
10.1 SQL 注入(易受攻击版本)
- 打开 登录 页面(通常在
/login或/part1)。 - 输入以下值:
| 字段 | 负载 |
|---|---|
| 用户名 | ' OR '1'='1' -- |
| 密码 | 任意(例如 blah) |
- 点击 登录。
结果: 你应该看到类似 “VULNERABLE LOGIN SUCCESS” 的信息。
为什么它有效
应用程序构建的查询类似于:
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = 'blah';
OR '1'='1'永远为真。--将其余部分注释掉,去除密码检查。- 查询返回一行记录,因此登录在没有有效凭证的情况下成功。
10.2 SQL 注入(安全版本)
- 在 安全 登录表单上使用相同的负载(通常位于
/secure-login或其他路径)。 - 应用程序现在使用 参数化查询(预处理语句),因此输入被视为数据而非代码。
结果: 你应该收到 “Invalid credentials”(或类似)信息——注入失败。
📚 您学到了什么
| 概念 | 在指南中的出现方式 |
|---|---|
| Docker containers | 隔离 Flask 应用和 PostgreSQL 数据库。 |
| Flask | 用于易受攻击的应用的最小化 Python Web 框架。 |
| SQL injection | 通过在登录表单中注入 ' OR '1'='1' -- 演示。 |
| Parameterised queries | 阻止注入的修复方案。 |
| XSS (cross‑site scripting) | (在摘录中未涉及,但属于作业内容。) |
| Bandit | 用于扫描 Python 代码中的安全问题的工具。 |
✅ 下一步
-
运行 Bandit 对源代码进行检查,查看它标记了哪些问题:
bandit -r . -
修复 XSS 漏洞(查找未对用户输入进行转义就直接渲染的地方)。
-
撰写简短报告,描述每个漏洞、你是如何利用的以及你是如何进行缓解的。
祝好运,且请记住:始终在 离线 环境下测试安全缺陷,切勿将易受攻击的代码暴露在公共互联网!
登录失败说明
消息: LOGIN FAILED。
原因?
安全版本使用 预处理语句 来防止 SQL 注入。输入被视为数据,而不是可执行代码。
第11步 – 测试第2部分:会话授权及其他
1. 未登录
- 尝试访问 /part2.html 和 /part3.html。
- 预期行为:应被重定向到 /part1.html(需要登录)。
2. 已登录(安全方式)
- 通过 安全 登录表单正确登录。
- 然后访问 /part2.html 和 /part3.html ——它们应正常加载。
为什么?
即使漏洞登录让你进入,应用仍使用会话(例如 cookie)来跟踪身份验证。没有有效会话,受保护的页面无法访问。
XSS (跨站脚本) 演示
易受攻击的表单
-
在消息表单(可能在 /part2)中提交以下负载:
alert('XSS') -
刷新页面。
结果: 弹出一个警告框。
原因: 应用将原始脚本存入数据库并直接渲染,未进行转义,浏览器因此将其当作 JavaScript 执行。
安全表单
- 提交相同的负载 (
alert('XSS'))。 - 刷新页面。
结果: 没有弹窗;脚本以纯文本形式显示。
原因: 安全版本对输出进行转义(例如在 Flask 中使用 Jinja 的自动转义),将 < 转换为 <,使脚本失效。
消息列表
指南展示示例消息。您自己的消息可能不同,但行为(执行 vs. 转义)应保持相同。
报告摘要表
将以下 Markdown 表格复制到你的作业报告中:
| Version | Vulnerability | Result |
|---|---|---|
| Vulnerable | Stored XSS | JS executed |
| Secure | Escaped output | Safe display |
你现在已经演示了 SQL injection(用于登录以及可能的数据访问)和 XSS,以及它们的缓解措施。
Source:
SQL 注入演示(图书查询)
易受攻击的查询
-
在不安全的表单中(查找 “price more than”),输入:
0 OR 1=1 -- -
提交表单。
结果: 列出所有图书。
原因:
注入利用了 SQL 引擎忽略价格条件的漏洞,返回每一行(类似于登录绕过)。
安全的查询
- 使用相同的输入 (
0 OR 1=1 --)。 - 预期行为:不返回任何图书,或查询安全地失败。
原因:
参数化(预处理)语句阻止注入修改查询逻辑。
最后提示
- 故障排除: 如果出现错误,请检查终端中的错误信息。使用
docker-compose down重启 Docker,然后重新运行设置脚本。 - 学习要点: 本练习说明了 输入验证、预处理语句 和 输出转义 在 Web 应用程序中的重要性。
- 报告指南: 捕获成功和失败尝试的截图,按上述方式解释每一步,并包含汇总表。
- 清理: 完成后,在项目文件夹中使用
docker-compose down停止 Docker 容器。
如果任何步骤不清楚,请随时就具体部分提出澄清。加油——计算机科学就是不断实验! 🚀