我见过不少新人觉得“搞安全”很酷,上来就想对某个真实网站扫一下,我每次都先把人按住:没有授权的扫描和攻击都是违法行为,想练手,必须找明确允许你“搞破坏”的环境。那怎么练?圈子里几乎默认的答案,是去开一个OWASP Juice Shop——“果汁店”。这是一个开源Web应用,表面是一家卖果汁的网店,骨子里全是漏洞;你可以在自己电脑上把它跑起来,然后放心大胆地对它做SQL注入、XSS、越权访问、信息泄露之类的攻击。合法,安全,还能随时看到漏洞反馈。不管你是开发、测试、运维,还是刚想入门安全的新人,只要你愿意一次性弄懂“攻击是怎么发生的”,这个果汁店就是最适合的第一站。
1. 为什么靶场那么多,我推荐先玩“果汁店”
1.1 它不是漏洞列表,而是一整套模拟真实业务的场景
我看过很多教程,喜欢把漏洞拆成一个一个的“点”:这里有个XSS,那里有个注入。可是真实漏洞触发从来不是点对点,而是顺着业务链路一路走下去。Juice Shop最让我喜欢的地方,就是它老老实实搭了一个电商系统:商品列表、商品搜索、登录注册、购物车、下单、支付流程、用户评价、后台管理,你用起来会觉得它是一个正经网站,可每一个环节都被埋了雷。
为什么这样设计?因为安全问题的本质是“业务逻辑被滥用”。搜索框如果直接拼接SQL,你不光要理解什么叫SQL注入,还得知道为什么订单查询、搜索过滤这类位置最容易被人盯上。在真实业务里,前端页面、后端接口、数据库、第三方服务全都连在一起,靶场只有足够“像真的”,练出来的能力才有迁移价值。所以Juice Shop不是给你一堆漏洞截图,而是让你在一个“真网站”里当防守方和攻击方。
1.2 上百道挑战,直接对标OWASP Top Ten
Juice Shop累积下来的挑战数量超过一百个,从难度极低的“开胃菜”到需要把好几个漏洞串起来的“硬骨头”都有。它内置的评分板(Score Board)会列出所有挑战,每道题用星星标注难度,你做完一道就实时点亮一道,进度一目了然。
这里覆盖的范围,几乎把主流Web安全风险都捋了一遍:注入类漏洞、失效的身份认证、敏感信息泄露、失效的访问控制、跨站脚本(XSS)、安全配置错误、使用含有已知漏洞的组件等等。相比单纯看CTF题解,这种“有引导、有反馈、有评分”的机制更适合系统学习。你不需要自己规划“接下来学什么”,评分板就是一整张学习地图。
1.3 相比老牌靶场,它赢在“体验感”和“现代感”
我知道一定有人会问:不是还有老牌的DVWA、WebGoat、Pikachu这些靶场吗?为什么先推荐Juice Shop?我的看法是,它们各有取舍,老牌靶场曾在当年扛起了Web安全入门教育的大半江山,但放到现在,很多交互方式和漏洞场景确实显得“年代感”重了一些。我自己选练习环境时,会先看三个指标:部署是否够快、界面是否够真实、有没有好的题解反馈机制。
| 对比项 | 老牌入门靶场 | Juice Shop | 自己从0搭环境 |
|---|---|---|---|
| 部署速度 | 往往要配PHP、MySQL等依赖 | Docker一条命令 | 至少折腾好几天 |
| 界面真实性 | 偏演示、偏教学页 | 完整电商业务 | 取决于你花多少精力 |
| 挑战反馈 | 一般靠文档判断对错 | 内置评分板实时反馈 | 基本没有 |
| 技术栈 | 偏老式PHP场景 | Node.js + Angular + REST API | 自定义 |
| 适合人群 | 想快速理解单一漏洞原理 | 想练现代Web攻击全流程 | 想深入做漏洞研究 |
Juice Shop的定位比较讨巧:它不追求极致的漏洞利用深度,而是把真实电商里最常出现的漏洞类型都做成了可交互、可验证的任务。尤其是它自带REST API,这类接口在现代Web应用里到处都是,练过之后再去测真实系统,你会觉得很多套路都是相通的。
2. 五分钟把“果汁店”端上桌
2.1 最快路径:Docker一条命令
如果你机器上已经装好了Docker,那Juice Shop的启动速度快到惊人。打开终端,执行:
docker run -d -p 3000:3000 bkimminich/juice-shop然后等镜像拉取完毕,浏览器直接访问 http://localhost:3000 就能看到果汁店开张。这里解释一下参数:-d表示后台运行容器,关掉终端也不会停;-p 3000:3000表示把容器里的3000端口映射到本机3000端口,这样你访问本机3000就是访问容器里的服务。
我第一次拉这个镜像的时候也吓了一跳,镜像体积比想象中大不少,因为里面打包了完整的Node.js应用和前端资源。不过拉下来之后,后面每次启动都很快,整个体验基本就是“复制粘贴命令,然后开玩”。
2.2 没有Docker时的备选路线:npm也能跑
如果你机器上没有Docker,或者公司电脑限制比较多,也不至于就玩不了。Juice Shop本身是Node.js项目,官方发布了npm包,可以全局安装后直接启动:
npm install -g juice-shop juice-shop跑起来之后同样访问 http://localhost:3000。这条路线对Node版本有点挑剔,太老的Node版本可能会在启动阶段直接报错,或者某些新版本挑战行为不稳定。我见过有人用很旧的发行版系统自带的Node启动果汁店,结果页面白屏半天,最后升级了Node版本才恢复正常。
如果你想改源码、加题目、观察内部实现,那还是建议走源码路线:
git clone <juice-shop官方仓库地址> cd juice-shop npm install npm start源码跑的好处是你能随时打开IDE看漏洞背后的代码长什么样。很多人在评分板上把题做完了,但对漏洞为什么存在还是一知半解;换成源码模式后,直接搜对应的路由和处理函数,那种“原来如此”的感觉会强烈得多。
2.3 启动之后先逛这三个地方
环境起来后别急着拿工具乱扫,先像个正常用户一样把网站点一遍。我建议你优先逛三个位置,它们基本覆盖了后续所有挑战的入口。
第一是商城主页,也就是根路径。浏览商品、注册一个普通账号、加购物车、下个单,体会一下正常用户操作。第二是评分板,路径是/#/score-board,这里能看到全部挑战清单,每一道题都相当于一个“待办事项”。很多新手不知道这个入口,对着首页找半天“我要打哪个”,其实题都帮你列好了。第三是开发者工具里的网络面板。打开浏览器F12,切到Network,随便点几下页面,你会发现前端在调用类似/api/开头的REST接口。Juice Shop的大量越权、信息泄露类题目,都在这些接口后面等着你。
2.4 启动失败,先按这三步排查
有段时间我在不同环境里反复安装Juice Shop,遇到过几次启动问题,基本就三类。第一类,端口被占用。你本机已经有服务占了3000端口,容器启动失败。解决办法很简单,换个映射端口,比如-p 3001:3000,然后访问3001。第二类,镜像拉取太慢或者失败。这个要看网络环境和镜像源配置,确认基础网络没问题,给Docker配好镜像加速器,基本就能解决。第三类,容器起来了但页面打不开。这时候不要瞎重启,先看日志:
docker ps docker logs <容器ID>日志会告诉你到底是端口绑定失败,还是应用内部启动报错。掌握这个排查次序,能省下很多无头绪的折腾时间。
3. 从哪几道关卡下手:难度梯度与新手最常踩的坑
3.1 先看懂评分板:难度分级不是摆设
Juice Shop的评分板把挑战分成了好几个难度档位,虽然不同版本对难度名称的翻译和UI样式会变,但核心逻辑是一样的:低难度题目教你“漏洞长什么样”,高难度题目则要你把多个点串起来,或者用出人意料的方式触发。
我的建议是,新手不要一上来就盯着高难度题目猛看攻略,那样除了得到一串操作步骤,你并不能真正理解漏洞成因。老老实实从低难度做起,一道一道点亮,等低难度题目做到无压力,再去挑战需要组合利用的关卡。评分板上的星星数量,就是你对Web安全掌握程度的一个直观刻度。
3.2 三道“开胃菜”,用来体验什么叫合法“搞破坏”
第一道开胃菜,反射型XSS。在站点搜索框里输入一段简单的脚本标签,比如:
<script>alert('Juice')</script>如果你用的是老版本,可能直接弹窗;新版浏览器通常会拦截这种弹窗,所以更可靠的观察方式是看响应内容里你的输入是不是被原样返回,并且被当作脚本上下文执行。这一点很关键:测试XSS时不要只盯着弹窗,要观察“用户输入是否被拼进了HTML且没有转义”。
第二道开胃菜,SQL注入探测。Juice Shop里有多个可以拼SQL查询的位置,最典型的是搜索接口。你可以先输入一个单引号',观察页面或接口是否报错、返回异常;再尝试类似' OR 1=1--的payload,看数据返回是不是发生了变化。这个过程本质上就是在验证“后端到底有没有把用户输入直接拼进SQL语句”。记住,这只在你自己的靶场实例里有效,放到未经授权的系统上就是违法。
第三道开胃菜,越权访问。注册一个普通账号登录,然后在浏览器开发者工具里观察页面发起的API请求。你会看到请求里带着商品ID、订单ID这类参数,试着改一下参数值,比如查别人的订单、看别人的收货地址,如果后端没有校验数据归属权,你就能读到不属于你的数据。这个漏洞类型在真实系统里太常见了,Juice Shop把它做成了新手也能复现的任务。
3.3 为什么你猛点半天,漏洞就是不触发
我带过不少新人,最常见的挫败感是“我明明按教程操作了,为什么没有反应”。问题通常不在题目,而在观察方式。
有些人只盯着页面本身,完全不看浏览器控制台和网络面板。可现代Web应用大量使用异步请求,你在这个页面上的操作,可能早就通过一个API请求把数据发出去了,返回结果在Network面板里清清楚楚。还有些人喜欢一把梭,拿扫描器对着靶场一顿狂扫,结果扫出一堆“疑似漏洞”,却说不清每个漏洞背后是什么逻辑。靶场训练的目的不是让你扫出结果,而是让你看懂结果。我自己的习惯是:每打一道题,都会把请求和响应完整看一遍,甚至保存下来,标注触发点和修复建议,这个习惯带到工作中非常有用。
4. 合法与违法的分界线,以及如何把靶场练出的能力接到工作流里
4.1 “授权”是唯一的合法前提,没有例外
聊到“合法搞破坏”,必须把这条界线讲透。Juice Shop之所以可以随便打,是因为这个实例是你自己搭的、明确用于安全训练的;你在里面做任何攻击,本质上是在测试一套你拥有或经授权的系统。
但同样的操作,放到别人家的网站、和你无关的服务器上,性质就完全不同。不管你是出于好奇、学习还是“验证一下”,未经授权的扫描、探测和攻击都是明确的越界行为。安全从业者的工作前提是授权:测试范围、起止时间、允许的测试手法,都要提前界定清楚。靶场里的操作练的是技术,授权意识练的是职业底线。很多人技术还没练明白,先把自己的路走窄了,真的没必要。
4.2 靶场高分不等于实战能力
Juice Shop里能拿高分,确实说明你对常见Web漏洞有了基本感知,但要说“能打真站了”,中间还差着很大一截。
在靶场里,漏洞是故意埋好的,你甚至知道大概位置;真实系统里,你面对的是未知代码、未知框架、未知运维方式,可能还有WAF拦截、安全组限制、严格的输入校验,甚至连资产本身都可能是个蜜罐。靶场题目有明确“做出来”的标准,真实漏洞利用则充满了不确定性:业务逻辑复杂、依赖链路长、需要跨模块分析。所以我一直建议,靶场练手只是起点,真正要成长,还是得在授权范围的项目里,跟着有经验的人做完整的测试流程,学习怎么定义范围、怎么评估风险、怎么写报告。这些能力,不是评分板能教你的。
4.3 把Juice Shop安排到开发与防御流程里
Juice Shop的价值也不只局限于个人练习。我在团队内部做过几次安全分享,都是拿它当“活体实验对象”来用的。
新员工入职安全培训时,与其讲两个小时PPT,不如让每个人自己把Juice Shop跑起来,亲手触发三到五个漏洞,那种主观能动性完全不一样。测安全扫描器的时候,Juice Shop也经常被当成基准测试环境:用它来验证扫描器能不能发现常见漏洞、误报率高不高、覆盖是否全面,比拿真实业务系统当靶子安全得多。偶尔我还让研发同事用Juice Shop复现某个线上漏洞的同类场景,当他们亲手找到“原来这么容易被绕过去”的证据之后,写安全代码的意愿会明显提高。这个过程不需要什么复杂平台,一台笔记本、一个Docker环境就够。
5. 踩坑记录:从端口冲突到答案失效
5.1 三个我实际遇到过的低级问题
别看Juice Shop启动简单,实际用久了还是会碰到一些莫名其妙的坑,我列三个最常见的,大家遇到时可以少绕弯。
| 问题现象 | 根因 | 处理方法 |
|---|---|---|
| 容器启动后页面一直连不上 | 端口被本机其他服务占用 | 换个宿主机端口,比如-p 3001:3000 |
| 容器删掉重开,挑战进度全没了 | 容器层数据非持久化 | 挂载数据卷,或把当前版本镜像固定住 |
| 跟着老教程操作却打不出题 | 版本更新后漏洞位置或payload变了 | 先看评分板题目标题,再查当前版本文档 |
第二个坑特别容易被忽略。Docker的一个特点就是容器没了数据就没了,Juice Shop的挑战进度存在容器内部,一旦你执行docker rm,所有劳动成果直接清零。我自己就干过这种傻事,辛苦打了几十个挑战,清理容器时没注意,再启动直接回到初始状态。从那以后我养成了习惯:练习阶段就用固定tag的镜像,不随意升级,重要进度阶段做笔记记录,而不只是在评分板里亮个灯。
5.2 一次搜索接口注入的完整排查链路
我拿一个非常典型的SQL注入题目,完整带一遍排查链路,让大家感受一下正确的分析方式。
我在搜索框里先输入一个正常关键词,比如“apple”,观察请求是 GET 请求,路径类似/rest/products/search?q=apple,返回的是正常JSON数据。紧接着我输入一个单引号',这次响应变成了500错误,返回内容里出现SQL相关的语法报错信息。到这里基本可以断定,后端把我输入的内容直接拼进了SQL语句。
然后我尝试闭合条件,输入' OR '1'='1,看看搜索结果会不会返回所有商品。如果返回了全部商品,说明注入条件成立。再往后,我就可以利用SQLite的语法去查表结构、读其他表数据。整个过程每一个步骤都有“请求-响应”的对应关系,而不是拿扫描器一顿乱试。这种分析方法放到真实系统的授权测试中同样适用,核心逻辑就是:先看正常行为,再制造异常,再验证判断,最后构造利用。
5.3 我给新手的练习路线建议
如果让我给完全没接触过的人排一条学习顺序,大约是:先把Juice Shop跑起来,从评分板最简单的挑战开始,目标是点亮20到30道低难度题;同时每做完一道题,回看浏览器Network面板里的请求和响应,强迫自己解释“这个漏洞是怎么被触发的、后端犯了什么错”;然后去读Juice Shop开源代码里对应的后端处理逻辑,把“外部输入”和“代码缺陷”对上号;最后再尝试自己搭一个极简的小网站,把其中一类漏洞手工复刻出来,比如做一个把搜索关键词直接拼进SQL的小页面。
这条路线走完,你对Web安全的认识会比单纯刷几百道CTF题扎实得多。原因很简单:刷题练的是熟练度,看源码才能练因果推理,自己写漏洞站点才能真正理解“为什么这里会被攻击”。这也是我为什么一直坚持让身边的人先把Juice Shop当成“实验台”,而不是当成“刷分题库”。
我带过的几个人到最后基本都形成了同一种习惯:看到一个参数不再只问“这能不能打”,而是先想“这个参数后端是怎么处理的,校验放在哪里,绕过之后会造成什么影响”。这种思维习惯,才是这个果汁店真正值得你花时间的地方。攻击手段会过时,漏洞类型会翻新,但“输入怎么进去、数据怎么流动、信任边界设在哪”这套分析框架,放进任何一个时代都不过时。