Øvelse 17 - BOLA & EDE
Forfatter: Mathias Greisen
Dato: 2026-14-09
Fag/modul: IT-Sikkerhed i Webapplikationer
Status: Færdig
1. Beskrivelse af øvelsen
Brug lærte concepter om Broken Object Level Authorization (BOLA) og Excessive Data Exposure (EDE) fra crAPI i JuiceShop.
2. Reproduktion trin for trin
Forudsætninger
- Adgang til JuiceShop
- Installeret Burpsuite
Find BOLA
- Tilgå JuiceShop med burpsuite som proxy. Opret og log ind som bruger A
-
Tilføj emner til indkøbskurven.
-
I Burpsuite tænd for intercept og klik op indkøbskurven i JuiceShop.
-
Noter ID'et på indkøbskurven:
-
Intercept kan nu deaktiveres igen.
-
-
Opret og log ind som bruger B.
-
Aktiver igen intercept i Bursuite og klik på indkøbskurven.
-
Send GET request til repeater.
- Request til: "http://127.0.0.1:3000/rest/basket/{ID}"
-
Skift ID URL-parameter
- Skift {ID} til ID noteret i step 3.
-
Send request og tjek response
Raw HTTP responseHTTP/1.1 200 OK [...] { "status":"success", "data":{ "id":6, "coupon":null, "UserId":23, "createdAt":"2026-09-14T11:48:00.530Z", "updatedAt":"2026-09-14T11:48:00.530Z", "Products":[ { "id":6, "name":"Banana Juice (1000ml)", "description":"Monkeys love it the most.", "price":1.99, "deluxePrice":1.99, "image":"banana_juice.jpg", "createdAt":"2026-09-14T11:42:10.097Z", "updatedAt":"2026-09-14T11:42:10.097Z", "deletedAt":null, "BasketItem":{ "ProductId":6, "BasketId":6, "id":9, "quantity":1, "createdAt":"2026-09-14T11:48:10.979Z", "updatedAt":"2026-09-14T11:48:10.979Z" } }, [...] ] } }BOLA er her bevist da vi kan se bruger A's indkøbskurv.
Find excessive Data Exposure
-
Tilgå JuiceShop med Burpsuite som proxy
-
Åbn photo wall i JuiceShop
- http://127.0.0.1:3000/#/photo-wall
-
Tjek http history i Burpsuite
- Find et GET kald til "GET /rest/memories/ HTTP/1.1"
- Der sendes kun flere oplysninger retur ved første kald.
-
Find EDE i response
Response med EDEHTTP/1.1 200 OK Access-Control-Allow-Origin: * X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Feature-Policy: payment 'self' X-Recruiting: /#/jobs Content-Type: application/json; charset=utf-8 ETag: W/"1827-pjaV9PPdvogygFQBeM0+1zJsQGw" Vary: Accept-Encoding Date: Mon, 14 Sep 2026 12:40:39 GMT Connection: keep-alive Keep-Alive: timeout=5 Content-Length: 6183 { "status":"success", "data":[ { "UserId":13, [...] "User":{ "id":13, "username":"", "email":"bjoern@owasp.org", "password":"9283f1b2e9669749081963be0462e466", "role":"deluxe", "deluxeToken":"efe2f1599e2d93440d5243a1ffaf5a413b70cf3ac97156bd6fab9b5ddfcbe0e4", "lastLoginIp":"", "profileImage":"assets/public/images/uploads/13.jpg", "totpSecret":"", "isActive":true, "createdAt":"2026-09-14T11:42:07.669Z", "updatedAt":"2026-09-14T11:42:07.669Z", "deletedAt":null } }, [...] ] }- Som man kan se returneres der både email, password, rolle og tokens for andre brugere.
-
Knæk passwords online
-
Som eksempel fra forrige response er der fundet følgende oplysinger:
-
Passworded ligner en hash
-
CrackStation kan knække den:
Hash Type Result 2c17c6393771ee3048ae34d6b380c5ec md5 private
-
-
Log ind som brugeren
-
Som det kan ses herunder, så virkede det knækkede password:

-
-
Bruger systemet salt når passwords gemmes?
- Nej. Dette blev testet ved at:
- Knække password for en anden bruger (bjoern.kimminich@gmail.com) ligesom i trin 5.
- Ændre password for brugeren "ethereum@juice-sh.op" til det samme som brugeren "bjoern.kimminich@gmail.com".
- Køre step 1-4 igen og tjek at begges brugeres password er ens i response, hvilket de er.
- Nej. Dette blev testet ved at:
Kombiner og exploit
Hvis man ikke kan knække en adgangskode i forrige afsnit, kan man stadigvæk tilgå deres kurv:
- Noter brugerens ID (UserId)
- Følg find BOLA afsnittet og indtil du har GET request for kurven i Burpsuite repeater.
-
Skift (enumerer) basket ID'et indtil en kurv linket til det korrekte UserID returneres.
4. Hvis kurven ikke kan findes, så har brugeren muligvis ikke oprettet en.{ "status":"success", "data":{ "id":1, "coupon":null, "UserId":1, "createdAt":"2026-09-14T11:42:10.290Z", "updatedAt":"2026-09-14T11:42:10.290Z", "Products":[ { "id":1, "name":"Apple Juice (1000ml)", "description":"The all-time classic.", "price":1.99, "deluxePrice":0.99, "image":"apple_juice.jpg", "createdAt":"2026-09-14T11:42:10.097Z", "updatedAt":"2026-09-14T11:42:10.097Z", "deletedAt":null, "BasketItem":{ "ProductId":1, "BasketId":1, "id":1, "quantity":2, "createdAt":"2026-09-14T11:42:10.350Z", "updatedAt":"2026-09-14T11:42:10.350Z" } }, [...] ] } }
Even More BOLA vulnerabilities
Forge feedback from another user
-
Tilgå JuiceShop og klik på Customer Feedback.
-
Udfyld felterne.
-
Aktiver intercept i Burpsuite og indsend feedback.
-
I Burpsuite send POST requesten til repeater.
-
Skift "UserId" og evt. "comment" i request body til det ønskede.
-
Send request afsted og tjek response for at det lykkedes
-
(Ektra) Tjek administrator panel
Dette kræver adgang til en admin konto i JuiceShop
- Tilgå http://127.0.0.1:3000/#/administration
- Tjek at den nye feedback er oprettet

Create or edit another users product review
-
Åben JuiceShop og log ind.
-
Opret et review på et produkt.
-
Aktiver intercept i Burpsuite og klik på rediger review.
-
Send PATCH request til repeater. Og deaktiver intercept.
-
Aktiver intercept igen og klik på en vare.
-
I Burpsuite, send GET request til repeater.
- GET request til følgende endpoint: "/rest/products/30/reviews"
-
Åben repeater og send GET request afsted. Noter "_id" for den kommentar som ønskes ændret.
-
Find PATCH requesten og indsæt nu det noterede "_id" og skriv feedback besked som ønskes.
-
Send PATCH request afsted og tjek response.
"modified":1, "original":[ { "message":"0 st4rs f0r 7h3 h0rr1bl3 s3cur17y", "author":"uvogin@juice-sh.op", "product":30, "likesCount":0, "likedBy":[ ], "_id":"w6fbzSKqgG5tR7yXL" } ], "updated":[ { "message":"Dette review er blevet ændret via BOLA", "author":"uvogin@juice-sh.op", "product":30, "likesCount":0, "likedBy":[ ], "_id":"w6fbzSKqgG5tR7yXL" } ]Det lykkedes altså at ændre en anden brugers review, da applikationen ikke tjekke om vi egentlig ejer den ressource vi forsøger at ændre.
3. Problemer og løsninger
Jeg løb ikke ind i problemer under denne opgave.
4. Resultater og besvarelser
- What information was exposed, and under what conditions?
-
Alt data tilknyttet en bruger sendes retur ved et specifikt endpoint.
-
What types of authorization checks were missing in this scenario?
-
Der er intet tjek for hvem der egentlig foretager et request udover at man er logget ind og sender korrekte data afsted i sine requests.
-
How could the application better enforce access control?
-
Ved hvert request bør access token tjekkes for hvem det er og om de så skal have rettighed til at se/ændre/slette objektet.
-
What changes would prevent users from accessing other users’ data?
- Brug af DTO (data transfer object) for hver response/endpoint kan give mulighed for kun at sende det data retur som man rent faktisk skal bruge og ønsker at brugerne kan se.
- Dette kunne f.eks. være en UserDto, hvor f.eks. password ikke er en del af objektet.
5. Opsummering af erfaringer
Jeg har fået flere erfaringer med BOLA og EDE. Herunder hvor man evt. også kan lede og finde sårbarheder. Samtidigt kan man nu lettere reflektere over hvorfor authorization, access control og brug af DTO'er er vigtigt.