├── Gemfile ├── assets └── images │ ├── Xing_logo.png │ ├── escape-room.png │ ├── wwhf_header.png │ ├── ESailors_Logo.png │ ├── iteratec-logo.png │ ├── secuveraLogo.png │ ├── yourlogo_logo.png │ ├── userday2024_banner.png │ ├── 300px-Denim-group_trans.png │ ├── NewWork_SE_Logo_RGB_Pos.png │ ├── OWASP 20th Anniversary.jpeg │ └── example_project-info_sidebar.png ├── .gitignore ├── .github ├── dependabot.yml └── workflows │ ├── lock.yml │ ├── changed-attributions.yml │ ├── validate-owasp-metadata.yaml │ └── stale.yml ├── _config.yml ├── _data ├── ow_attributions.json ├── snippets.json ├── roadmap_milestones.json └── challenges.yml ├── leaders.md ├── 404.html ├── tab_ctf.md ├── tab_challenges.md ├── info.md ├── tab_ecosystem.md ├── project.owasp.yaml ├── tab_supporters.md ├── tab_overview.md ├── tab_learning.md ├── index.md └── tab_news.md /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | group :jekyll_plugins do 3 | gem "github-pages" 4 | end -------------------------------------------------------------------------------- /assets/images/Xing_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/Xing_logo.png -------------------------------------------------------------------------------- /assets/images/escape-room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/escape-room.png -------------------------------------------------------------------------------- /assets/images/wwhf_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/wwhf_header.png -------------------------------------------------------------------------------- /assets/images/ESailors_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/ESailors_Logo.png -------------------------------------------------------------------------------- /assets/images/iteratec-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/iteratec-logo.png -------------------------------------------------------------------------------- /assets/images/secuveraLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/secuveraLogo.png -------------------------------------------------------------------------------- /assets/images/yourlogo_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/yourlogo_logo.png -------------------------------------------------------------------------------- /assets/images/userday2024_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/userday2024_banner.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | env 3 | .vscode 4 | .idea/ 5 | *.iml 6 | .jekyll-metadata 7 | Gemfile.lock 8 | _site/ 9 | .ruby-version 10 | -------------------------------------------------------------------------------- /assets/images/300px-Denim-group_trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/300px-Denim-group_trans.png -------------------------------------------------------------------------------- /assets/images/NewWork_SE_Logo_RGB_Pos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/NewWork_SE_Logo_RGB_Pos.png -------------------------------------------------------------------------------- /assets/images/OWASP 20th Anniversary.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/OWASP 20th Anniversary.jpeg -------------------------------------------------------------------------------- /assets/images/example_project-info_sidebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OWASP/www-project-juice-shop/HEAD/assets/images/example_project-info_sidebar.png -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: weekly 7 | time: '00:45' 8 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | remote_theme: "owasp/www--site-theme@main" 2 | plugins: 3 | - jekyll-include-cache-0.2.0 4 | repository: OWASP/www-project-juice-shop 5 | code_user: juice-shop 6 | code_repo: juice-shop 7 | -------------------------------------------------------------------------------- /_data/ow_attributions.json: -------------------------------------------------------------------------------- 1 | ["Bj\u00f6rn Kimminich", "Jeroen Willemsen", "Soron Foster", "Bendik Mjaaland", "Timo Pagel", "Benjamin Pf\u00e4nder", "Kevin Chung", "Brian Johnson", "Omar Santos", "Merlyn Albery", "Alper Basaran", "Jediah Logiodice", "Kenyo Kaneda", "Ian Sexton", "raygagnon2025@gmail.com", "David @ HailBytes"] -------------------------------------------------------------------------------- /leaders.md: -------------------------------------------------------------------------------- 1 | ### Leaders 2 | 3 | * [Bjoern Kimminich](mailto:bjoern.kimminich@owasp.org) 4 | * [Jannik Hollenbach](mailto:jannik.hollenbach@owasp.org) 5 | 6 | ![Bjoern's GitHub stats](https://github-readme-stats.vercel.app/api?username=bkimminich&show_icons=true) 7 | ![Jannik's GitHub stats](https://github-readme-stats.vercel.app/api?username=J12934&show_icons=true) 8 | 9 | 12 | -------------------------------------------------------------------------------- /.github/workflows/lock.yml: -------------------------------------------------------------------------------- 1 | name: 'Lock Threads' 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | 7 | permissions: 8 | issues: write 9 | pull-requests: write 10 | 11 | jobs: 12 | action: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: dessant/lock-threads@f1a42f0f44eb83361d617a014663e1a76cf282d2 #note newer is available 16 | with: 17 | issue-lock-comment: > 18 | This thread has been automatically locked because it has not had 19 | recent activity after it was closed. :lock: Please open a new issue 20 | if needed. 21 | issue-lock-reason: '' 22 | pr-lock-reason: '' -------------------------------------------------------------------------------- /.github/workflows/changed-attributions.yml: -------------------------------------------------------------------------------- 1 | name: "Notify on changed attributions" 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | paths: 7 | - '_data/ow_attributions.json' 8 | 9 | jobs: 10 | slackNotification: 11 | name: Slack Notification 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Slack Notification 16 | uses: rtCamp/action-slack-notify@v2 17 | env: 18 | SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} 19 | SLACK_USERNAME: 'Donation Alert' 20 | SLACK_ICON_EMOJI: ':money_with_wings:' 21 | SLACK_FOOTER: '' 22 | MSG_MINIMAL: commit,actions url -------------------------------------------------------------------------------- /.github/workflows/validate-owasp-metadata.yaml: -------------------------------------------------------------------------------- 1 | name: Validate OWASP entity metadata 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - '*.owasp.yaml' 7 | push: 8 | paths: 9 | - '*.owasp.yaml' 10 | 11 | permissions: 12 | contents: read 13 | 14 | concurrency: 15 | cancel-in-progress: true 16 | group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }} 17 | 18 | jobs: 19 | validate-metadata: 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - name: Checkout code 24 | uses: actions/checkout@v5 25 | 26 | - name: Validate metadata file 27 | uses: owasp/nest-schema/.github/actions/validate@a733198b4a942eb12d3ee8629cd9e0d409b1b2b9 28 | -------------------------------------------------------------------------------- /_data/snippets.json: -------------------------------------------------------------------------------- 1 | {"challenges":["directoryListingChallenge","accessLogDisclosureChallenge","resetPasswordMortyChallenge","changeProductChallenge","registerAdminChallenge","exposedMetricsChallenge","loginAdminChallenge","loginBenderChallenge","loginJimChallenge","unionSqlInjectionChallenge","dbSchemaChallenge","noSqlReviewsChallenge","forgedReviewChallenge","redirectCryptoCurrencyChallenge","redirectChallenge","resetPasswordBjoernOwaspChallenge","resetPasswordBjoernChallenge","resetPasswordJimChallenge","resetPasswordBenderChallenge","resetPasswordUvoginChallenge","web3WalletChallenge","nftMintChallenge","nftUnlockChallenge","adminSectionChallenge","scoreBoardChallenge","web3SandboxChallenge","tokenSaleChallenge","restfulXssChallenge","localXssChallenge","xssBonusChallenge","weakPasswordChallenge"]} 2 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | title: 404 - Not Found 4 | layout: col-generic 5 | 6 | --- 7 | 8 |
9 |

10 |

WHOA THAT PAGE CANNOT BE FOUND

11 |

Try the SEARCH function in the main navigation to find something. If you are looking for chapter information, please see Chapters for the correct chapter. For information about OWASP projects see Projects. For common attacks, vulnerabilities, or information about other community-led contributions see Contributed Content.

12 | 13 |
14 |

If all else fails you can search our historical site.

15 |
16 | -------------------------------------------------------------------------------- /_data/roadmap_milestones.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Enhance UX of Score Board regarding coding challenges and embedded payloads (#2875, #2876)", 3 | "Modernize the frontend for better maintainability, performance, and accessibility (#2868)", 4 | "Investigate possibility to include AI/LLM challenges without bloating the application", 5 | "Gradually enhance the codebase and pay back accumulated technical debt", 6 | "Eventually bring overall test coverage back over 90%" 7 | ] 8 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: 'Close stale issues and PR' 2 | on: 3 | schedule: 4 | - cron: '30 1 * * *' 5 | 6 | jobs: 7 | stale: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/stale@v4 11 | with: 12 | stale-issue-message: > 13 | This issue has been automatically marked as `stale` because it has not had 14 | recent activity. :calendar: It will be _closed automatically_ in one week if no further activity occurs. 15 | stale-pr-message: > 16 | This PR has been automatically marked as `stale` because it has not had 17 | recent activity. :calendar: 18 | close-issue-message: This issue was closed because it has been stalled for 7 days with no activity. 19 | days-before-stale: 14 20 | days-before-close: 7 21 | days-before-pr-close: -1 -------------------------------------------------------------------------------- /tab_ctf.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CTF 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 5 7 | tags: juiceshop 8 | --- 9 | 10 | ## CTF Extension 11 | 12 | ![Juice Shop CTF Logo](https://raw.githubusercontent.com/juice-shop/juice-shop-ctf/master/images/JuiceShopCTF_Logo_100px.png) 13 | 14 | [![GitHub release](https://img.shields.io/github/release/juice-shop/juice-shop-ctf.svg)](https://github.com/juice-shop/juice-shop-ctf/releases/latest) 15 | [![GitHub stars](https://img.shields.io/github/stars/juice-shop/juice-shop-ctf.svg?label=GitHub%20%E2%98%85&style=flat)](https://github.com/juice-shop/juice-shop-ctf) 16 | 17 | The Node package 18 | [`juice-shop-ctf-cli`](https://www.npmjs.com/package/juice-shop-ctf-cli) 19 | helps you to prepare 20 | [Capture the Flag](https://en.wikipedia.org/wiki/Capture_the_flag#Computer_security) 21 | events with the OWASP Juice Shop challenges for different popular CTF 22 | frameworks. This interactive utility allows you to populate a CTF game 23 | server in a matter of minutes. 24 | 25 | ![Juice Shop CLI in Powershell](https://raw.githubusercontent.com/juice-shop/juice-shop-ctf/master/images/juice-shop-ctf-cli.png) 26 | 27 | ### Supported CTF Frameworks 28 | 29 | The following open source CTF frameworks are supported by 30 | `juice-shop-ctf-cli`: 31 | 32 | * [CTFd](https://github.com/CTFd/CTFd) 33 | * [FBCTF](https://github.com/facebook/fbctf) 34 | * [RootTheBox](https://github.com/moloch--/RootTheBox) 35 | -------------------------------------------------------------------------------- /tab_challenges.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Challenges 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 3 7 | tags: juiceshop 8 | --- 9 | 10 | ## Challenge Categories 11 | 12 | {% assign categories = site.data.challenges | group_by:"category" | sort: "name" %} 13 | 14 | The vulnerabilities found in the OWASP Juice Shop are categorized into 15 | several different classes. Most of them cover different risk or 16 | vulnerability types from well-known lists or documents, such as 17 | [OWASP Top 10](https://owasp.org/www-project-top-ten/), 18 | [OWASP ASVS](https://owasp.org/www-project-application-security-verification-standard/), 19 | [OWASP Automated Threat Handbook](https://owasp.org/www-project-automated-threats-to-web-applications/) 20 | and 21 | [OWASP API Security Top 10](https://owasp.org/www-project-api-security/) 22 | or MITRE's 23 | [Common Weakness Enumeration](https://cwe.mitre.org/). 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {% for category in categories %} 32 | 33 | 34 | 35 | 36 | 37 | {% endfor %} 38 | 39 | 40 | 41 | 42 |
Category#Challenges
{{ category.name }}{{ category.items.size }}{{ category.items | group_by:"name" | sort: "name" | map: "name" | join: ", " }}
Total Σ{{ site.data.challenges.size }}
43 | 44 | ## Challenge Tags 45 | 46 | {% assign tags = site.data.challenges | map: "tags" | uniq | join: "," | replace: ",,", "," | split: "," | sort %} 47 | 48 | Tags do not represent vulnerability categories but serve as additional 49 | meta information for challenges. They mark certain commonalities or 50 | special types of challenges - like those lacking seriousness or ones 51 | that probably need some scripting/automation etc. 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | {% for tag in tags %} 60 | {% assign taggedChallenges = site.data.challenges | group_by: "tags" | where_exp:"item", "item.name contains tag" | map: "items" | map: "name" %} 61 | 62 | 63 | 66 | 69 | 70 | {% endfor %} 71 |
Tag#Challenges
{{ tag }} 64 | {{ taggedChallenges.size }} 65 | 67 | {{ taggedChallenges | sort | join: ", " }} 68 |
72 | 73 | -------------------------------------------------------------------------------- /info.md: -------------------------------------------------------------------------------- 1 | 5 | 6 | ### Project Information 7 | 8 | * 9 | Flagship Project 10 | 11 | #### Classification 12 | 13 | * Tool 14 | 15 | #### Audience 16 | 17 | * Builder 18 | * Breaker 19 | * Defender 20 | 21 | ### Installation 22 | 23 | * [From Source](https://github.com/juice-shop/juice-shop#from-sources) 24 | * Packaged 25 | ([GitHub](https://github.com/juice-shop/juice-shop/releases/)/[SourceForge](https://sourceforge.net/projects/juice-shop/files/)) 26 | * [Docker Image](https://hub.docker.com/r/bkimminich/juice-shop) 27 | 28 | ### Sources 29 | 30 | * [GitHub](https://github.com/juice-shop/juice-shop) 31 | * [CTF Extension (GitHub)](https://github.com/juice-shop/juice-shop-ctf) 32 | * [MultiJuicer (GitHub)](https://github.com/juice-shop/multi-juicer) 33 | * [Crowdin I18N](https://crowdin.com/project/owasp-juice-shop) 34 | 35 | ### Documentation 36 | 37 | * [Online Demo](https://juice-shop.herokuapp.com/) 38 | * [Introduction Slides](https://juice-shop.github.io/juice-shop) 39 | * Companion Guide 40 | ([LeanPub](https://leanpub.com/juice-shop)/[Online](https://pwning.owasp-juice.shop)) 41 | 42 | ### Community 43 | 44 | * [Slack Channel](https://owasp.slack.com/messages/project-juiceshop) ([Self-registration](https://owasp.org/slack/invite)) 45 | * [Matrix](https://matrix.to/#/#bkimminich_juice-shop:gitter.im) 46 | * [Subreddit](https://www.reddit.com/r/owasp_juiceshop) 47 | * [Google Group](https://groups.google.com/a/owasp.org/g/juice-shop-project) 48 | 49 | ### Statistics 50 | 51 | * [Daily Project Stats](https://stats.owasp-juice.shop) 52 | 53 | ### Social Media 54 | 55 | * [BlueSky](https://bsky.app/profile/owasp-juice.shop) 56 | * Mastodon 57 | * [Twitter/X](https://x.com/owasp_juiceshop) 58 | * [Facebook](https://www.facebook.com/owasp.juiceshop) 59 | * [YouTube](https://www.youtube.com/channel/UCjkQ1Y-bxYAqwwD1SyQpBvw/playlists) 60 | 61 | ### Merchandise 62 | 63 | * [OpenSea](https://opensea.io/collection/juice-shop) 64 | * [StickerYou](https://www.stickeryou.com/products/owasp-juice-shop/794) 65 | * SpreadShirt 66 | ([US](http://shop.spreadshirt.com/juiceshop)/[DE](http://shop.spreadshirt.de/juiceshop)) 67 | -------------------------------------------------------------------------------- /tab_ecosystem.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ecosystem 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 6 7 | tags: juiceshop 8 | --- 9 | 10 | ## Official Companion Guide 11 | 12 | [![Write Goodreads Review](https://img.shields.io/badge/goodreads-write%20review-47129532.svg)](https://www.goodreads.com/review/edit/47129532) 13 | 14 | [Pwning OWASP Juice Shop](https://leanpub.com/juice-shop) is the 15 | official companion guide for this project. It will give you a complete 16 | overview of the vulnerabilities found in the application including hints 17 | how to spot and exploit them. In the appendix you will even find 18 | complete step-by-step solutions to every challenge. 19 | 20 | [Pwning OWASP Juice Shop cover](https://leanpub.com/juice-shop) 21 | [Pwning OWASP Juice Shop back cover](https://leanpub.com/juice-shop) 22 | 23 | The ebook is published under 24 | [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) 25 | and is online-readable **for free** at 26 | . The latest officially released 27 | edition is also available **for free** at 28 | in PDF, Kindle and ePub format. 29 | 30 | ## Official Multi User Platform 31 | 32 | [![MultiJuicer Logo](https://raw.githubusercontent.com/juice-shop/multi-juicer/master/images/multijuicer-with-text.png)](https://github.com/juice-shop/multi-juicer) 33 | 34 | Multi User Juice Shop Platform to run separate Juice Shop instances for training or CTF participants on a central Kubernetes cluster. [MultiJuicer](https://github.com/juice-shop/multi-juicer) comes with a built-in leader board and its own dedicated Juice Balancer for instance isolation. 35 | 36 | ## Official Jingle 37 | 38 | Official 39 | [OWASP Juice Shop Jingle](https://soundcloud.com/braimee/owasp-juice-shop-jingle) 40 | written and performed by 41 | [Brian Johnson](https://github.com/braimee) 42 | 43 | 44 | 45 | ## Endorsed Open Source Projects 46 | 47 | | Project | Description | 48 | |:--------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 49 | | | Demo to show the dangers of XSS holes combined with bad Content Security Policy using Harlem Shake and a Keylogger against the Juice Shop ([📺YouTube](https://youtu.be/Msi52Kicb-w)) | 50 | 51 | _The tools listed above are provided by third parties outside the 52 | OWASP Juice Shop project scope. For support or feature requests please 53 | use the support channels or issue trackers mentioned by these projects._ 54 | -------------------------------------------------------------------------------- /project.owasp.yaml: -------------------------------------------------------------------------------- 1 | audience: 2 | - breaker 3 | - builder 4 | - defender 5 | leaders: 6 | - name: Bjoern Kimminich 7 | email: bjoern.kimminich@owasp.org 8 | github: bkimminich 9 | - name: Jannik Hollenbach 10 | email: jannik.hollenbach@owasp.org 11 | github: J12934 12 | community: 13 | - name: project-juiceshop 14 | platform: slack 15 | url: https://owasp.slack.com/archives/C255XSY04 16 | description: Main channel of the OWASP Juice Shop project 17 | - name: 'bkimminich_juice-shop:gitter.im' 18 | platform: matrix 19 | url: https://matrix.to/#/#bkimminich_juice-shop:gitter.im 20 | - name: /r/owasp_juiceshop 21 | platform: reddit 22 | url: https://www.reddit.com/r/owasp_juiceshop 23 | mailing_list: 24 | - url: https://groups.google.com/a/owasp.org/g/juice-shop-project 25 | email: juice-shop-project@owasp.org 26 | social_media: 27 | - platform: bluesky 28 | url: https://bsky.app/profile/owasp-juice.shop 29 | - platform: mastodon 30 | url: https://fosstodon.org/@owasp_juiceshop 31 | - platform: x 32 | url: https://twitter.com/owasp_juiceshop 33 | - platform: youtube 34 | url: https://www.youtube.com/channel/UCjkQ1Y-bxYAqwwD1SyQpBvw/playlists 35 | - platform: facebook 36 | url: https://www.facebook.com/owasp.juiceshop 37 | events: 38 | - title: Juice Shop Developer Meeting 39 | description: Bi-weekly developer & contributor meeting via Google Meet (Tuesdays at 19:00-19:45 CET/CEST) 40 | url: https://calendar.google.com/calendar/u/0/embed?src=hl6cjgs6ep1h7oniqgueu2bhbo@group.calendar.google.com 41 | logo: 42 | - small: https://raw.githubusercontent.com/juice-shop/juice-shop/master/frontend/src/assets/public/images/JuiceShop_Logo_50px.png 43 | - medium: https://raw.githubusercontent.com/juice-shop/juice-shop/master/frontend/src/assets/public/images/JuiceShop_Logo_100px.png 44 | - large: https://raw.githubusercontent.com/juice-shop/juice-shop/master/frontend/src/assets/public/images/JuiceShop_Logo_400px.png 45 | level: 4 46 | license: 47 | - MIT 48 | - Apache-2.0 49 | - CC-BY-NC-ND-4.0 50 | name: OWASP Juice Shop 51 | pitch: Probably the most modern and sophisticated insecure web application for security trainings, awareness demos and CTFs. Also great voluntary guinea 52 | pig for your security tools and DevSecOps pipelines! 53 | repositories: 54 | - name: juice-shop 55 | url: https://github.com/juice-shop/juice-shop 56 | description: 'OWASP Juice Shop: Probably the most modern and sophisticated insecure web application' 57 | - name: multi-juicer 58 | url: https://github.com/juice-shop/multi-juicer 59 | description: Host and manage multiple Juice Shop instances for security trainings and Capture The Flags 60 | - name: juice-shop-ctf 61 | url: https://github.com/juice-shop/juice-shop-ctf 62 | description: Tool to export Juice Shop challenges and hints in data format compatible with CTFd, RootTheBox or FBCTF 63 | - name: pwning-juice-shop 64 | url: https://github.com/juice-shop/pwning-juice-shop 65 | description: Antora/Asciidoc content for Bjoern Kimminich's free eBook "Pwning OWASP Juice Shop" 66 | - name: juice-shop-tutorials 67 | url: https://github.com/juice-shop/juice-shop-tutorials 68 | description: Official OWASP Juice Shop tutorials on UI customization and system integration 69 | - name: www-project-juice-shop 70 | url: https://github.com/OWASP/www-project-juice-shop 71 | description: OWASP Juice Shop project website 72 | demo: 73 | - https://demo.owasp-juice.shop 74 | documentation: 75 | - https://pwning.owasp-juice.shop 76 | downloads: 77 | - https://hub.docker.com/r/bkimminich/juice-shop 78 | - https://github.com/juice-shop/juice-shop/releases 79 | - https://sourceforge.net/projects/juice-shop/files 80 | tags: 81 | - juiceshop 82 | - vulnerable application 83 | - training 84 | - awareness 85 | - ctf 86 | - capture the flag 87 | - education 88 | type: tool 89 | website: https://owasp-juice.shop 90 | -------------------------------------------------------------------------------- /tab_supporters.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Supporters 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 7 7 | tags: juiceshop 8 | --- 9 | 10 | ## Project Supporters 11 | 12 | > You can attribute your donation to the OWASP Juice Shop project by 13 | > using 14 | > [this link](/donate?reponame=www-project-juice-shop&title=OWASP+Juice+Shop) 15 | > or the green "Donate"-button while on any tab of the Juice Shop 16 | > project page! 17 | 18 | ### Top Supporters 19 | 20 | [![Your company name](assets/images/yourlogo_logo.png)](https://owasp.org/www-project-juice-shop/#div-supporters) 21 | 22 | _In order to be recognized as a "Top Supporter" a company 23 | must have donated $1000 or more a) to OWASP while attributing it to 24 | Juice Shop or b) as a restricted gift to OWASP Juice Shop in the last 12 25 | months._ 26 | 27 | #### All Corporate Supporters 28 | 29 | * [secuvera](https://www.secuvera.de/)(2018/2019/2023) 30 | * [mindsetters OG](https://www.mindsetters.com/)(2023) 31 | * [Heyhack](https://heyhack.com)(2022) 32 | * [Schutzwerk](https://www.schutzwerk.com/)(2022) 33 | * [New Work SE](https://www.new-work.se/en/about-new-work-se)(2019/2021) 34 | 35 | * [RandoriSec](https://randorisec.fr/)(2021) 36 | * [Wild West Hackin' Fest](https://wildwesthackinfest.com/)(2020) 37 | 38 | * [Denim Group](http://www.denimgroup.com/)(2018-2019) 40 | * [PlexTrac](https://plextrac.com)(2019) 41 | * [Silpion](https://silpion.de)(2019) 42 | * [iteratec](https://www.iteratec.de/)(2017) 44 | * [eSailors](https://www.esailors.de/)(2016) 46 | * [XING](https://corporate.xing.com/en/about-xing/security/)(2016) 47 | 48 | #### All Individual Supporters 49 | 50 | {% assign individual_supporter = site.data.ow_attributions | uniq %} 51 | {% for supporter in individual_supporter %} 52 | * {{ supporter | strip_html | strip_newlines | strip }} 53 | {% endfor %} 54 | * _You want to appear on this list?_ 55 | [Donate to OWASP here! 🤲](/donate?reponame=www-project-juice-shop&title=OWASP+Juice+Shop) 56 | 57 | #### All Corporate-sponsored Code Contributions 58 | 59 | * [#1221](https://github.com/juice-shop/juice-shop/pull/1221), 60 | [#1356](https://github.com/juice-shop/juice-shop/pull/1356): 61 | [Panasonic Information Systems Company Europe](https://application.job.panasonic.eu/data/ruP0pHQvHrGZJKvL/rc.php?nav=jobsearch&custval12=ite&lang=EN&custval11=PBSEU_GER)(2019-2020) 62 | 63 | _In order to be recognized as a "Corporate-sponsored Code 64 | Contribution" an official written confirmation of waiving all IP to the 65 | contributed code must be formally submitted to the OWASP 66 | Foundation._ 67 | 68 | #### LeanPub Royalties 69 | 70 | [Pwning OWASP Juice Shop](https://leanpub.com/juice-shop) 71 | 72 | $1,251.68 of royalties from 73 | [Björn Kimminich](https://kimminich.de)'s eBook have been donated to the 74 | project between 09/2017 and 07/2019. 75 | 76 | #### MultiJuicer Maintenance 77 | 78 | MultiJuicer was originally developed (and is still maintained primarily) by [iteratec](https://www.iteratec.com/en/). It became an official part of the OWASP Juice Shop project 05/2023. 79 | 80 | ![iteratec](assets/images/iteratec-logo.png) 81 | 82 | --- 83 | 84 | _The OWASP Foundation is very grateful for the support by the 85 | individuals and organizations listed. However, please note, the OWASP 86 | Foundation is strictly vendor neutral and does not endorse any of its 87 | supporters._ 88 | -------------------------------------------------------------------------------- /tab_overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Overview 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 1 7 | tags: juiceshop 8 | --- 9 | 10 | ## Main Selling Points 11 | 12 | * **Free and Open source**: Licensed under the 13 | [MIT license](https://github.com/juice-shop/juice-shop/blob/master/LICENSE) 14 | with no hidden costs or caveats 15 | * **Easy-to-install**: Choose between 16 | [node.js](http://nodejs.org), 17 | [Docker](https://www.docker.com) and 18 | [Vagrant](https://www.vagrantup.com/downloads.html) to run on 19 | Windows/Mac/Linux as well as all major cloud providers 20 | * **Self-contained**: Additional dependencies are 21 | [pre-packaged](https://github.com/juice-shop/juice-shop/releases/latest) 22 | or will be resolved and downloaded automatically 23 | * **Beginner-friendly**: 24 | [Hacking Instructor](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_hacking_instructor) 25 | scripts with optional 26 | [tutorial mode](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_tutorial_mode) 27 | guide newcomers through several challenges while explaining the 28 | underlying vulnerabilities 29 | * **Gamification**: The application 30 | [notifies you on solved challenges](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_success_notifications) 31 | and keeps track of successfully exploited vulnerabilities on a 32 | [Score 33 | Board](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_the_score_board) 34 | * **Self-healing**: 35 | [Wiped clean and 36 | repopulated from scratch](https://pwning.owasp-juice.shop/companion-guide/latest/part1/running.html#_self_healing_feature) 37 | on every server startup while 38 | [automatically persisting progress in your browser](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_automatic_saving_and_restoring_hacking_progress) 39 | or via 40 | [manual local backup](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_manual_progress_and_settings_backup) 41 | * **Re-branding**: 42 | [Fully customizable](https://pwning.owasp-juice.shop/companion-guide/latest/part4/customization.html) 43 | in business context and look & feel to your own corporate or customer 44 | requirements 45 | * **CTF-support**: Challenge notifications optionally contain a flag 46 | code for your own 47 | [Capture-The-Flag events](https://pwning.owasp-juice.shop/companion-guide/latest/part4/ctf.html) 48 | * **Coding Challenges**: Over 20 hacking challenges come with an additional [Coding Challenge](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_coding_challenges) where finding and fixing the responsible code flaw can be trained 49 | * **Interoperability**: Integrate with your own training systems via 50 | [WebHook](https://pwning.owasp-juice.shop/companion-guide/latest/part4/integration.html#_challenge_solution_webhook), 51 | monitor the 52 | [extensive metrics](https://pwning.owasp-juice.shop/companion-guide/latest/part4/monitoring.html) 53 | or consume challenge information directly via 54 | [API](https://pwning.owasp-juice.shop/companion-guide/latest/part4/integration.html#_challenges_api) 55 | or 56 | [file import](https://pwning.owasp-juice.shop/companion-guide/latest/part4/integration.html#_challenge_declaration_file) 57 | 58 | ## Screenshots 59 | 60 | ![Screenshot 1](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/screenshot01.png) 61 |

62 | ![Screenshot 2](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/screenshot02.png) 63 |

64 | ![Screenshot 3](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/screenshot03.png) 65 |

66 | ![Screenshot 4](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/screenshot04.png) 67 |

68 | ![Screenshot 5](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/screenshot05.png) 69 | 70 | ## Application Architecture 71 | 72 | ![Architecture diagram](https://raw.githubusercontent.com/juice-shop/pwning-juice-shop/master/docs/modules/ROOT/assets/images/introduction/architecture-diagram.png) 73 | -------------------------------------------------------------------------------- /tab_learning.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Learning 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 4 7 | tags: juiceshop 8 | --- 9 | 10 | ## Hacking Instructor Tutorials 11 | 12 | {% assign tutorials = site.data.challenges | where_exp: "item", "item.tutorial != null" | sort: "tutorial.order" %} 13 | 14 | ![Juicy Bot](https://raw.githubusercontent.com/juice-shop/juice-shop/master/frontend/src/assets/public/images/JuicyBot_MedicalMask.png) 15 | 16 | Click on a link in the table below to launch a 17 | [step-by-step tutorial](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_hacking_instructor) 18 | for that particular challenge on our public 19 | instance. If you are entirely new to the 20 | Juice Shop, we recommend doing them in the listed order. With the 21 | (optional) 22 | [Tutorial Mode](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_tutorial_mode) 23 | you can even enforce that the {{ tutorials.size }} tutorial challenges 24 | have to be performed gradually in order to unlock the other {{ 25 | site.data.challenges.size | minus: tutorials.size }} challenges. 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {% for tutorial in tutorials %} 34 | 35 | 36 | 37 | 41 | 42 | {% endfor %} 43 | 44 | 45 | 46 | 47 | 48 |
ChallengeCategoryDifficulty
{{ tutorial.name }}{{ tutorial.category }} 38 | {% assign difficulty = tutorial.difficulty | to_integer %} 39 | {% for i in (1..difficulty) %}⭐{% endfor %} 40 |
Coding Challengesn/an/a
49 | 50 | ## Coding Challenges 51 | 52 | {% assign categories = site.data.challenges | where_exp: "item", "site.data.snippets.challenges contains item.key" | group_by:"category" | sort: "name" %} 53 | 54 | For {{ site.data.snippets.challenges.size }} challenges an additional [coding challenge](https://pwning.owasp-juice.shop/companion-guide/latest/part1/challenges.html#_coding_challenges) is available. In their "Find It" phase they teach 55 | spotting vulnerabilities in the actual codebase of the Juice Shop. In the "Fix It" phase the user then chooses the most appropriate 56 | fix from a list. Solve any of the hacking challenges below to enable a button on the Score Board that launches the corresponding 57 | coding challenge: 58 |

59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | {% for category in categories %} 67 | 68 | 69 | 70 | 71 | 72 | {% endfor %} 73 | 74 | 75 | 76 | 77 |
Category#Challenges
{{ category.name }}{{ category.items.size }}{{ category.items | group_by:"name" | sort: "name" | map: "name" | join: ", " }}
Total Σ{{ site.data.snippets.challenges.size }}
78 | 79 | ## Mitigation Links 80 | 81 | {% assign mitigations = site.data.challenges | group_by:"mitigationUrl" | sort: "name" %} 82 | 83 | For many solved challenges links to mitigation techniques are presented on the Score Board by offering a link 84 | to a corresponding [OWASP Cheat Sheet](https://cheatsheetseries.owasp.org/) explaining how to avoid that kind of vulnerability in the first place. The 85 | following cheat sheets are referred to by OWASP Juice Shop as mitigation links: 86 | 87 | 94 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: col-sidebar 3 | altfooter: true 4 | title: OWASP Juice Shop 5 | tags: juiceshop 6 | level: 4 7 | type: tool 8 | pitch: Probably the most modern and sophisticated insecure web application for security trainings, awareness demos and CTFs. Also great voluntary guinea pig for your security tools and DevSecOps pipelines! 9 | --- 10 | 11 | 12 | 13 | ![Juice Shop Logo](https://raw.githubusercontent.com/juice-shop/juice-shop/develop/frontend/src/assets/public/images/JuiceShop_Logo_100px.png) 14 | 15 | [![OWASP Flagship](https://img.shields.io/badge/owasp-flagship%20project-48A646.svg)](/projects/#div-flagships) 16 | [![GitHub release](https://img.shields.io/github/release/juice-shop/juice-shop.svg)](https://github.com/juice-shop/juice-shop/releases/latest) 17 | [![GitHub stars](https://img.shields.io/github/stars/juice-shop/juice-shop.svg?label=GitHub%20%E2%98%85&style=flat)](https://github.com/juice-shop/juice-shop/stargazers) 18 | [![Twitter Follow](https://img.shields.io/twitter/follow/owasp_juiceshop.svg?style=social&label=Follow)](https://twitter.com/owasp_juiceshop) 19 | 20 | [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/223/badge)](https://www.bestpractices.dev/projects/223) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](https://github.com/juice-shop/juice-shop/blob/master/CODE_OF_CONDUCT.md) 21 | 22 | OWASP Juice Shop is probably the most modern and sophisticated insecure 23 | web application! It can be used in security trainings, awareness demos, 24 | CTFs and as a guinea pig for security tools! Juice Shop encompasses 25 | vulnerabilities from the entire 26 | [OWASP Top Ten](/www-project-top-ten) along with many other security 27 | flaws found in real-world applications! 28 | 29 | ![Slideshow](https://raw.githubusercontent.com/juice-shop/juice-shop/master/screenshots/slideshow.gif) 30 | 31 | ## Description 32 | 33 | Juice Shop is written in Node.js, Express and Angular. It was the first 34 | application written entirely in JavaScript listed in the 35 | [OWASP VWA Directory](/www-project-vulnerable-web-applications-directory). 36 | 37 | The application contains a vast number of hacking challenges of varying 38 | difficulty where the user is supposed to exploit the underlying 39 | vulnerabilities. The hacking progress is tracked on a score board. 40 | Finding this score board is actually one of the (easy) challenges! 41 | 42 | Apart from the hacker and awareness training use case, pentesting 43 | proxies or security scanners can use Juice Shop as a "guinea 44 | pig"-application to check how well their tools cope with 45 | JavaScript-heavy application frontends and REST APIs. 46 | 47 | _Translating "dump" or "useless outfit" into German yields "Saftladen" 48 | which can be reverse-translated word by word into "juice shop". Hence 49 | the project name. That the initials "JS" match with those of 50 | "JavaScript" was purely coincidental!_ 51 | 52 | ## Testimonials 53 | 54 | > [The most trustworthy online shop out there.](https://twitter.com/dschadow/status/706781693504589824) 55 | > ( 56 | > [@dschadow](https://github.com/dschadow)) — 57 | > [The best juice shop on the whole internet!](https://twitter.com/shehackspurple/status/907335357775085568) 58 | > ( 59 | > [@shehackspurple](https://twitter.com/shehackspurple)) — 60 | > [Actually the most bug-free vulnerable application in existence!](https://youtu.be/TXAztSpYpvE?t=26m35s) 61 | > ( 62 | > [@vanderaj](https://twitter.com/vanderaj)) — 63 | > [First you 😂😂then you 😢](https://twitter.com/kramse/status/1073168529405472768) 64 | > ( 65 | > [@kramse](https://twitter.com/kramse)) — 66 | > [But this doesn't have anything to do with juice.](https://twitter.com/coderPatros/status/1199268774626488320) 67 | > ( 68 | > [@coderPatros' wife](https://twitter.com/coderPatros)) 69 | 70 | ## Contributors 71 | 72 | [![GitHub contributors](https://img.shields.io/github/contributors/juice-shop/juice-shop.svg)](https://github.com/juice-shop/juice-shop/graphs/contributors) 73 | [![Crowdin](https://d322cqt584bo4o.cloudfront.net/owasp-juice-shop/localized.svg)](https://crowdin.com/project/owasp-juice-shop) 74 | 75 | The OWASP Juice Shop has been created by 76 | [Björn Kimminich](mailto:bjoern.kimminich@owasp.org) and is developed, 77 | maintained and translated by a 78 | [team of volunteers](https://github.com/juice-shop/juice-shop/blob/master/HALL_OF_FAME.md). 79 | A 80 | [live update of the project contributors](https://github.com/juice-shop/juice-shop/graphs/contributors) 81 | is found here. 82 | 83 | ## Licensing 84 | 85 | [![license](https://img.shields.io/github/license/juice-shop/juice-shop.svg)](https://github.com/juice-shop/juice-shop/blob/master/LICENSE) 86 | 87 | This program is free software: You can redistribute it and/or modify it 88 | under the terms of the 89 | [MIT License](https://github.com/juice-shop/juice-shop/blob/master/LICENSE). 90 | OWASP Juice Shop and any contributions are Copyright © by Bjoern 91 | Kimminich & the OWASP Juice Shop contributors 2014-2025. 92 | -------------------------------------------------------------------------------- /tab_news.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: News 3 | layout: null 4 | altfooter: true 5 | tab: true 6 | order: 2 7 | tags: juiceshop 8 | --- 9 | 10 | ## Latest Releases 11 | 12 | [![GitHub release](https://img.shields.io/github/release/juice-shop/juice-shop.svg)](https://github.com/juice-shop/juice-shop/releases/latest) 13 | [![GitHub release](https://img.shields.io/github/downloads/juice-shop/juice-shop/total.svg)](https://github.com/juice-shop/juice-shop/releases/latest) 14 | [![SourceForge](https://img.shields.io/sourceforge/dm/juice-shop?label=sourceforge%20downloads)](https://sourceforge.net/projects/juice-shop/) 15 | [![SourceForge](https://img.shields.io/sourceforge/dt/juice-shop?label=sourceforge%20downloads)](https://sourceforge.net/projects/juice-shop/) 16 | [![Docker Pulls](https://img.shields.io/docker/pulls/bkimminich/juice-shop.svg)](https://hub.docker.com/r/bkimminich/juice-shop) 17 | 18 | 19 | * 2025-11-16T14:47:08Z: juice-shop [`v19.1.1`](https://github.com/juice-shop/juice-shop/releases/tag/v19.1.1) 20 | * 2025-11-16T13:50:56Z: juice-shop [`v19.1.0`](https://github.com/juice-shop/juice-shop/releases/tag/v19.1.0) 21 | * 2025-09-04T05:50:12Z: juice-shop [`v19.0.0`](https://github.com/juice-shop/juice-shop/releases/tag/v19.0.0) 22 | * 2025-06-17T05:08:00Z: juice-shop [`v18.0.0`](https://github.com/juice-shop/juice-shop/releases/tag/v18.0.0) 23 | * 2025-04-22T22:13:33Z: juice-shop [`v17.3.0`](https://github.com/juice-shop/juice-shop/releases/tag/v17.3.0) 24 | * 2025-03-14T21:04:32Z: juice-shop [`v17.2.0`](https://github.com/juice-shop/juice-shop/releases/tag/v17.2.0) 25 | * 2024-09-09T16:06:22Z: juice-shop [`v17.1.1`](https://github.com/juice-shop/juice-shop/releases/tag/v17.1.1) 26 | * 2024-08-05T15:07:20Z: juice-shop [`v17.1.0`](https://github.com/juice-shop/juice-shop/releases/tag/v17.1.0) 27 | * 2024-05-24T21:08:54Z: juice-shop [`v17.0.0`](https://github.com/juice-shop/juice-shop/releases/tag/v17.0.0) 28 | * 2024-04-22T13:36:03Z: juice-shop [`v16.0.1`](https://github.com/juice-shop/juice-shop/releases/tag/v16.0.1) 29 | * 2023-12-19T15:35:41Z: juice-shop [`v16.0.0`](https://github.com/juice-shop/juice-shop/releases/tag/v16.0.0) 30 | * 2023-11-03T20:11:03Z: juice-shop [`v15.3.0`](https://github.com/juice-shop/juice-shop/releases/tag/v15.3.0) 31 | * 2023-10-03T21:17:58Z: juice-shop [`v15.2.1`](https://github.com/juice-shop/juice-shop/releases/tag/v15.2.1) 32 | * 2023-09-22T16:37:04Z: juice-shop [`v15.2.0`](https://github.com/juice-shop/juice-shop/releases/tag/v15.2.0) 33 | * 2023-09-08T13:03:29Z: juice-shop [`v15.1.0`](https://github.com/juice-shop/juice-shop/releases/tag/v15.1.0) 34 | * 2023-05-19T23:00:51Z: juice-shop [`v15.0.0`](https://github.com/juice-shop/juice-shop/releases/tag/v15.0.0) 35 | 36 | ### CTF Extension 37 | 38 | [![GitHub release](https://img.shields.io/github/release/juice-shop/juice-shop-ctf.svg)](https://github.com/juice-shop/juice-shop-ctf/releases/latest) 39 | [![npm](https://img.shields.io/npm/dm/juice-shop-ctf-cli.svg)](https://www.npmjs.com/package/juice-shop-ctf-cli) 40 | [![npm](https://img.shields.io/npm/dt/juice-shop-ctf-cli.svg)](https://www.npmjs.com/package/juice-shop-ctf-cli) 41 | [![Docker Pulls](https://img.shields.io/docker/pulls/bkimminich/juice-shop-ctf.svg)](https://hub.docker.com/r/bkimminich/juice-shop-ctf) 42 | 43 | 44 | * 2025-09-04T06:11:47Z: juice-shop-ctf [`v12.0.0`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v12.0.0) 45 | * 2025-02-18T11:19:13Z: juice-shop-ctf [`v11.1.0`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v11.1.0) 46 | * 2024-10-25T14:30:28Z: juice-shop-ctf [`v11.0.0`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v11.0.0) 47 | * 2023-10-11T22:23:15Z: juice-shop-ctf [`v10.0.1`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v10.0.1) 48 | * 2023-09-01T10:31:42Z: juice-shop-ctf [`v10.0.0`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v10.0.0) 49 | * 2022-08-23T16:13:55Z: juice-shop-ctf [`v9.1.2`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v9.1.2) 50 | * 2022-08-03T04:31:18Z: juice-shop-ctf [`v9.1.1`](https://github.com/juice-shop/juice-shop-ctf/releases/tag/v9.1.1) 51 | 52 | ### MultiJuicer 53 | 54 | [![GitHub release](https://img.shields.io/github/release/juice-shop/multi-juicer.svg)](https://github.com/juice-shop/juice-shop-ctf/releases/latest) 55 | 56 | 57 | * 2025-11-22T17:39:28Z: multi-juicer [`v9.0.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v9.0.0) 58 | * 2025-06-17T07:57:20Z: multi-juicer [`v8.3.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.3.0) 59 | * 2025-04-30T09:15:52Z: multi-juicer [`v8.2.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.2.0) 60 | * 2025-03-15T18:57:18Z: multi-juicer [`v8.1.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.1.0) 61 | * 2025-03-05T18:29:42Z: multi-juicer [`v8.0.5`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.5) 62 | * 2025-02-27T13:10:39Z: multi-juicer [`v8.0.4`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.4) 63 | * 2025-02-25T19:43:35Z: multi-juicer [`v8.0.3`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.3) 64 | * 2025-02-07T14:54:23Z: multi-juicer [`v8.0.2`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.2) 65 | * 2025-01-07T18:42:57Z: multi-juicer [`v8.0.1`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.1) 66 | * 2024-12-28T13:51:39Z: multi-juicer [`v8.0.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v8.0.0) 67 | * 2024-10-06T00:25:23Z: multi-juicer [`v7.3.2`](https://github.com/juice-shop/multi-juicer/releases/tag/v7.3.2) 68 | * 2024-09-19T13:26:34Z: multi-juicer [`v7.3.1`](https://github.com/juice-shop/multi-juicer/releases/tag/v7.3.1) 69 | * 2024-09-10T09:40:37Z: multi-juicer [`v7.3.0`](https://github.com/juice-shop/multi-juicer/releases/tag/v7.3.0) 70 | 71 | ## Roadmap 72 | 73 | ![GitHub issues by-label](https://img.shields.io/github/issues/juice-shop/juice-shop/help%20wanted.svg) 74 | ![GitHub issues by-label](https://img.shields.io/github/issues/juice-shop/juice-shop/good%20first%20issue.svg) 75 | 76 | {% assign milestones = site.data.roadmap_milestones %} 77 | {% for milestone in milestones %} 78 | * {{ milestone }} 79 | {% endfor %} 80 | -------------------------------------------------------------------------------- /_data/challenges.yml: -------------------------------------------------------------------------------- 1 | - 2 | name: 'API-only XSS' 3 | category: 'XSS' 4 | tags: 5 | - Danger Zone 6 | description: 'Perform a persisted XSS attack with <iframe src="javascript:alert(`xss`)"> without using the frontend application at all.' 7 | difficulty: 3 8 | hints: 9 | - 'You need to work with the server-side API directly. Try different HTTP verbs on different entities exposed through the API.' 10 | - 'A matrix of known data entities and their supported HTTP verbs through the API can help you here.' 11 | - 'Careless developers might have exposed API methods that the client does not even need.' 12 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html' 13 | key: restfulXssChallenge 14 | disabledEnv: 15 | - Docker 16 | - Heroku 17 | - Gitpod 18 | - 19 | name: 'Access Log' 20 | category: 'Observability Failures' 21 | description: 'Gain access to any access log file of the server.' 22 | difficulty: 4 23 | hints: 24 | - 'Who would want a server access log to be accessible through a web application?' 25 | - 'Normally, server log files are written to disk on server side and are not accessible from the outside.' 26 | - 'Which raises the question: Who would want a server access log to be accessible through a web application?' 27 | - 'One particular file found in the folder you might already have found during the "Access a confidential document" challenge might give you an idea who is interested in such a public exposure.' 28 | - 'Drilling down one level into the file system might not be sufficient.' 29 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html' 30 | key: accessLogDisclosureChallenge 31 | - 32 | name: 'Admin Registration' 33 | category: 'Improper Input Validation' 34 | description: 'Register as a user with administrator privileges.' 35 | difficulty: 3 36 | hints: 37 | - 'You have to assign the unassignable.' 38 | - 'Register as an ordinary user to learn what API endpoints are involved in this use case.' 39 | - 'Think of the simplest possible implementations of a distinction between regular users and administrators.' 40 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Mass_Assignment_Cheat_Sheet.html' 41 | key: registerAdminChallenge 42 | - 43 | name: 'Admin Section' 44 | category: 'Broken Access Control' 45 | tags: 46 | - Good for Demos 47 | description: 'Access the administration section of the store.' 48 | difficulty: 2 49 | hints: 50 | - 'It is just slightly harder to find than the score board link.' 51 | - 'Knowing it exists, you can simply guess what URL the admin section might have.' 52 | - 'Alternatively, you can try to find a reference or clue within the parts of the application that are not usually visible in the browser.' 53 | - 'It is probably just slightly harder to find and gain access to than the score board link.' 54 | - 'There is some access control in place, but there are at least three ways to bypass it.' 55 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html' 56 | key: adminSectionChallenge 57 | tutorial: 58 | order: 8 59 | - 60 | name: 'Arbitrary File Write' 61 | category: 'Vulnerable Components' 62 | tags: 63 | - Danger Zone 64 | - Prerequisite 65 | description: 'Overwrite the Legal Information file.' 66 | difficulty: 6 67 | hints: 68 | - 'Look out for a tweet praising new functionality of the web shop. Then find a third party vulnerability associated with it.' 69 | - 'Find all places in the application where file uploads are possible.' 70 | - 'For at least one of these, the Juice Shop is depending on a library that suffers from an arbitrary file overwrite vulnerability.' 71 | - 'You can find a hint toward the underlying vulnerability in the @owasp_juiceshop Twitter timeline.' 72 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html' 73 | key: fileWriteChallenge 74 | disabledEnv: 75 | - Docker 76 | - Heroku 77 | - Gitpod 78 | - 79 | name: 'Bjoern''s Favorite Pet' 80 | category: 'Broken Authentication' 81 | tags: 82 | - OSINT 83 | description: 'Reset the password of Bjoern''s OWASP account via the Forgot Password mechanism with the original answer to his security question.' 84 | difficulty: 3 85 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html' 86 | hints: 87 | - 'Hints to the answer to Bjoern’s question can be found by looking him up on the Internet.' 88 | - 'More precisely, Bjoern might have accidentally (?) doxxed himself by mentioning his security answer on at least one occasion where a camera was running.' 89 | - 'Brute forcing the answer might be very well possible with a sufficiently extensive list of common pet names.' 90 | key: resetPasswordBjoernOwaspChallenge 91 | - 92 | name: 'Blockchain Hype' 93 | category: 'Security through Obscurity' 94 | tags: 95 | - Contraption 96 | - Code Analysis 97 | - Web3 98 | description: 'Learn about the Token Sale before its official announcement.' 99 | difficulty: 5 100 | hints: 101 | - 'The developers truly believe in "Security through Obscurity" over actual access restrictions.' 102 | - 'Guessing or brute forcing the URL of the token sale page is very unlikely to succeed.' 103 | - 'You should closely investigate the place where all paths within the application are defined.' 104 | - 'Beating the employed obfuscation mechanism manually will take some time. Maybe there is an easier way to undo it?' 105 | mitigationUrl: ~ 106 | key: tokenSaleChallenge 107 | - 108 | name: 'NFT Takeover' 109 | category: 'Sensitive Data Exposure' 110 | tags: 111 | - Contraption 112 | - Good for Demos 113 | - Web3 114 | description: 'Take over the wallet containing our official Soul Bound Token (NFT).' 115 | difficulty: 2 116 | hints: 117 | - 'Find the seed phrase posted accidentally.' 118 | mitigationUrl: ~ 119 | key: nftUnlockChallenge 120 | - 121 | name: 'Mint the Honey Pot' 122 | category: 'Improper Input Validation' 123 | tags: 124 | - Web3 125 | - Internet Traffic 126 | description: 'Mint the Honey Pot NFT by gathering BEEs from the bee haven.' 127 | difficulty: 3 128 | hints: 129 | - 'Discover NFT wonders among the captivating visual memories.' 130 | mitigationUrl: ~ 131 | key: nftMintChallenge 132 | - 133 | name: 'Wallet Depletion' 134 | category: 'Miscellaneous' 135 | tags: 136 | - Web3 137 | - Internet Traffic 138 | description: 'Withdraw more ETH from the new wallet than you deposited.' 139 | difficulty: 6 140 | hints: 141 | - 'Try to exploit the contract of the wallet.' 142 | mitigationUrl: ~ 143 | key: web3WalletChallenge 144 | - 145 | name: 'Web3 Sandbox' 146 | category: 'Broken Access Control' 147 | tags: 148 | - Web3 149 | description: 'Find an accidentally deployed code sandbox for writing smart contracts on the fly.' 150 | difficulty: 1 151 | hints: 152 | - 'It is just as easy as finding the Score Board.' 153 | mitigationUrl: ~ 154 | key: web3SandboxChallenge 155 | - 156 | name: 'Blocked RCE DoS' 157 | category: 'Insecure Deserialization' 158 | tags: 159 | - Danger Zone 160 | description: 'Perform a Remote Code Execution that would keep a less hardened application busy forever.' 161 | difficulty: 5 162 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html' 163 | hints: 164 | - 'The feature you need to exploit for this challenge is not directly advertised anywhere.' 165 | - 'As the Juice Shop is written in pure Javascript, there is one data format that is most probably used for serialization.' 166 | - 'You should try to make the server busy for all eternity.' 167 | - 'The challenge will be solved if you manage to trigger the protection of the application against a very specific DoS attack vector.' 168 | - 'Similar to the "Let the server sleep for some time" challenge (which accepted nothing but NoSQL Injection as a solution) this challenge will only accept proper RCE as a solution. It cannot be solved by simply hammering the server with requests. That would probably just kill your server instance.' 169 | key: rceChallenge 170 | disabledEnv: 171 | - Docker 172 | - Heroku 173 | - Gitpod 174 | - 175 | name: 'CAPTCHA Bypass' 176 | category: 'Broken Anti Automation' 177 | tags: 178 | - Brute Force 179 | description: 'Submit 10 or more customer feedbacks within 20 seconds.' 180 | difficulty: 3 181 | hints: 182 | - 'After finding a CAPTCHA bypass, write a script that automates feedback submission. Or open many browser tabs and be really quick.' 183 | - 'You could prepare 10 browser tabs, solving every CAPTCHA and filling out the each feedback form. Then you’d need to very quickly switch through the tabs and submit the forms in under 20 seconds total.' 184 | - 'Should the Juice Shop ever decide to change the challenge into "Submit 100 or more customer feedbacks within 60 seconds" or worse, you’d probably have a hard time keeping up with any tab-switching approach.' 185 | - 'Investigate closely how the CAPTCHA mechanism works and try to find either a bypass or some automated way of solving it dynamically.' 186 | - 'Wrap this into a script (in whatever programming language you prefer) that repeats this 10 times.' 187 | mitigationUrl: ~ 188 | key: captchaBypassChallenge 189 | - 190 | name: 'Change Bender''s Password' 191 | category: 'Broken Authentication' 192 | description: 'Change Bender''s password into slurmCl4ssic without using SQL Injection or Forgot Password.' 193 | difficulty: 5 194 | hints: 195 | - 'In previous releases this challenge was wrongly accused of being based on CSRF.' 196 | - 'It might also have been put into the Improper Input Validation category.' 197 | - 'Bender’s current password is so strong that brute force, rainbow table or guessing attacks will probably not work.' 198 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html' 199 | key: changePasswordBenderChallenge 200 | - 201 | name: 'Christmas Special' 202 | category: 'Injection' 203 | description: 'Order the Christmas special offer of 2014.' 204 | difficulty: 4 205 | hints: 206 | - 'Find out how the application handles unavailable products and try to find a loophole.' 207 | - 'Find out how the application hides deleted products from its customers.' 208 | - 'Try to craft an attack string that makes deleted products visible again.' 209 | - 'You need to get the deleted product into your shopping cart and trigger the Checkout.' 210 | - 'Neither of the above can be achieved through the application frontend and it might even require (half-)Blind SQL Injection.' 211 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 212 | key: christmasSpecialChallenge 213 | - 214 | name: 'CSP Bypass' 215 | category: 'XSS' 216 | tags: 217 | - Danger Zone 218 | description: 'Bypass the Content Security Policy and perform an XSS attack with <script>alert(`xss`)</script> on a legacy page within the application.' 219 | difficulty: 4 220 | hints: 221 | - 'What is even "better" than a legacy page with a homegrown RegEx sanitizer? Having CSP injection issues on the exact same page as well!' 222 | - 'Find a screen in the application that looks subtly odd and dated compared with all other screens.' 223 | - 'Before trying any XSS attacks, you should understand how the page is setting its Content Security Policy.' 224 | - 'For the subsequent XSS, make good use of the flaws in the homegrown sanitization based on a RegEx!' 225 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html' 226 | key: usernameXssChallenge 227 | disabledEnv: 228 | - Docker 229 | - Heroku 230 | - Gitpod 231 | - 232 | name: 'Client-side XSS Protection' 233 | category: 'XSS' 234 | tags: 235 | - Danger Zone 236 | description: 'Perform a persisted XSS attack with <iframe src="javascript:alert(`xss`)"> bypassing a client-side security mechanism.' 237 | difficulty: 3 238 | hints: 239 | - 'There are only some input fields in the Juice Shop forms that validate their input.' 240 | - 'Even less of these fields are persisted in a way where their content is shown on another screen.' 241 | - 'Bypassing client-side security can typically be done by either disabling it on the client (i.e. in the browser by manipulating the DOM tree) or by ignoring it completely and interacting with the backend instead.' 242 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html' 243 | key: persistedXssUserChallenge 244 | disabledEnv: 245 | - Docker 246 | - Heroku 247 | - Gitpod 248 | - 249 | name: 'Confidential Document' 250 | category: 'Sensitive Data Exposure' 251 | tags: 252 | - Good for Demos 253 | description: 'Access a confidential document.' 254 | difficulty: 1 255 | hints: 256 | - 'Analyze and tamper with links in the application that deliver a file directly.' 257 | - 'The file you are looking for is not protected in any way. Once you found it you can also access it.' 258 | mitigationUrl: ~ 259 | key: directoryListingChallenge 260 | - 261 | name: 'DOM XSS' 262 | category: 'XSS' 263 | tags: 264 | - Tutorial 265 | - Good for Demos 266 | description: 'Perform a DOM XSS attack with <iframe src="javascript:alert(`xss`)">.' 267 | difficulty: 1 268 | hints: 269 | - 'Look for an input field where its content appears in the HTML when its form is submitted.' 270 | - 'This challenge is almost indistinguishable from "Perform a reflected XSS attack" if you do not look "under the hood" to find out what the application actually does with the user input.' 271 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html' 272 | key: localXssChallenge 273 | tutorial: 274 | order: 2 275 | - 276 | name: 'Database Schema' 277 | category: 'Injection' 278 | description: 'Exfiltrate the entire DB schema definition via SQL Injection.' 279 | difficulty: 3 280 | hints: 281 | - 'Find out where this information could come from. Then craft an attack string against an endpoint that offers an unnecessary way to filter data.' 282 | - 'Find out which database system is in use and where it would usually store its schema definitions.' 283 | - 'Craft a UNION SELECT attack string to join the relevant data from any such identified system table into the original result.' 284 | - 'You might have to tackle some query syntax issues step-by-step, basically hopping from one error to the next.' 285 | - 'As with "Order the Christmas special offer of 2014" this cannot be achieved through the application frontend.' 286 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 287 | key: dbSchemaChallenge 288 | - 289 | name: 'Deprecated Interface' 290 | category: 'Security Misconfiguration' 291 | tags: 292 | - Contraption 293 | - Prerequisite 294 | description: 'Use a deprecated B2B interface that was not properly shut down.' 295 | difficulty: 2 296 | hints: 297 | - 'The developers who disabled the interface think they could go invisible by just closing their eyes.' 298 | - 'The old B2B interface was replaced with a more modern version recently.' 299 | - 'When deprecating the old interface, not all of its parts were cleanly removed from the code base.' 300 | - 'Simply using the deprecated interface suffices to solve this challenge. No attack or exploit is necessary.' 301 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Web_Service_Security_Cheat_Sheet.html' 302 | key: deprecatedInterfaceChallenge 303 | - 304 | name: 'Easter Egg' 305 | category: 'Broken Access Control' 306 | tags: 307 | - Shenanigans 308 | - Contraption 309 | - Good for Demos 310 | description: 'Find the hidden easter egg.' 311 | difficulty: 4 312 | hints: 313 | - 'If you solved one of the four file access challenges, you already know where to find the easter egg.' 314 | - 'Simply reuse the trick that already worked for the files above.' 315 | mitigationUrl: ~ 316 | key: easterEggLevelOneChallenge 317 | - 318 | name: 'Email Leak' 319 | category: 'Sensitive Data Exposure' 320 | description: 'Perform an unwanted information disclosure by accessing data cross-domain.' 321 | difficulty: 5 322 | hints: 323 | - 'Try to find and attack an endpoint that responds with user information. SQL Injection is not the solution here.' 324 | - 'What ways are there to access data from a web application cross-domain?' 325 | - 'This challenge uses an old way which is no longer recommended.' 326 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/XS_Leaks_Cheat_Sheet.html' 327 | key: emailLeakChallenge 328 | - 329 | name: 'Empty User Registration' 330 | category: 'Improper Input Validation' 331 | description: 'Register a user with an empty email and password.' 332 | difficulty: 2 333 | hints: 334 | - 'Consider intercepting and playing with the request payload.' 335 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html' 336 | key: emptyUserRegistration 337 | - 338 | name: 'Ephemeral Accountant' 339 | category: 'Injection' 340 | description: 'Log in with the (non-existing) accountant acc0unt4nt@juice-sh.op without ever registering that user.' 341 | difficulty: 4 342 | hints: 343 | - 'Try to create the needed user "out of thin air".' 344 | - 'The user literally needs to be ephemeral as in "lasting for only a short time".' 345 | - 'Registering normally with the user’s email address will then obviously not solve this challenge. The Juice Shop will not even let you register as acc0unt4nt@juice-sh.op, as this would make the challenge unsolvable for you.' 346 | - 'Getting the user into the database some other way will also fail to solve this challenge. In case you somehow managed to do so, you need to restart the Juice Shop application in order to wipe the database and make the challenge solvable again.' 347 | - 'The fact that this challenge is in the Injection category should already give away the intended approach.' 348 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 349 | key: ephemeralAccountantChallenge 350 | - 351 | name: 'Error Handling' 352 | category: 'Security Misconfiguration' 353 | tags: 354 | - Prerequisite 355 | description: 'Provoke an error that is neither very gracefully nor consistently handled.' 356 | difficulty: 1 357 | hints: 358 | - 'Try to submit bad input to forms. Alternatively tamper with URL paths or parameters.' 359 | - 'This challenge actually triggers from various possible error conditions.' 360 | - 'You can try to submit bad input to forms to provoke an improper error handling.' 361 | - 'Tampering with URL paths or parameters might also trigger an unforeseen error.' 362 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html' 363 | key: errorHandlingChallenge 364 | - 365 | name: 'Expired Coupon' 366 | category: 'Improper Input Validation' 367 | description: 'Successfully redeem an expired campaign coupon code.' 368 | difficulty: 4 369 | hints: 370 | - 'Try to identify past special event or holiday campaigns of the shop first.' 371 | - 'Look for clues about the past campaign or holiday event somewhere in the application.' 372 | - 'Solving this challenge does not require actual time traveling.' 373 | mitigationUrl: ~ 374 | key: manipulateClockChallenge 375 | - 376 | name: 'Extra Language' 377 | category: 'Broken Anti Automation' 378 | tags: 379 | - Brute Force 380 | description: 'First you should find out how the languages are technically changed in the user interface.' 381 | difficulty: 5 382 | hints: 383 | - 'First you should find out how the languages are technically changed in the user interface.' 384 | - 'Guessing will most definitely not work in this challenge.' 385 | - 'Brute force is not the only option for this challenge, but a perfectly viable one.' 386 | - 'Investigate online what languages are actually available.' 387 | mitigationUrl: ~ 388 | key: extraLanguageChallenge 389 | - 390 | name: 'Five-Star Feedback' 391 | category: 'Broken Access Control' 392 | description: 'Get rid of all 5-star customer feedback.' 393 | difficulty: 2 394 | hints: 395 | - 'Once you found admin section of the application, this challenge is almost trivial.' 396 | - 'Nothing happens when you try to delete feedback entries? Check the JavaScript console for errors!' 397 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html' 398 | key: feedbackChallenge 399 | - 400 | name: 'Forged Coupon' 401 | category: 'Cryptographic Issues' 402 | tags: 403 | - Good for Demos 404 | - Code Analysis 405 | description: 'Forge a coupon code that gives you a discount of at least 80%.' 406 | difficulty: 6 407 | hints: 408 | - 'Try either a) a knowledgeable brute force attack or b) reverse engineering or c) some research in the cloud.' 409 | - 'One viable solution would be to reverse-engineer how coupon codes are generated and craft your own 80% coupon by using the same (or at least similar) implementation.' 410 | - 'Another possible solution might be harvesting as many previous coupon as possible and look for patterns that might give you a leverage for a brute force attack.' 411 | - 'If all else fails, you could still try to blindly brute force the coupon code field before checkout.' 412 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html' 413 | key: forgedCouponChallenge 414 | - 415 | name: 'Forged Feedback' 416 | category: 'Broken Access Control' 417 | tags: 418 | - Tutorial 419 | description: "Post some feedback in another user's name." 420 | difficulty: 3 421 | hints: 422 | - 'You can solve this by tampering with the user interface or by intercepting the communication with the RESTful backend.' 423 | - 'To find the client-side leverage point, closely analyze the HTML form used for feedback submission.' 424 | - 'The backend-side leverage point is similar to some of the XSS challenges found in OWASP Juice Shop.' 425 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html' 426 | key: forgedFeedbackChallenge 427 | tutorial: 428 | order: 11 429 | - 430 | name: 'Forged Review' 431 | category: 'Broken Access Control' 432 | description: 'Post a product review as another user or edit any user''s existing review.' 433 | difficulty: 3 434 | hints: 435 | - 'Observe the flow of product review posting and editing and see if you can exploit it.' 436 | - 'This challenge can be solved by using developers tool of your browser or with tools like postman.' 437 | - 'Analyze the form used for review submission and try to find a leverage point.' 438 | - 'This challenge is pretty similar to "Post some feedback in another user’s name" challenge.' 439 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html' 440 | key: forgedReviewChallenge 441 | - 442 | name: 'Forged Signed JWT' 443 | category: 'Vulnerable Components' 444 | description: 'Forge an almost properly RSA-signed JWT token that impersonates the (non-existing) user rsa_lord@juice-sh.op.' 445 | difficulty: 6 446 | hints: 447 | - 'This challenge is explicitly not about acquiring the RSA private key used for JWT signing.' 448 | - 'The three generic hints from Forge an essentially unsigned JWT token also help with this challenge.' 449 | - 'Instead of enforcing no encryption to be applied, try to apply a more sophisticated exploit against the JWT libraries used in the Juice Shop.' 450 | - 'Getting your hands on the public RSA key the application employs for its JWTs is mandatory for this challenge.' 451 | - 'Finding the corresponding private key should actually be impossible, but that obviously doesn’t make this challenge unsolvable.' 452 | - 'Make sure your JWT is URL safe!' 453 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html' 454 | key: jwtForgedChallenge 455 | disabledEnv: 456 | - Windows 457 | - 458 | name: 'Forgotten Developer Backup' 459 | category: 'Sensitive Data Exposure' 460 | tags: 461 | - Contraption 462 | - Good for Demos 463 | - Prerequisite 464 | description: 'Access a developer''s forgotten backup file.' 465 | difficulty: 4 466 | hints: 467 | - 'You need to trick a security mechanism into thinking that the file you want has a valid file type.' 468 | - 'Analyze and tamper with links in the application that deliver a file directly.' 469 | - 'The file is not directly accessible because a security mechanism prevents access to it.' 470 | - 'You need to trick the security mechanism into thinking that the file has a valid file type.' 471 | - 'For this challenge there is only one approach to pull this trick.' 472 | mitigationUrl: ~ 473 | key: forgottenDevBackupChallenge 474 | - 475 | name: 'Forgotten Sales Backup' 476 | category: 'Sensitive Data Exposure' 477 | tags: 478 | - Contraption 479 | description: 'Access a salesman''s forgotten backup file.' 480 | difficulty: 4 481 | hints: 482 | - 'You need to trick a security mechanism into thinking that the file you want has a valid file type.' 483 | - 'Analyze and tamper with links in the application that deliver a file directly.' 484 | - 'The file is not directly accessible because a security mechanism prevents access to it.' 485 | - 'You need to trick the security mechanism into thinking that the file has a valid file type.' 486 | mitigationUrl: ~ 487 | key: forgottenBackupChallenge 488 | - 489 | name: 'Frontend Typosquatting' 490 | category: 'Vulnerable Components' 491 | description: 'Inform the shop about a typosquatting imposter that dug itself deep into the frontend. (Mention the exact name of the culprit)' 492 | difficulty: 5 493 | hints: 494 | - 'This challenge has nothing to do with mistyping web domains. There is no conveniently misplaced file helping you with this one either. Or is there?' 495 | - 'This challenge has nothing to do with URLs or domains.' 496 | - 'Other than for its legacy companion, combing through the package.json.bak does not help for this challenge.' 497 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html' 498 | key: typosquattingAngularChallenge 499 | - 500 | name: 'GDPR Data Erasure' 501 | category: 'Broken Authentication' 502 | description: 'Log in with Chris'' erased user account.' 503 | difficulty: 3 504 | hints: 505 | - 'Turns out that something is technically and legally wrong with the implementation of the "right to be forgotten" for users.' 506 | - 'Trying out the Request Data Erasure functionality might be interesting, but cannot help you solve this challenge in real time.' 507 | - 'If you have solved the challenge Retrieve a list of all user credentials via SQL Injection you might have already retrieved some information about how the Juice Shop "deletes" users upon their request.' 508 | - 'What the Juice Shop does here is totally incompliant with GDPR. Luckily a 4% fine on a gross income of 0$ is still 0$.' 509 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/User_Privacy_Protection_Cheat_Sheet.html' 510 | key: ghostLoginChallenge 511 | - 512 | name: 'GDPR Data Theft' 513 | category: 'Sensitive Data Exposure' 514 | description: 'Steal someone else''s personal data without using Injection.' 515 | difficulty: 4 516 | hints: 517 | - 'Trick the regular Data Export to give you more than actually belongs to you.' 518 | - 'You should not try to steal data from a "vanilla" user who never even ordered something at the shop.' 519 | - 'As everything about this data export functionality happens on the server-side, it won’t be possible to just tamper with some HTTP requests to solve this challenge.' 520 | - 'Inspecting various server responses which contain user-specific data might give you a clue about the mistake the developers made.' 521 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/User_Privacy_Protection_Cheat_Sheet.html' 522 | key: dataExportChallenge 523 | - 524 | name: 'HTTP-Header XSS' 525 | category: 'XSS' 526 | tags: 527 | - Danger Zone 528 | description: 'Perform a persisted XSS attack with <iframe src="javascript:alert(`xss`)"> through an HTTP header.' 529 | difficulty: 4 530 | hints: 531 | - 'Finding a piece of displayed information that could originate from an HTTP header is part of this challenge.' 532 | - 'You might have to look into less common or even proprietary HTTP headers to find the leverage point.' 533 | - 'Adding insult to injury, the HTTP header you need will never be sent by the application on its own.' 534 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html' 535 | key: httpHeaderXssChallenge 536 | disabledEnv: 537 | - Docker 538 | - Heroku 539 | - Gitpod 540 | - 541 | name: 'Imaginary Challenge' 542 | category: 'Cryptographic Issues' 543 | tags: 544 | - Shenanigans 545 | - Code Analysis 546 | description: 'Solve challenge #999. Unfortunately, this challenge does not exist.' 547 | difficulty: 6 548 | hints: 549 | - 'You need to trick the hacking progress persistence feature into thinking you solved challenge #999.' 550 | - 'Find out how saving and restoring progress is done behind the scenes.' 551 | - 'Deduce from all available information (e.g. the package.json.bak) how the application encrypts and decrypts your hacking progress.' 552 | - 'Other than the user’s passwords, the hacking progress involves an additional secret during its encryption.' 553 | - 'What would be a really stupid mistake a developer might make when choosing such a secret?' 554 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html' 555 | key: continueCodeChallenge 556 | - 557 | name: 'Leaked Access Logs' 558 | category: 'Observability Failures' 559 | tags: 560 | - OSINT 561 | description: 'Dumpster dive the Internet for a leaked password and log in to the original user account it belongs to. (Creating a new account with the same password does not qualify as a solution.)' 562 | difficulty: 5 563 | hints: 564 | - 'As the challenge name implies, your task is to find some leaked access logs which happen to have a fairly common format.' 565 | - 'A very popular help platform for developers might contain breadcrumbs towards solving this challenge.' 566 | - 'The actual log file was copied & paste onto a platform often used to share data quickly with externals or even just internal peers.' 567 | - 'Once you found and harvested the important piece of information from the log, you could employ a technique called Password Spraying to solve this challenge.' 568 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Credential_Stuffing_Prevention_Cheat_Sheet.html' 569 | key: dlpPasswordSprayingChallenge 570 | - 571 | name: 'Leaked Unsafe Product' 572 | category: 'Sensitive Data Exposure' 573 | tags: 574 | - Shenanigans 575 | - OSINT 576 | description: 'Identify an unsafe product that was removed from the shop and inform the shop which ingredients are dangerous.' 577 | difficulty: 4 578 | hints: 579 | - 'Your own SQLi and someone else''s Ctrl-V will be your accomplices in this challenge!' 580 | - 'You must first identify the "unsafe product" which ist not available any more in the shop.' 581 | - 'Solving the "Order the Christmas special offer of 2014" challenge might give it to you as by-catch.' 582 | - 'The actual data you need to solve this challenge was leaked on the same platform that was involved in the "Dumpster dive the Internet for a leaked password and log in to the original user account it belongs to" challenge.' 583 | - 'Google is a particularly good accomplice in this challenge.' 584 | mitigationUrl: ~ 585 | key: dlpPastebinDataLeakChallenge 586 | - 587 | name: 'Legacy Typosquatting' 588 | category: 'Vulnerable Components' 589 | description: 'Inform the shop about a typosquatting trick it has been a victim of at least in v6.2.0-SNAPSHOT. (Mention the exact name of the culprit)' 590 | difficulty: 4 591 | hints: 592 | - 'This challenge has nothing to do with mistyping web domains. Investigate the forgotten developer''s backup file instead.' 593 | - 'Investigating the forgotten developer’s backup file might bring some insight.' 594 | - '"Malicious packages in npm" is a worthwhile read on Ivan Akulov’s blog.' 595 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html' 596 | key: typosquattingNpmChallenge 597 | - 598 | name: 'Login Admin' 599 | category: 'Injection' 600 | tags: 601 | - Tutorial 602 | - Good for Demos 603 | description: 'Log in with the administrator''s user account.' 604 | difficulty: 2 605 | hints: 606 | - 'The challenge description probably gave away what form you should attack.' 607 | - 'If you happen to know the email address of the admin already, you can launch a targeted attack.' 608 | - 'You might be lucky with a dedicated attack pattern even if you have no clue about the admin email address.' 609 | - 'If you harvested the admin’s password hash, you can of course try to attack that instead of using SQL Injection.' 610 | - 'Alternatively you can solve this challenge as a combo with the Log in with the administrator’s user credentials without previously changing them or applying SQL Injection challenge.' 611 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 612 | key: loginAdminChallenge 613 | tutorial: 614 | order: 7 615 | - 616 | name: 'Login Amy' 617 | category: 'Sensitive Data Exposure' 618 | tags: 619 | - OSINT 620 | description: 'Log in with Amy''s original user credentials. (This could take 93.83 billion trillion trillion centuries to brute force, but luckily she did not read the "One Important Final Note")' 621 | difficulty: 3 622 | hints: 623 | - 'This challenge will make you go after a needle in a haystack.' 624 | - 'As with so many other characters from Futurama this challenge is of course about logging in as Amy from that show.' 625 | - 'Did you know that Amy is married to an alien named Kif?' 626 | - 'The challenge description contains a few sentences which give away some information how Amy decided to strengthen her password.' 627 | - 'Obviously, Amy - being a little dimwitted - did not put nearly enough effort and creativity into the password selection process.' 628 | mitigationUrl: ~ 629 | key: loginAmyChallenge 630 | - 631 | name: 'Login Bender' 632 | category: 'Injection' 633 | tags: 634 | - Tutorial 635 | description: 'Log in with Bender''s user account.' 636 | difficulty: 3 637 | hints: 638 | - 'The challenge description probably gave away what form you should attack.' 639 | - 'You need to know (or smart-guess) Bender’s email address so you can launch a targeted attack.' 640 | - 'Bender''s password hash might not help you very much.' 641 | - 'In case you try some other approach than SQL Injection, you will notice that Bender’s password hash is not very useful.' 642 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 643 | key: loginBenderChallenge 644 | tutorial: 645 | order: 13 646 | - 647 | name: 'Login Bjoern' 648 | category: 'Broken Authentication' 649 | tags: 650 | - Code Analysis 651 | description: 'Log in with Bjoern''s Gmail account without previously changing his password, applying SQL Injection, or hacking his Google account.' 652 | difficulty: 4 653 | hints: 654 | - 'The security flaw behind this challenge is 100% OWASP Juice Shop''s fault and 0% Google''s.' 655 | - 'One way to light up this challenge in green on the score board, is to be Bjoern Kimminich. In that case, just log in with your Google account to automatically solve this challenge! Congratulations!' 656 | - 'Most likely you are not Bjoern Kimminich, so instead you might want to take detailed look into how the OAuth login with Google is implemented.' 657 | - 'It could bring you some insight to register with your own Google account and analyze closely what happens behind the scenes.' 658 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html' 659 | key: oauthUserPasswordChallenge 660 | - 661 | name: 'Login Jim' 662 | category: 'Injection' 663 | tags: 664 | - Tutorial 665 | description: 'Log in with Jim''s user account.' 666 | difficulty: 3 667 | hints: 668 | - 'The challenge description probably gave away what form you should attack.' 669 | - 'You need to know (or smart-guess) Jim’s email address so you can launch a targeted attack.' 670 | - 'If you harvested Jim’s password hash, you can try to attack that instead of using SQL Injection.' 671 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html' 672 | key: loginJimChallenge 673 | tutorial: 674 | order: 12 675 | - 676 | name: 'Login MC SafeSearch' 677 | category: 'Sensitive Data Exposure' 678 | tags: 679 | - Shenanigans 680 | - OSINT 681 | description: 'Log in with MC SafeSearch''s original user credentials without applying SQL Injection or any other bypass.' 682 | difficulty: 2 683 | hints: 684 | - 'MC SafeSearch is a rapper who produced the song "Protect Ya'' Passwordz" which explains password & sensitive data protection very nicely.' 685 | - 'After watching the music video of this song, you should agree that even ⭐⭐ is a slightly exaggerated difficulty rating for this challenge.' 686 | mitigationUrl: ~ 687 | key: loginRapperChallenge 688 | - 689 | name: 'Login Support Team' 690 | category: 'Security Misconfiguration' 691 | tags: 692 | - Brute Force 693 | - Code Analysis 694 | description: 'Log in with the support team''s original user credentials without applying SQL Injection or any other bypass.' 695 | difficulty: 6 696 | hints: 697 | - 'The underlying flaw of this challenge is a lot more human error than technical weakness.' 698 | - 'The support team is located in a low-cost country and the team structure fluctuates a lot due to people leaving for jobs with even just slightly better wages.' 699 | - 'To prevent abuse the password for the support team account itself is actually very strong.' 700 | - 'To allow easy access during an incident, the support team utilizes a 3rd party tool which every support engineer can access to get the current account password from.' 701 | - 'While it is also possible to use SQL Injection to log in as the support team, this will not solve the challenge.' 702 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html' 703 | key: loginSupportChallenge 704 | - 705 | name: 'Manipulate Basket' 706 | category: 'Broken Access Control' 707 | description: 'Put an additional product into another user''s shopping basket.' 708 | difficulty: 3 709 | hints: 710 | - 'Have an eye on the HTTP traffic while placing products in the shopping basket.' 711 | - 'Adding more instances of the same product to someone else’s basket does not qualify as a solution. The same goes for stealing from someone else’s basket.' 712 | - 'This challenge requires a bit more sophisticated tampering than others of the same ilk.' 713 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html' 714 | key: basketManipulateChallenge 715 | - 716 | name: 'Misplaced Signature File' 717 | category: 'Observability Failures' 718 | tags: 719 | - Good Practice 720 | - Contraption 721 | description: 'Access a misplaced SIEM signature file.' 722 | difficulty: 4 723 | hints: 724 | - 'You need to trick a security mechanism into thinking that the file you want has a valid file type.' 725 | - 'If you solved one of the other four file access challenges, you already know where the SIEM signature file is located.' 726 | - 'Simply reuse the trick that already worked for the files above.' 727 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html' 728 | key: misplacedSignatureFileChallenge 729 | - 730 | name: 'Multiple Likes' 731 | category: 'Broken Anti Automation' 732 | description: 'Like any review at least three times as the same user.' 733 | difficulty: 6 734 | hints: 735 | - 'Punctuality is the politeness of kings.' 736 | - 'Every user is (almost) immediately associated with the review they "liked" to prevent abuse of that functionality.' 737 | - 'Did you really think clicking the "like" button three times in a row really fast would be enough to solve a ⭐⭐⭐⭐⭐⭐ challenge?' 738 | - 'The underlying flaw of this challenge is a Race Condition.' 739 | mitigationUrl: ~ 740 | key: timingAttackChallenge 741 | - 742 | name: 'Nested Easter Egg' 743 | category: 'Cryptographic Issues' 744 | tags: 745 | - Shenanigans 746 | - Good for Demos 747 | description: 'Apply some advanced cryptanalysis to find the real easter egg.' 748 | difficulty: 4 749 | hints: 750 | - 'You might have to peel through several layers of tough-as-nails encryption for this challenge.' 751 | - 'Make sure you solve Find the hidden easter egg first.' 752 | - 'You might have to peel through several layers of tough-as-nails encryption for this challenge.' 753 | mitigationUrl: ~ 754 | key: easterEggLevelTwoChallenge 755 | - 756 | name: 'NoSQL DoS' 757 | category: 'Injection' 758 | tags: 759 | - Danger Zone 760 | description: 'Let the server sleep for some time. (It has done more than enough hard work for you)' 761 | difficulty: 4 762 | hints: 763 | - 'This challenge is essentially a stripped-down Denial of Service (DoS) attack.' 764 | - 'As stated in the Architecture overview, OWASP Juice Shop uses a MongoDB derivate as its NoSQL database.' 765 | - 'The categorization into the NoSQL Injection category totally gives away the expected attack vector for this challenge. Trying any others will not solve the challenge, even if they might yield the same result.' 766 | - 'In particular, flooding the application with requests will not solve this challenge. That would probably just kill your server instance.' 767 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html' 768 | key: noSqlCommandChallenge 769 | disabledEnv: 770 | - Docker 771 | - Heroku 772 | - Gitpod 773 | - 774 | name: 'NoSQL Exfiltration' 775 | category: 'Injection' 776 | tags: 777 | - Danger Zone 778 | description: 'All your orders are belong to us! Even the ones which don''t.' 779 | difficulty: 5 780 | hints: 781 | - 'Take a close look on how the $where query operator works in MongoDB.' 782 | - 'This challenge requires a classic Injection attack.' 783 | - 'Find an API endpoint with the intent of delivering a single order to the user and work with that.' 784 | - 'Reading up on how MongoDB queries work is really helpful here.' 785 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html' 786 | key: noSqlOrdersChallenge 787 | disabledEnv: 788 | - Docker 789 | - Heroku 790 | - Gitpod 791 | - 792 | name: 'NoSQL Manipulation' 793 | category: 'Injection' 794 | description: 'Update multiple product reviews at the same time.' 795 | difficulty: 4 796 | hints: 797 | - 'Take a close look on how the equivalent of UPDATE-statements in MongoDB work.' 798 | - 'This challenge requires another classic Injection attack.' 799 | - 'It is also worth looking into how Query Operators work in MongoDB.' 800 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html' 801 | key: noSqlReviewsChallenge 802 | - 803 | name: 'Outdated Allowlist' 804 | category: 'Unvalidated Redirects' 805 | tags: 806 | - Code Analysis 807 | description: 'Let us redirect you to one of our crypto currency addresses which are not promoted any longer.' 808 | difficulty: 1 809 | hints: 810 | - 'When removing references to those addresses from the code the developers have been a bit sloppy.' 811 | - 'More particular, they have been sloppy in a way that even the Angular Compiler was not able to clean up after them automatically.' 812 | - 'It is of course not sufficient to just visit any of the crypto currency links directly to solve the challenge.' 813 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html' 814 | key: redirectCryptoCurrencyChallenge 815 | - 816 | name: 'Password Strength' 817 | category: 'Broken Authentication' 818 | tags: 819 | - Brute Force 820 | - Tutorial 821 | description: 'Log in with the administrator''s user credentials without previously changing them or applying SQL Injection.' 822 | difficulty: 2 823 | hints: 824 | - 'This challenge can be solved with three different approaches.' 825 | - 'Guessing might work just fine.' 826 | - 'If you harvested the admin’s password hash, you can try to attack that.' 827 | - 'In case you use some hacker tool, you can also go for a brute force attack using a generic password list.' 828 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html' 829 | key: weakPasswordChallenge 830 | tutorial: 831 | order: 9 832 | - 833 | name: 'Payback Time' 834 | category: 'Improper Input Validation' 835 | description: 'Place an order that makes you rich.' 836 | difficulty: 3 837 | hints: 838 | - 'You literally need to make the shop owe you any amount of money.' 839 | - 'Investigate the shopping basket closely to understand how it prevents you from creating orders that would fulfil the challenge.' 840 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html' 841 | key: negativeOrderChallenge 842 | - 843 | name: 'Premium Paywall' 844 | category: 'Cryptographic Issues' 845 | tags: 846 | - Shenanigans 847 | description: ' Unlock Premium Challenge to access exclusive content.' 848 | difficulty: 6 849 | hints: 850 | - 'You do not have to pay anything to unlock this challenge! Nonetheless, donations are very much appreciated.' 851 | - 'There is no inappropriate, self-written or misconfigured cryptographic library to be exploited here.' 852 | - 'How much protection does a sturdy top-quality door lock add to your house if you put the key under the door mat? Or hide the key in the nearby plant pot? Or tape the key to the underside of the mailbox?' 853 | - 'Once more: You do not have to pay anything to unlock this challenge!' 854 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html' 855 | key: premiumPaywallChallenge 856 | - 857 | name: 'Privacy Policy' 858 | category: 'Miscellaneous' 859 | tags: 860 | - Good Practice 861 | - Tutorial 862 | - Good for Demos 863 | description: 'Read our privacy policy.' 864 | difficulty: 1 865 | hints: 866 | - 'We won''t even ask you to confirm that you did. Just read it. Please. Pretty please.' 867 | - 'When you work with the application you will most likely solve this challenge in the process.' 868 | - 'Any automated crawling or spidering tool you use might solve this challenge for you.' 869 | - 'There is no real hacking involved here.' 870 | mitigationUrl: ~ 871 | key: privacyPolicyChallenge 872 | tutorial: 873 | order: 4 874 | - 875 | name: 'Privacy Policy Inspection' 876 | category: 'Security through Obscurity' 877 | tags: 878 | - Shenanigans 879 | - Good for Demos 880 | description: 'Prove that you actually read our privacy policy.' 881 | difficulty: 3 882 | hints: 883 | - 'Only by visiting a special URL you can confirm that you read it carefully.' 884 | - 'First you should obviously solve the "Read our privacy policy" challenge.' 885 | - 'It is fine to use the mouse cursor to not lose sight of the paragraph you are currently reading.' 886 | - 'If you find some particularly hot sections in the policy you might want to melt them together similar to what you might have already uncovered in Apply some advanced cryptanalysis to find the real easter egg.' 887 | mitigationUrl: ~ 888 | key: privacyPolicyProofChallenge 889 | - 890 | name: 'Product Tampering' 891 | category: 'Broken Access Control' 892 | description: 'Change the href of the link within the OWASP SSL Advanced Forensic Tool (O-Saft) product description into https://owasp.slack.com.' 893 | difficulty: 3 894 | hints: 895 | - 'Theoretically there are three possible ways to beat this challenge: a) broken admin functionality, b) holes in RESTful API or c) possibility for SQL Injection.' 896 | - 'In practice two of these three ways should turn out to be dead ends.' 897 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html' 898 | key: changeProductChallenge 899 | - 900 | name: 'Reflected XSS' 901 | category: 'XSS' 902 | tags: 903 | - Tutorial 904 | - Danger Zone 905 | - Good for Demos 906 | description: 'Perform a reflected XSS attack with <iframe src="javascript:alert(`xss`)">.' 907 | difficulty: 2 908 | hints: 909 | - 'Look for a url parameter where its value appears in the page it is leading to.' 910 | - 'Try probing for XSS vulnerabilities by submitting text wrapped in an HTML tag which is easy to spot on screen, e.g.

or .' 911 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html' 912 | key: reflectedXssChallenge 913 | tutorial: 914 | order: 5 915 | disabledEnv: 916 | - Docker 917 | - Heroku 918 | - Gitpod 919 | - 920 | name: 'Repetitive Registration' 921 | category: 'Improper Input Validation' 922 | description: 'Follow the DRY principle while registering a user.' 923 | difficulty: 1 924 | hints: 925 | - 'You can solve this by cleverly interacting with the UI or bypassing it altogether.' 926 | - 'The obvious repetition in the User Registration form is the Repeat Password field.' 927 | - 'Try to register with either an empty or different value in Repeat Password.' 928 | - 'You can solve this challenge by cleverly interacting with the UI or bypassing it altogether.' 929 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html' 930 | key: passwordRepeatChallenge 931 | - 932 | name: 'Reset Bender''s Password' 933 | category: 'Broken Authentication' 934 | tags: 935 | - OSINT 936 | description: 'Reset Bender''s password via the Forgot Password mechanism with the original answer to his security question.' 937 | difficulty: 4 938 | hints: 939 | - 'If you have no idea who Bender is, please put down this book right now and watch the first episodes of Futurama before you come back.' 940 | - 'Unexpectedly, Bender also chose to answer his chosen question truthfully.' 941 | - 'Hints to the answer to Bender’s question can be found in publicly available information on the Internet.' 942 | - 'If a seemingly correct answer is not accepted, you might just need to try some alternative spelling.' 943 | - 'Brute forcing the answer should be next to impossible.' 944 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html' 945 | key: resetPasswordBenderChallenge 946 | - 947 | name: 'Reset Bjoern''s Password' 948 | category: 'Broken Authentication' 949 | tags: 950 | - OSINT 951 | description: 'Reset the password of Bjoern''s internal account via the Forgot Password mechanism with the original answer to his security question.' 952 | difficulty: 5 953 | hints: 954 | - 'Nothing a little bit of Facebook stalking couldn''t reveal. Might involve a historical twist.' 955 | - 'Other than with his OWASP account, Bjoern was a bit less careless with his choice of security and answer to his internal account.' 956 | - 'Bjoern chose to answer his chosen question truthfully but tried to make it harder for attackers by applying sort of a historical twist.' 957 | - 'Again, hints to the answer to Bjoern’s question can be found by looking him up on the Internet.' 958 | - 'Brute forcing the answer should be next to impossible.' 959 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html' 960 | key: resetPasswordBjoernChallenge 961 | - 962 | name: 'Reset Jim''s Password' 963 | category: 'Broken Authentication' 964 | tags: 965 | - OSINT 966 | description: 'Reset Jim''s password via the Forgot Password mechanism with the original answer to his security question.' 967 | difficulty: 3 968 | hints: 969 | - 'The hardest part of this challenge is actually to find out who Jim actually is.' 970 | - 'Jim picked one of the worst security questions and chose to answer it truthfully.' 971 | - 'As Jim is a celebrity, the answer to his question is quite easy to find in publicly available information on the internet.' 972 | - 'Even brute forcing the answer should be possible with the right kind of word list.' 973 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html' 974 | key: resetPasswordJimChallenge 975 | - 976 | name: 'Reset Morty''s Password' 977 | category: 'Broken Anti Automation' 978 | tags: 979 | - OSINT 980 | - Brute Force 981 | description: 'Reset Morty''s password via the Forgot Password mechanism with his obfuscated answer to his security question.' 982 | difficulty: 5 983 | hints: 984 | - 'Finding out who Morty actually is, will help to reduce the solution space.' 985 | - 'You can assume that Morty answered his security question truthfully but employed some obfuscation to make it more secure.' 986 | - 'Morty’s answer is less than 10 characters long and does not include any special characters.' 987 | - 'Unfortunately, Forgot your password? is protected by a rate limiting mechanism that prevents brute forcing. You need to beat this somehow.' 988 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html' 989 | key: resetPasswordMortyChallenge 990 | - 991 | name: 'Retrieve Blueprint' 992 | category: 'Sensitive Data Exposure' 993 | description: 'Deprive the shop of earnings by downloading the blueprint for one of its products.' 994 | difficulty: 5 995 | hints: 996 | - 'Check for products which seem like a natural fit for being based on a blueprint.' 997 | - 'You might want to pay attention to the images of the identified product candidates.' 998 | - 'For your inconvenience the blueprint was not misplaced into the same place like so many others forgotten files covered in this chapter.' 999 | mitigationUrl: ~ 1000 | key: retrieveBlueprintChallenge 1001 | - 1002 | name: 'SSRF' 1003 | category: 'Broken Access Control' 1004 | tags: 1005 | - Code Analysis 1006 | description: 'Request a hidden resource on server through server.' 1007 | difficulty: 6 1008 | hints: 1009 | - 'Reverse engineering something bad can make good things happen.' 1010 | - 'Using whatever you find inside the malware directly will not do you any good.' 1011 | - 'For this to count as an SSRF attack you need to make the Juice Shop server attack itself.' 1012 | - 'Do not try to find the source code for the malware on GitHub. Take it apart with classic reverse-engineering techniques instead.' 1013 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html' 1014 | key: ssrfChallenge 1015 | - 1016 | name: 'SSTi' 1017 | category: 'Injection' 1018 | tags: 1019 | - Contraption 1020 | - Danger Zone 1021 | - Code Analysis 1022 | description: 'Infect the server with juicy malware by abusing arbitrary command execution.' 1023 | difficulty: 6 1024 | hints: 1025 | - '"SSTi" is a clear indicator that this has nothing to do with anything Angular. Also, make sure to use only our non-malicious malware.' 1026 | - 'You can find the juicy malware via a very obvious Google search or by stumbling into a very ill-placed quarantine folder with the necessary URLs in it.' 1027 | - 'Making the server download and execute the malware is key to solving this challenge.' 1028 | - 'For this challenge you do not have to reverse engineer the malware in any way. That will be required later to solve the "Request a hidden resource on server through server" challenge.' 1029 | mitigationUrl: ~ 1030 | key: sstiChallenge 1031 | disabledEnv: 1032 | - Docker 1033 | - Heroku 1034 | - Gitpod 1035 | - 1036 | name: 'Score Board' 1037 | category: 'Miscellaneous' 1038 | tags: 1039 | - Tutorial 1040 | - Code Analysis 1041 | description: 'Find the carefully hidden ''Score Board'' page.' 1042 | difficulty: 1 1043 | mitigationUrl: ~ 1044 | key: scoreBoardChallenge 1045 | tutorial: 1046 | order: 1 1047 | - 1048 | name: 'Security Policy' 1049 | category: 'Miscellaneous' 1050 | tags: 1051 | - Good Practice 1052 | description: 'Behave like any "white-hat" should before getting into the action.' 1053 | difficulty: 2 1054 | hints: 1055 | - 'This challenge asks you to act like an ethical hacker.' 1056 | - 'Undoubtedly you want to read our security policy before conducting any research on our application.' 1057 | - 'As one of the good guys, would you just start attacking an application without consent of the owner?' 1058 | - 'You also might want to read the security policy or any bug bounty program that is in place.' 1059 | mitigationUrl: 'https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html' 1060 | key: securityPolicyChallenge 1061 | - 1062 | name: 'Server-side XSS Protection' 1063 | category: 'XSS' 1064 | tags: 1065 | - Danger Zone 1066 | description: 'Perform a persisted XSS attack with <iframe src="javascript:alert(`xss`)"> bypassing a server-side security mechanism.' 1067 | difficulty: 4 1068 | hints: 1069 | - 'The "Comment" field in the "Customer Feedback" screen is where you want to put your focus on.' 1070 | - 'The Comment field in the Contact Us screen is where you want to put your focus on.' 1071 | - 'The attack payload