ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OWASP Juice Shop实战指南:从部署到SQL注入与越权漏洞利用

OWASP Juice Shop实战指南:从部署到SQL注入与越权漏洞利用 很多人学Web安全最痛苦的一件事往往不是缺资料而是没有合法、可控的靶场可以动手。OWASP Juice Shop 就是为解决这个问题而生的它是OWASP基金会维护的一个开源Web应用表面看是一家卖果汁的在线商城实际上是个故意埋了几十个漏洞的练习场。这篇内容我按自己实际打靶的经历梳理了一份“部分通关”教程——从部署开始到信息收集、几条最典型漏洞的攻击路径再到卡关时怎么借力调试适合刚学完HTTP基础、想找地方练手或者准备考渗透测试类认证的朋友。先说明白本文不追求把所有题目讲完而是挑最值得练手的主线让你先建立起一套自己的打靶思路。1. Juice Shop到底是什么它和别的靶场有什么不同1.1 一个“故意做坏”的在线商城Juice Shop 的业务形态本身就是最大的特点。它不是一个摆在那里的DEMO页面而是一个完整的电商网站商品列表、搜索、购物车、注册、登录、结算、评价、用户中心该有的功能它全都有。OWASP做这个项目的初衷很直接——把安全知识放进一个足够真实的业务场景里让你在“正常使用网站”的过程中顺手踩到漏洞。这和传统的DVWA、WebGoat那种“按漏洞类型分好目录”的靶场体验是完全不同的。在DVWA里你知道哪个页面是SQL注入哪个页面是XSS更像是做实验而在Juice Shop里搜索框、登录框、上传头像、提交评价每一个普通功能背后都可能有坑。这样的设计反而更贴近真实渗透的节奏因为你根本不知道问题藏在哪里只能靠观察和推理去发现。这种“业务仿真型”靶场对学习者最大的好处是你练的不是单一漏洞利用而是从功能入口开始做漏洞发现的能力。真实系统不会告诉你“这是SQL注入点”只会给你一个搜索框。Juice Shop把这层“包装”保留了下来所以打完一套题之后再去看真实站点思路会顺很多。1.2 挑战体系与积分机制Juice Shop内置了上百个挑战Challenge难度分布从Easy到Hard都有。每个挑战对应一个具体的漏洞类型或攻击场景比如初始SQL注入、XSS、越权、文件上传、隐藏接口发现、逻辑漏洞等等。挑战完成后页面右上角会弹出通知积分会被记到Score Board得分板上。Score Board不仅是计分板也是整个靶场的任务地图里面会列出你已经解锁的挑战名称和对应的题目描述。挑战名称往往比较“谜语”比如“登录管理员的账号”“不小心落下的备份文件”“错误的思维”这类不会直接告诉你答案但是能给你一个大致的方向。这里有一个新手容易忽略的点并不是所有挑战一开始都能在Score Board里看到。有些挑战要先完成前置题目或者发现了特定页面之后才会解锁。所以打Juice Shop的过程其实是一个“探索—触发—解锁—再探索”的循环而不是照着题单一题一题刷。1.3 适合人群与前置要求如果你已经知道HTTP请求和响应是什么会打开浏览器开发者工具了解SQL和JavaScript最基础的概念那么直接上手Juice Shop是完全没有压力的。即使某些知识点还没学过也可以边打边补遇到不认识的漏洞类型再针对性查资料学习效率反而比纯看书高。我个人比较推荐的组合是Juice Shop作为动手主线OWASP Top 10作为理论手册遇到不懂的漏洞类型就去查对应的条目。这样理论不会太空实战也不会变成盲打。至于是否要提前会写代码其实不强求。Juice Shop的题目更侧重于“分析和利用”你只需要能读懂请求包、响应包会改参数就能解决大部分题目。当然如果会一点JavaScript或SQL理解起题解来会轻松不少。2. 把靶场跑起来Docker和源码两种启动方式2.1 用Docker跑是最省事的如果你只是想在Juice Shop里练题不想折腾环境我强烈推荐用Docker方式启动。整个流程只有两条命令docker pull bkimminich/juice-shop docker run --rm -p 3000:3000 bkimminich/juice-shop跑起来之后浏览器访问http://localhost:3000就能看到果汁商城首页。-p 3000:3000的意思是把容器内的3000端口映射到你本机的3000端口--rm表示容器停止后自动删除。这个参数对打靶场非常友好因为靶场里经常会把数据改乱用--rm可以保证每次启动都是干净的初始状态省去手动重置的麻烦。我用Docker跑这个靶场最大的体会是环境隔离做得干净不会污染本机的Node环境而且换版本、清理环境都很方便。如果你电脑上已经装好了Docker这基本是开销最小的启动方式。2.2 Node.js源码方式适合想看内部逻辑的人如果你不满足于“打题”还想研究一下网站的前后端代码、看看漏洞到底是怎么被写出来的那就用源码方式跑。git clone https://github.com/juice-shop/juice-shop.git cd juice-shop npm install npm start启动完成后同样是访问http://localhost:3000。源码方式的好处是目录结构都摊在你面前你可以打开后端代码看路由处理逻辑也可以打开前端资源看接口调用。很多隐藏接口和漏洞成因看代码一眼就明白了。缺点是需要安装Node.js环境而且npm install可能因为网络问题比较慢。我在实际操作中遇到过Node版本不兼容的情况后来把Node升到18以上问题就消失了。如果你的环境比较旧建议先确认一下Juice Shop当前版本对Node版本的要求。还有一种折中方案源码跑起来之后用编辑器把项目目录开着一边打题一边对照代码理解会深很多。2.3 启动后的三个必做检查靶场启动后别急着开始打先做三件事第一正常注册一个普通用户随便逛几个商品页把一件商品加入购物车并走一遍下单流程。这个过程能帮你建立“正常业务长什么样”的基线后面遇到异常响应时你才知道哪里不对劲。第二打开http://localhost:3000/score-board确认Score Board能正常访问。虽然主页上也有入口但有些版本需要直接访问这个路径。Score Board是你后续所有题目的参考中心先确认它可用很重要。第三看一下/robots.txt。很多网站都会放这个文件来告诉搜索引擎哪些路径可以爬、哪些不能爬而Juice Shop在这个文件里也藏了线索。养成看robots.txt的习惯对以后做真实目标的信息收集有百利而无一害。2.4 在线Demo和本地靶场怎么选Juice Shop官方有一个在线演示站点打开就能玩。但我在实际使用中还是建议优先搭本地理由有三个一是线上站点访问速度和稳定性受网络影响答题体验打折扣二是线上版本是一次性的刷新可能丢失进度本地可以慢慢研究三是本地靶场方便配合Burp Suite等抓包工具不用考虑代理配置带来的各种干扰。如果你实在不想装环境先在线点两下试试水也没问题但真正系统性学习还是本地环境更可控。3. 解题前的信息收集先学会“看”再学会“打”3.1 页面功能就是题目线索Juice Shop的难点不在于“没有提示”而在于提示到处都是你得分得清哪些是正常的业务功能哪些是埋好的漏洞点。每看到一个功能模块我脑子里都会自动过一遍映射关系搜索框对应注入或逻辑问题登录框对应认证绕过上传点对应对文件类型校验问题评价区对应XSS或者CSRF订单详情对应越权等等。这个映射关系其实是可以提前背下来的。比如你打开Juice Shop的搜索框随便输入一个商品关键词比如“apple”观察搜索结果的URL可能是/rest/products/search?qapple。这时候就应该意识到这个q参数是直接拼接进后端查询的很有可能存在注入。测试方法也很简单输入一个单引号看响应是否报错如果报错了说明参数进了SQL逻辑接下来就能尝试注入payload。这种“看到功能先映射漏洞类型”的思维方式比单纯背payload重要得多。因为真实环境中不存在“SQL注入专项练习场”只存在一个个看似正常的功能点。3.2 Score Board你的任务地图和计分板Score Board是Juice Shop最核心的导航工具。打开之后你能看到所有已解锁的挑战每条挑战有名称、难度和积分。难度用星星数量表示三星难度的题目往往需要综合使用多个漏洞点不是一步能搞定的。新手打Juice Shop容易走两个极端一个是盯着难题死磕另一个是只打简单题。我的建议是按难度递增去打先把Easy的挑战都清一遍这样能快速熟悉题库风格也能积累基础技巧。等到后面打Hard题时你会发现很多难点其实只是“多个Easy技巧的组合”。Score Board上还有提示功能。每一道题可以花积分换取额外提示但这些提示阅读之后会扣除一定分数。如果你是为了学习扣分不用太在意如果在意排行榜成绩就要克制着用。不过我个人觉得卡在一个题目上两小时不如花两分钟看个提示学习效率会高很多。3.3 F12开发者工具的三个高频面板我第一次打Juice Shop时习惯性地打开F12才发现这里是真正的主战场。浏览器开发者工具里我最常用的是三个面板Network网络面板是看请求的核心。勾选Preserve log然后在页面上随便点一下可以看到每个操作的请求URL、方法、状态码、请求头和响应体。打靶场的第一步往往就是从Network里找到某个接口然后用Burp重放。Console控制台面板会输出前端脚本的报错信息和调试日志。Juice Shop有些漏洞触发后会在控制台打印一些提示比如某个隐藏API被调用了某个验证逻辑出错。养成每次操作后都扫一眼Console的习惯能发现不少线索。Sources源代码面板则是找隐藏接口的宝库。打包后的前端JS代码可能比较长直接用CtrlShiftF全局搜索关键词比如api、admin、token、role经常会搜出一些页面里看不到但实际存在的接口路径。3.4 Burp Suite什么时候上场浏览器F12能帮你完成80%的观察工作但如果要“改请求”或“重放请求”就必须上Burp Suite了。Burp的代理功能可以把浏览器的所有HTTP流量转到它那边你可以拦截、修改、重发任意请求。配置Burp代理的步骤不复杂Burp默认监听127.0.0.1:8080浏览器设置好代理指向这个地址然后访问http://localhost:3000。第一次用可能会被浏览器警告证书问题需要安装Burp的CA证书才能正常看HTTPS流量。不过Juice Shop本地是HTTP协议所以一般不会遇到证书问题。我的使用习惯是用浏览器F12做初步观察发现问题接口后在Burp里找到对应请求右键Send to Repeater然后在Repeater里改参数。Burp真正强的地方在于可以让请求脱离页面逻辑单独跑这样你能精确控制每一个变量。4. 从管理员登录到越权查单四类典型题目的完整打法4.1 SQL注入一条注释符拿到管理员身份Juice Shop里最经典的入门题之一就是从登录表单触发SQL注入拿到管理员权限。具体操作是在登录页的邮箱输入框里填入 OR 11--密码随便填然后点击登录。这个payload的原理并不复杂。登录的后端SQL语句大概长这样SELECT * FROM Users WHERE email 输入的邮箱 AND password 输入的密码当你输入 OR 11--时实际拼接出来的语句变成了SELECT * FROM Users WHERE email OR 11-- AND password xxx这里--是SQL注释符它会把后面AND password xxx的部分注释掉。于是整条语句的逻辑就变成了“查找邮箱为空或者11的用户”而11永远成立所以这条语句会返回第一条用户记录。很多数据库里第一条记录就是管理员于是你直接用管理员身份登录进去了。在实际操作中有两个细节值得注意。第一SQLiteJuice Shop默认用的数据库对注释符的要求是--后面要有空格或者换行所以你在输入时最好在--后面加一个空格写成 OR 11--否则可能不生效。第二登录成功后页面可能没有明显变化但Score Board上会弹出“成功登录管理员账户”的挑战通知同时右上角会显示管理员身份说明你已经拿到了管理员会话。这个题目的价值不在于让你会背一个payload而是让你理解SQL注入的本质——后端没有对用户输入做任何转义直接把输入拼进SQL语句执行。理解这个成因之后再去想象真实的业务系统里哪些地方还可能存在同样问题思路就打开了。4.2 认证逻辑缺陷空口令、用户枚举和注册越权除了SQL注入Juice Shop里还有一批题目专门考认证逻辑的缺陷这些题比注入更贴近真实业务。第一个是空口令。Juice Shop的实例里有时会存在一些“遗留账号”这些账号在创建时没有设置密码或者密码为空。如果你在登录页尝试某些常见用户名比如adminjuice-sh.op密码留空或随便输可能会直接登录成功。这道题的本质是后端只校验了邮箱是否存在于用户表却没有强制校验密码字段或者校验逻辑写得有疏漏。第二个是用户枚举。有些登录接口对“邮箱不存在”和“密码错误”返回不同的错误文案比如前者提示“Email not found”后者提示“Invalid credentials”。利用这种差异你可以逐个尝试邮箱地址确认哪些账号是真实存在的。这在渗透测试里叫用户枚举是后续暴力破解或钓鱼攻击的前置步骤。第三个是注册越权我个人觉得是Juice Shop里特别有意思的一类题。正常注册流程是填写邮箱、密码、安全问题等抓包之后你能看到请求体大概是这样{ email: testtest.com, password: 123456, passwordRepeat: 123456, securityQuestion: 1, securityAnswer: answer }如果你把email改成管理员邮箱adminjuice-sh.op然后重新提交注册服务器大概率不会拒绝而是直接帮你创建了一个“邮箱前缀是admin、但是你自己知道密码”的账号。接下来再用这个账号登录你会发现自己拥有了管理员权限。这就是典型的注册逻辑缺陷——后端没有校验邮箱是否已被占用也没有校验你是不是在试图覆盖已有账号。这三个例子说明一个问题认证逻辑漏洞往往不需要花哨的payload只需要“多想一步”。开发者在写登录注册功能时默认用户不会去修改请求体而攻击者恰恰是从修改请求体开始的。4.3 越权访问改一个ID看别人的订单越权漏洞是Juice Shop题库里的重头戏也是真实Web业务里最常见的高危问题之一。它对应OWASP里经常提到的“失效的访问控制”类别。这类题目的实操套路非常统一登录自己的账号正常创建一个资源比如生成一个订单、添加一个地址、提交一条评价然后抓包找到对应资源的ID把ID改成相邻的数字看返回结果。举个例子你下单后可以通过类似/api/Orders/24的接口看到自己的订单详情。如果把URL里的24改成23后端如果只校验了“订单存在不存在”而没有校验“这个订单是不是你的”那你就直接看到了另一个用户的订单信息包括收货地址、联系电话、支付信息等敏感数据。在真实系统里这种漏洞会导致大量用户隐私泄露。Juice Shop会通过Score Board上的挑战提醒你解锁了同类漏洞你只要把ID变量多试几个位置覆盖订单、评价、购物车这些资源接口很快就能摸清楚后端哪里做了校验、哪里没做。这种“改ID看返回”的测试方法术语叫IDORInsecure Direct Object References不安全的直接对象引用是所有Web渗透测试者必须掌握的看家本领。我在打这类题时最大的体会是越权漏洞的发现难度不在于技术而在于“细心”。你需要一个一个接口去遍历观察响应里是否出现其他人的数据。说实话这个动作挺枯燥的但在真实项目中这种耐心往往能挖出最严重的问题。4.4 文件上传与XSS从上传点到前端脚本执行Juice Shop的另一个经典主线是文件上传漏洞和XSS的组合利用。商城支持用户上传头像也支持在商品评价里写评语这两个点如果校验不严就能造出攻击链。先看上传。注册并登录之后进入个人资料页找到头像上传的位置。正常情况下这个上传点应该只允许图片文件但如果后端没有校验文件类型你就可以上传一个扩展名为.html或.svg的文件文件内容里包含一段JavaScript脚本。上传成功后服务器会返回文件的访问URL比如/public/images/uploads/xxx.svg。此时直接访问这个URL浏览器会把它当作HTML/SVG渲染里面的脚本就执行了。这在真实攻击里可以用来构造钓鱼链接或者在目标用户浏览器里执行恶意代码。再看评价XSS。商品评价提交框是一个典型的存储型XSS点。你可以尝试在评语里插入类似这样的内容iframe srcjavascript:alert(xss)保存评语之后当别的用户打开该商品页面这段评语被浏览器解析iframe里的JavaScript就会执行。初学者第一次看到alert弹窗出现时往往觉得很神奇但其实原理就是一句话输出到页面上的内容没有经过任何转义浏览器把用户输入当成了HTML代码来解析。文件上传和XSS单独看都不算特别难但组合起来就很有实战味道了。攻击者可以先上传一个恶意文件再把文件URL通过XSS触发或者把恶意脚本藏在评论区等管理员查看评论时盗取管理员会话。这才是文件上传漏洞真正危险的地方——它往往不是终点而是攻击链的起点。4.5 隐藏接口和敏感路径通往管理后台的钥匙很多新手在Juice Shop里转了一圈除了首页和商品页之外什么都没发现然后就卡住了。这时候你需要进入信息收集模式专门去找那些页面上没有直接给出入口的路径。我习惯的路径发现顺序是先看robots.txt再看前端JS里的接口路径最后尝试几个常见的敏感路径。Juice Shop里比较经典的敏感路径包括/administration管理后台、/ftp文件目录、/api/接口根路径等。你直接在浏览器地址栏访问这些路径可能会有意外收获。如果/ftp能正常打开目录列表里面很可能放置着一些敏感备份文件下载下来再分析往往能找到下一步的线索。这里有个细节/administration管理后台通常需要管理员权限才能访问直接访问可能会被重定向或者返回403。但是如果你已经通过前面4.1或4.2的方法获得了管理员会话再访问这个路径就能看到后台管理页面。后台里能看到所有用户、所有订单这种“信息集中地”对于后续题目帮助巨大。隐藏接口的发现能力说到底是前端代码审计能力和字典经验积累的结果。多打几遍Juice Shop你自然会对“哪些路径值得猜”形成感觉。5. 卡关求助手册提示、重放与前端代码排查5.1 提示不是摆设用对了能省几小时Juice Shop的Score Board每一道题都可以查看提示有的题有好几条提示而且提示的透明度不一样——第一条通常是模糊的方向后面会越来越接近答案。打Juice Shop时我的原则是“30分钟试错底线”一道题单独思考尝试超过30分钟没有进展就看一条提示。这不是作弊而是模拟真实工作中的求助行为。在真实项目里查资料、问同事、翻文档都是正常手段单打独斗反而效率低下。5.2 Burp Repeater的调试思路一次只改一个变量在Burp Suite的Repeater里调试请求是解决Juice Shop百分之七十“疑难杂症”的关键能力。很多初学者卡题不是因为不会改请求而是因为一次改了太多东西导致不知道哪一步起作用了。正确做法是先在浏览器里把一个正常操作完整跑一遍比如修改个人资料、提交评价、创建订单然后在Burp的HTTP History里找到对应的请求右键Send to Repeater。在Repeater里先不改任何东西点一次Send确认请求能被服务器正常响应。再单独修改一个参数比如把userId改成别人的ID点Send对比两次响应体有什么区别。如果响应里出现了订单号、用户名、地址等变化就说明这个参数是可控点接下来继续深挖。这个“一次只改一个变量”的调试方法几乎适用于所有Web渗透场景。它看起来笨但排查问题最快。我见过很多新手在Burp里一上来就同时改header、改body、改Cookie结果响应报错了也不知道是哪个改动导致的最后只能全部撤销重来。5.3 在前端JS里挖接口和隐藏逻辑现代Web应用基本都是前后端分离的前端JS文件里会打包所有的API地址和部分权限判断逻辑。Juice Shop也不例外。打开开发者工具的Sources面板按CtrlShiftF全局搜索输入api几秒钟内就能看到一堆接口路径。想找管理后台相关的接口就搜admin想找认证相关的逻辑就搜token、role。很多情况下某个隐藏接口就藏在压缩过的JS文件里你只要把关键词搜对就能顺藤摸瓜找到下一环。这里有一个很常见的坑直接在浏览器Console里执行JS代码时如果代码引用了后端接口返回的变量而当前页面没有定义这个变量代码会报错。遇到这种情况不要慌先回到Network面板看对应的API请求看响应体里的字段名再回Console里按字段名写代码。5.4 把靶场环境搞乱后的一键重置技巧打靶场打久了数据难免会搞乱用户多了、订单乱了、某个资源被删了甚至数据库被注入得面目全非。与其费劲去“修”不如直接重置。如果你用的是Docker启动方式重置最简单——停掉容器再重新启动就回到初始状态了docker stop juice-shop docker run --rm -p 3000:3000 bkimminich/juice-shop如果你用的是源码方式就把数据库文件删掉再重启或者直接重新npm start多数情况下也会重新初始化数据。这个重置习惯要趁早养成它能让你在反复试错中始终保持一个干净的环境而不是被之前尝试留下的脏数据干扰判断。6. 通关不是终点把靶场经验转化成真本事6.1 官方题解怎么看才不浪费题目Juice Shop的官方文档和GitHub仓库里有所有挑战的题解和利用思路有的是文字说明有的附带代码示例。题解是很好的学习资料但打开时机很关键。我的建议是一道题至少要自己尝试三十分钟以上再看题解。看的时候不要只抄payload而是重点理解这几个问题——为什么会选这个入口为什么这个参数是可控的攻击成功后对系统的影响是什么看完之后把浏览器关掉重新登录环境凭记忆再独立打一遍。如果第二遍能流畅打出来说明这道题的知识点真正被你吸收了。6.2 用OWASP Top 10给已解挑战做分类映射Juice Shop里的挑战基本覆盖了OWASP Top 10的十大类漏洞。打通一定数量之后我强烈建议你做一次“分类映射”练习每解锁一个挑战就在表格里记下它属于哪个漏洞类别。做映射练习的价值在于它能帮你建立起“漏洞类型—利用方式—修复思路”的关联框架。以后面对一个新系统时你不再是看到什么测什么而是有系统性地按照漏洞分类去逐个验证。这里列一下常用对照关系OWASP Top 10类别Juice Shop中的典型题目示例A01 失效的访问控制越权查看订单/评价、访问管理后台A02 加密失败敏感信息明文传输或存储A03 注入登录表单SQL注入、搜索框注入A04 不安全设计注册逻辑缺陷、空口令账号A05 安全配置错误目录列举、敏感文件泄露A06 易受攻击和过时的组件依赖版本漏洞A07 身份识别和认证失败用户枚举、弱口令A08 软件和数据完整性故障恶意文件上传A09 日志和监控不足操作行为不可追踪A10 服务端请求伪造SSRF类题目做这个分类时不用追求100%准确关键是练习“把具体漏洞抽象成类别”的能力。6.3 靶场和真实渗透的差距Juice Shop毕竟是教学靶场漏洞埋得比较“友好”题目之间也有一条隐性主线而真实渗透测试面对的系统和它有很大差别。真实系统里没有Score Board告诉你已经突破了哪一步没有积分提示漏洞也不会打包放在同一个目录方便你逐一攻破。真实渗透更考验两件事一是工程化能力包括配置好工具、管理好数据、记录好过程二是报告能力发现漏洞之后要能说清楚影响范围和风险等级而不是丢一个payload就完事。靶场可以帮你积累漏洞利用的“手感”但沟通、文档、团队协作这些能力只能在真实项目和模拟演练中慢慢历练。6.4 学习边界永远在授权范围内动手最后这条我觉得有必要单独讲。Juice Shop这类靶场存在的前提就是它给安全学习者提供了一个完全合法、可控的练习环境。所有测试行为都应该限定在自己搭建的靶场或者获得明确授权的系统上。未经授权去扫描、攻击任何他人的网站或服务都是在给自己制造法律风险。把靶场里学到的技巧用在真正授权的测试活动中或者反过来用它来加固自己的产品这才是Juice Shop设计的初衷。学习漏洞知识是为了发现和修补问题不是为了绕过防线这个边界值得每个入门安全的人记住。最后分享一个我自己的习惯每次打开Juice Shop我会先在纸上画一条“攻击路径”从信息收集开始把发现的接口、参数、异常点全写下来再决定先打哪条线。靶场题目多不画路径很快会迷失。另外打通一道题之后把payload、响应、截图记录下来整理成自己的“漏洞字典”以后做真实项目时翻出来特别有用。
返回列表