对 DVWA 靶机完成全端口扫描、Nmap NSE 基础检测、SQL 注入与 XSS 检测点观察。
外观
外观
约 5139 字大约 17 分钟
网络安全技术Web安全漏洞检测DVWA
2026-03-12
教学导读
本项目对应教材第 2 章 2.3~2.4 节与实训 1。第 2 次课已经完成主机发现与服务识别,本次课继续在 DVWA 本机靶场 中进行 Web 风险初检,重点是“检测证据、风险解释、修复建议”,不是追求攻击效果。
授权范围
本节所有 Nmap NSE、Nikto、WhatWeb、SQL 注入检测、XSS 检测都只能用于 Kali 中部署的 DVWA。不得把命令替换为公网域名、校园网系统、同学电脑或未授权 IP。
对 DVWA 靶机完成全端口扫描、Nmap NSE 基础检测、SQL 注入与 XSS 检测点观察。
当前 hackingtool 无单独 Vulnerability Analysis 分类,本课按漏洞分析工具链映射到 Web Attack、SQL Injection、XSS Attack。
提交漏洞检测报告,包含漏洞类型、证据、风险等级、影响说明和修复建议。
理解认证风险、Web 输入风险、文件上传风险、XSS、SQL 注入与善后阶段的异常痕迹。
使用 nmap、Nmap NSE、whatweb、nikto,并参考 hackingtool 的 Web Attack、SQL Injection、XSS Attack 分类。
完成 DVWA 初步漏洞检测报告,写明证据、风险等级、影响说明、修复建议和不确定项。
本节安全提醒
本节只允许对 DVWA 做初步漏洞检测,不复制命令到公网域名、校园网系统、同学电脑或未授权 IP。检测结果必须写清证据来源;工具提示只能作为线索,不能直接当作漏洞结论。
实施阶段关注“入口如何被利用”。本课从三个入口理解风险:认证入口、Web 应用入口、邮件入口。
认证风险的核心不是“密码一定会被猜中”,而是系统是否给攻击者持续试错的空间。
| 风险 | 说明 | 防护重点 |
|---|---|---|
| 暴力破解 | 不断尝试用户名与密码组合 | 登录失败限制、验证码、告警 |
| 密码喷洒 | 用少量常见密码尝试大量账号 | 弱口令治理、统一身份审计 |
| 凭证填充 | 使用其他平台泄露的账号密码登录 | 多因素认证、异常登录检测 |
当前模式防御力:
可以直接无数次尝试密码,黑客写个脚本几分钟就能把常见密码试个遍,防线形同虚设。
模拟攻击:
Web 风险来自数据在“输入、处理、输出”之间失控。看到页面入口时,要反推后端是否做了正确约束。
用户输入恶意代码构造(如 ' OR '1'='1 或 <script>alert(1)</script>)。
点击上方图标可独立查看每个阶段的安全风险
| Web 入口 | 典型风险 | 初学者观察点 | 修复方向 |
|---|---|---|---|
| 登录框 | 弱口令、爆破、认证绕过 | 错误提示、失败次数限制、验证码 | 登录保护、MFA、日志审计 |
| 查询参数 | SQL 注入、命令注入 | 特殊字符是否引发错误回显 | 参数化查询、输入校验 |
| 上传按钮 | 任意文件上传 | 后缀、MIME、存储路径、执行权限 | 白名单、重命名、禁止执行 |
| 路径参数 | 目录遍历 | 是否能访问非预期路径 | 路径规范化、权限隔离 |
| 评论/搜索 | XSS | 输入是否被原样输出到页面 | 输出编码、CSP、输入限制 |
邮件攻击常见形式包括钓鱼邮件、恶意附件、伪装通知、伪造发件人。本课只做识别思路:
课堂边界
本课程不制作钓鱼邮件、不投递附件、不诱导任何真实用户点击。学习目标是识别风险和提出防护建议。
善后阶段不是“攻击结束”,而是风险扩大和潜伏的开始。防守者要能识别异常痕迹。
| 技术 | 攻击者目的 | 防守观察点 |
|---|---|---|
| 日志清理 | 降低被追踪概率 | 日志断档、时间异常、关键事件缺失 |
| 文件隐藏 | 避免被管理员发现 | 隐藏目录、异常文件名、权限异常 |
| 进程隐藏 | 让恶意程序持续运行 | 进程名伪装、异常外联、资源占用 |
| Webshell | 通过 Web 页面远程执行命令 | 上传目录异常脚本、可疑请求参数 |
| 反弹 Shell | 主机主动连回控制端 | 非业务外联、异常端口连接 |
| 定时任务 | 维持长期执行能力 | crontab、计划任务、启动项异常 |
点击左侧项目进行诊断
防护视角
学习善后技术不是为了演示“如何留下来”,而是为了知道应急响应时应该查哪里:账号、进程、任务、文件、日志、网络连接。
course-scope
start_dvwa
DVWA_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dvwa)
echo "$DVWA_IP"真实输出示例(2026-04-28,本机 Kali):
[课程范围] DVWA 是本镜像默认授权靶场;请勿扫描或攻击非授权目标。
DVWA is already running: http://localhost:8080
172.17.0.2结果解释:
DVWA is already running 表示靶场容器已启动,不需要重复创建。172.17.0.2 是本次 Docker 网络中 DVWA 容器的 IP,不同电脑或重新创建容器后可能变化。$DVWA_IP 理解为这个地址。如果课堂只使用本机绑定端口,则目标为:
http://127.0.0.1:8080对容器 IP 扫描:
nmap -p- --min-rate 500 "$DVWA_IP"真实输出示例(2026-04-28,本机 Kali,目标 172.17.0.2):
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-28 14:05 +0800
Nmap scan report for 172.17.0.2
Host is up (0.0000030s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
MAC Address: EE:22:1A:77:DE:08 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 1.02 seconds结果解释:
-p- 表示扫描全部 TCP 端口,范围是 1-65535。--min-rate 500 表示要求 Nmap 尽量保持较高发包速率,适合本机靶场快速扫描。80/tcp open http 表示 DVWA 容器只有 80 端口开放。65534 closed tcp ports 表示除 80 端口外,其余 TCP 端口均为关闭状态;这能帮助报告说明攻击面较集中。对 Web 服务做版本识别:
nmap -sV -p 80 "$DVWA_IP"真实输出示例(2026-04-28,本机 Kali):
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-28 14:05 +0800
Nmap scan report for 172.17.0.2
Host is up (0.000068s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.25 ((Debian))
MAC Address: EE:22:1A:77:DE:08 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.80 seconds结果解释:
-sV 用于识别服务版本,本次识别到 Apache httpd 2.4.25 ((Debian))。如果使用本机绑定端口:
nmap -Pn -sT -sV -p 8080 127.0.0.1真实输出示例(2026-04-28,本机 Kali):
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-28 14:06 +0800
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0011s latency).
PORT STATE SERVICE VERSION
8080/tcp open http Apache httpd 2.4.25 ((Debian))
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.17 seconds结果解释:
-Pn 表示跳过主机发现,直接扫描端口。WSL 环境下扫描 127.0.0.1 时,不加它可能误判主机不可达。8080/tcp open 表示 Windows 浏览器访问的 http://127.0.0.1:8080 映射端口开放。Apache httpd 2.4.25 ((Debian)) 与容器 IP 扫描结果一致,说明这个端口背后就是 DVWA 容器里的 Web 服务。NSE(Nmap Scripting Engine,Nmap 脚本引擎)用于把常见检测逻辑封装成脚本。前三次课只做轻量检测:
nmap --script http-title,http-headers,http-enum -p 80 "$DVWA_IP"真实输出示例(2026-04-28,本机 Kali):
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-28 14:06 +0800
Nmap scan report for 172.17.0.2
Host is up (0.000058s latency).
PORT STATE SERVICE
80/tcp open http
| http-headers:
| Date: Tue, 28 Apr 2026 06:06:12 GMT
| Server: Apache/2.4.25 (Debian)
| Set-Cookie: PHPSESSID=euf64hkojtsh6kcg9ooad1om20; path=/
| Set-Cookie: security=low
| Content-Type: text/html;charset=utf-8
|_ (Request type: HEAD)
| http-title: Login :: Damn Vulnerable Web Application (DVWA) v1.10 *Develop...
|_Requested resource was login.php
| http-enum:
| /login.php: Possible admin folder
| /robots.txt: Robots file
| /.gitignore: Revision control ignore file
| /config/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
| /docs/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
|_ /external/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
MAC Address: EE:22:1A:77:DE:08 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.92 seconds结果解释:
http-title 识别到页面标题含有 DVWA,说明目标确实是 DVWA 登录页。http-headers 显示服务端响应头,能看到 Server: Apache/2.4.25 (Debian)、PHPSESSID 和 security=low 等 Cookie。http-enum 发现 /login.php、/robots.txt、/config/、/docs/ 等路径。这些是进一步观察线索,不等于已经完成漏洞利用。选做漏洞脚本检测,只能对 DVWA 执行:
nmap --script vuln -p 80 "$DVWA_IP"真实输出示例(2026-04-28,本机 Kali):
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-28 14:06 +0800
Nmap scan report for 172.17.0.2
Host is up (0.000060s latency).
PORT STATE SERVICE
80/tcp open http
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
| http-cookie-flags:
| /:
| PHPSESSID:
| httponly flag not set
| /login.php:
| PHPSESSID:
|_ httponly flag not set
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
| http-enum:
| /login.php: Possible admin folder
| /robots.txt: Robots file
| /.gitignore: Revision control ignore file
| /config/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
| /docs/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
|_ /external/: Potentially interesting directory w/ listing on 'apache/2.4.25 (debian)'
MAC Address: EE:22:1A:77:DE:08 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 31.33 seconds结果解释:
Couldn't find any stored XSS vulnerabilities 只表示该脚本没有发现存储型 XSS,不代表 DVWA 不存在 XSS 教学页面。httponly flag not set 表示 PHPSESSID Cookie 未设置 HttpOnly,这是会话 Cookie 加固项缺失。http-enum 再次列出了可观察路径,说明脚本检测也会产生信息收集结果。--script vuln 结果必须人工复核;报告中应写“脚本提示 Cookie 缺少 HttpOnly”,而不是直接扩展为“系统已被攻破”。结果解释
NSE 输出可能包含误报或“疑似”结果。报告必须写清楚证据来源,不能把脚本提示直接当成最终漏洞结论。
whatweb --no-errors --color=never http://127.0.0.1:8080真实输出示例(2026-04-28,本机 Kali):
http://127.0.0.1:8080 [302 Found] Apache[2.4.25], Cookies[PHPSESSID,security], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[127.0.0.1], RedirectLocation[login.php]
http://127.0.0.1:8080/login.php [200 OK] Apache[2.4.25], Country[RESERVED][ZZ], DVWA, HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[127.0.0.1], PHP, PasswordField[password], Title[Login :: Damn Vulnerable Web Application (DVWA) v1.10 *Development*]结果解释:
[302 Found] 表示访问首页会重定向到 login.php。[200 OK] 表示登录页正常响应。DVWA、PHP、PasswordField[password] 说明 WhatWeb 识别到这是一个带登录表单的 DVWA 应用。nikto -h http://127.0.0.1:8080 -nointeractive -Tuning x真实输出示例(2026-04-28,本机 Kali):
- Nikto v2.6.0
---------------------------------------------------------------------------
+ Your Nikto installation is out of date. Please run 'git pull' to update to the latest version of Nikto.
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8080
+ Platform: Linux/Unix
+ Start Time: 2026-04-28 14:06:50 (GMT8)
---------------------------------------------------------------------------
+ Server: Apache/2.4.25 (Debian)
+ [95] /: Cookie PHPSESSID created without the httponly flag.
+ [95] /: Cookie security created without the httponly flag.
+ No CGI Directories found (use '-C all' to force check all possible dirs). CGI tests skipped.
+ [600050] Apache/2.4.25 appears to be outdated (current is at least 2.4.66).
+ [013587] /: Suggested security header missing: x-content-type-options.
+ [013587] /: Suggested security header missing: referrer-policy.
+ [013587] /: Suggested security header missing: strict-transport-security.
+ [013587] /: Suggested security header missing: permissions-policy.
+ [013587] /: Suggested security header missing: content-security-policy.
+ 625 requests: 0 errors and 8 items reported on the remote host
+ End Time: 2026-04-28 14:06:51 (GMT8) (1 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested结果解释:
Server: Apache/2.4.25 (Debian) 与 Nmap、WhatWeb 的识别一致,可以作为交叉证据。Cookie ... without the httponly flag 与 Nmap NSE 的 Cookie 检测一致,说明会话 Cookie 存在加固项缺失。Suggested security header missing 表示响应缺少常见安全响应头,是 Web 加固建议,不等于已经被利用。Apache/2.4.25 appears to be outdated 是版本风险线索,需要结合环境、补丁和实际漏洞编号进一步确认。hackingtool 在本节继续作为“工具分类导航”使用。它把 Web Attack、SQL Injection、XSS Attack 等工具按攻击面分类,帮助理解不同漏洞检测任务对应的工具类型;本节不运行 hackingtool 的批量安装脚本,也不把其中工具用于 DVWA 之外的目标。
本节可参考的 hackingtool 分类:
| hackingtool 当前分类 | 本课对应能力 | 使用方式 |
|---|---|---|
| Web Attack | Web 指纹、目录、基础弱点识别 | 只参考 Nikto、WhatWeb、Gobuster 等安全检测类工具 |
| SQL Injection | SQL 注入专项检测 | 只在 DVWA SQL Injection 页面做检测点观察 |
| XSS Attack | XSS 专项检测 | 只在 DVWA XSS 页面做检测点观察 |
下面的测试字符串只允许输入到本机 DVWA 页面。它们用于观察“输入是否影响后端查询”或“页面是否把输入当作 HTML 解释”,不是用于真实网站测试。
| 检测点 | 页面位置 | 测试字符串 | 预期观察 | 结论边界 |
|---|---|---|---|---|
| SQL 注入基线 | SQL Injection 页面的 User ID 输入框 | 1 | 返回 admin 用户信息 | 说明正常查询链路可用 |
| SQL 注入错误回显 | SQL Injection 页面的 User ID 输入框 | ' | 可能出现 SQL 语法错误 | 可作为注入检测点线索,不能脱离 DVWA 外推 |
| SQL 注入布尔对照 | SQL Injection 页面的 User ID 输入框 | 1' OR '1'='1 | 可能返回多条用户记录 | 说明输入改变了查询条件 |
| XSS 反射基线 | XSS (Reflected) 页面的 What is your name? 输入框 | codex-test | 页面显示 Hello codex-test | 说明存在反射输出点 |
| XSS HTML 解释观察 | XSS (Reflected) 页面的 What is your name? 输入框 | <b>codex-test</b> | codex-test 可能以粗体显示 | 说明输出可能未做 HTML 编码 |
测试字符串边界
只在 DVWA 中使用上表字符串。报告中可以写“在 DVWA 低安全等级下观察到检测点现象”,不要把测试字符串复制到真实业务系统,也不要把工具提示直接写成对真实系统的漏洞结论。
登录 DVWA
访问 http://127.0.0.1:8080,使用课堂给定账号登录并完成初始化。
确认安全等级
进入 DVWA Security,按照本节要求设置实验等级。截图保存当前等级。
观察 SQL Injection 页面
进入 SQL Injection 功能页,依次提交 1、'、1' OR '1'='1,观察是否出现正常查询、SQL 错误或多记录回显。
观察 XSS Reflected 页面
进入 XSS (Reflected) 功能页,依次提交 codex-test、<b>codex-test</b>,观察页面是按纯文本显示,还是把标签解释为 HTML。
记录证据
每个检测点记录:页面路径、输入、输出、截图、风险解释、修复建议。
如果需要用命令行复核页面现象,可以先登录 DVWA 并保存 Cookie:
COOKIE=/tmp/dvwa-course-cookie.txt
curl -s -c "$COOKIE" http://127.0.0.1:8080/login.php -o /tmp/dvwa-login.html
TOKEN=$(grep -oP "user_token[^>]+value=['\"]\\K[^'\"]+" /tmp/dvwa-login.html | head -1)
curl -s -b "$COOKIE" -c "$COOKIE" -L \
-d "username=admin&password=password&Login=Login&user_token=$TOKEN" \
http://127.0.0.1:8080/login.php \
-o /tmp/dvwa-after-login.html \
-w "LOGIN_FINAL_HTTP=%{http_code} FINAL_URL=%{url_effective}\n"真实输出示例:
LOGIN_FINAL_HTTP=200 FINAL_URL=http://127.0.0.1:8080/index.php结果解释:200 和 index.php 表示登录后已经进入 DVWA 首页,可以继续访问漏洞练习页面。
SQL Injection 正常参数观察:
curl -s -b "$COOKIE" \
"http://127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submit=Submit" \
| grep -E "First name|Surname|ID:" \
| sed -E "s/<[^>]+>//g"真实输出示例:
User ID:
ID: 1First name: adminSurname: admin结果解释:正常数字参数能查询出 admin 用户信息,说明该页面会把输入参数带入后端查询流程。
SQL Injection 单引号测试观察:
curl -s -b "$COOKIE" \
"http://127.0.0.1:8080/vulnerabilities/sqli/?id=%27&Submit=Submit" \
| grep -Ei "syntax|mysql|error|warning|You have an error" \
| sed -E "s/<[^>]+>//g"真实输出示例:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''''' at line 1结果解释:页面把数据库语法错误回显出来,说明输入参数影响了 SQL 查询语句。报告中可写为“存在 SQL 注入检测点和错误回显证据”,后续修复方向是参数化查询、错误信息收敛、数据库最小权限。
SQL Injection 布尔对照测试观察:
curl -s -b "$COOKIE" -G \
--data-urlencode "id=1' OR '1'='1" \
--data-urlencode "Submit=Submit" \
http://127.0.0.1:8080/vulnerabilities/sqli/ \
| grep "First name"真实输出示例:
<pre>ID: 1' OR '1'='1<br />First name: admin<br />Surname: admin</pre><pre>ID: 1' OR '1'='1<br />First name: Gordon<br />Surname: Brown</pre><pre>ID: 1' OR '1'='1<br />First name: Hack<br />Surname: Me</pre><pre>ID: 1' OR '1'='1<br />First name: Pablo<br />Surname: Picasso</pre><pre>ID: 1' OR '1'='1<br />First name: Bob<br />Surname: Smith</pre>结果解释:正常输入 1 只返回一条 admin 记录,而 1' OR '1'='1 返回多条记录,说明输入内容改变了后端查询条件。报告中可以把它作为 SQL 注入风险证据,同时写明这是 DVWA 低安全等级靶场现象。
XSS Reflected 普通标记回显观察:
curl -s -b "$COOKIE" \
"http://127.0.0.1:8080/vulnerabilities/xss_r/?name=codex-test" \
| grep -E "Hello|codex-test" \
| sed -E "s/<[^>]+>//g"真实输出示例:
Hello codex-test结果解释:codex-test 被页面原样带回响应,说明这里存在反射输出点。单纯普通字符串回显还不能直接等同于 XSS 漏洞结论,需要继续结合输出编码、上下文和浏览器行为确认。
XSS Reflected HTML 解释观察:
curl -s -b "$COOKIE" \
"http://127.0.0.1:8080/vulnerabilities/xss_r/?name=%3Cb%3Ecodex-test%3C%2Fb%3E" \
| grep "codex-test"真实输出示例:
<pre>Hello <b>codex-test</b></pre>结果解释:响应中保留了 <b>codex-test</b> 标签,浏览器渲染时会把 codex-test 解释为粗体,而不是普通文本。这说明页面输出缺少 HTML 编码,是判断 XSS 风险的重要线索。
DVWA 漏洞初检
PORT STATE SERVICE VERSION 80/tcp open http Apache httpd Service Info: DVWA container
Web 服务开放本身不是漏洞,但它确认了后续检测入口;如果服务版本过旧或暴露到非授权网络,风险会被放大。
仅绑定本机地址,保持容器可重建;生产系统应隐藏管理入口、升级组件并加访问控制。
按照标准动作逐步执行,不要跳跃步骤
在给定网段内扫描存活主机,定位靶机的IP地址,不要把炮火对准无关机器。
nmap -sn 192.168.1.0/24| 字段 | 填写要求 |
|---|---|
| 实验目标 | DVWA 容器 IP 或 http://127.0.0.1:8080 |
| 授权说明 | 本机 Docker 靶场,课程授权范围 |
| 检测时间 | 写明日期和课次 |
| 工具命令 | Nmap、NSE、WhatWeb、Nikto 等实际命令 |
| 漏洞类型 | SQL 注入、XSS、文件上传风险等 |
| 证据截图 | 至少包含扫描结果和页面检测结果 |
| 风险等级 | 高 / 中 / 低,并说明理由 |
| 影响说明 | 对数据、账号、服务或审计的影响 |
| 修复建议 | 参数化查询、输出编码、上传白名单、最小权限等 |
| 不确定项 | 写明需要进一步验证的地方,不硬下结论 |
| 等级 | 判定参考 |
|---|---|
| 高 | 可能造成数据泄露、远程命令执行、账号接管、文件落地执行 |
| 中 | 可能泄露敏感信息、影响用户会话、扩大攻击面 |
| 低 | 信息暴露有限,暂未发现可直接利用路径 |
报告伦理
报告中不要粘贴真实可复用攻击载荷,不要写“可攻击某网站”这类越界结论。报告目标是帮助系统修复,而不是复现未授权攻击。
| 验收项 | 标准 |
|---|---|
| 全端口扫描 | 只对 DVWA 容器 IP 或本机绑定端口执行 |
| NSE 检测 | 能解释脚本输出与误报边界 |
| Web 初检 | 能完成 WhatWeb 或 Nikto 辅助观察 |
| 手动检测 | 能指出 SQL 注入、XSS 的检测点与现象 |
| 报告质量 | 有证据、有等级、有修复建议、有不确定项 |
/opt/hackingtool/README.md 中找出 Web Attack、SQL Injection、XSS Attack 各 1 个工具,说明它们为什么只能在授权靶场中学习。