Přeskočit na hlavní obsah

Porušení oprávnění na úrovni property objektu

  • Uživatel by měl mít přístup jen ke specifickým properties objektu, ke kterému přistupuje.
  • API je zranitelné, pokud endpoint
    • vystavuje properties objektu, které jsou považovány za citlivé a neměly by být uživateli dostupné,
    • umožňuje uživateli úpravu / mazání / přidávání citlivých properties objektu, ke kterým by neměl mít uživatel přístup.

Jak zranitelnosti předcházet

🔴 Ověřte, zda má uživatel přístup pouze k properties, ke kterým by měl mít přístup.

🔴 Nepoužívejte generické metody typu to_json() nebo to_string().

🔴 Vraťte jen nezbytně nutné properties daného objektu (vytvořte například DTO).

🔴 Nepoužívejte funkce, které automaticky bindují vstup na proměnné, interní objekty nebo properties.

🔴 Umožněte uživateli úpravu jen takových properties, na které má oprávnění.

🔴 Vytvořte validační mechanismus pro odpověď, který bude ověřovat, zda nevracíte víc, než je nutné.

🔴 Zajistěte, aby byla datová struktura odpovědi co nejmenší - v závislosti na požadavcích.

Příklady zneužití zranitelnosti

  1. Sociální síť umožňuje nahlašovat uživatele za nevhodné chování.

    • Po kliknutí na report tlačítko se odešle následující požadavek:
    POST /graphql
    {
    "operationName": "reportUser",
    "variables": {
    "userId": 313,
    "reason": ["offensive behavior"]
    },
    "query": "mutation reportUser($userId: ID!, $reason: String!) {
    reportUser(userId: $userId, reason: $reason) {
    status
    message
    reportedUser {
    id
    fullName
    recentLocation
    }
    }
    }"
    }
    • API útočníkovi umožňuje zobrazit si citlivé údaje (recentLocation), ke kterým by neměl mít nikdo přístup.
  2. Aplikace umožňuje online pronájem bytů.

    • Majitel bytu musí každou žádost o pronájem schválit - API request vypadá takto:
    {
    "approved": true,
    "comment": "Check-in is after 3pm"
    }
    • Majitel request ručně změní a přidá property navíc, čímž hosta donutí zaplatit víc:
    {
    "approved": true,
    "comment": "Check-in is after 3pm",
    "total_stay_price": "$1000000"
    }
    • API je zranitelné, protože mapuje vstupní data na interní property objektu bez validace.
  3. Aplikace pro správu videí umožňuje cenzurování obsahu.

    • Útočník ale může změnit (nejen) popis videa i v případě, že je zamítnuté:
    PUT /api/video/update_video

    {
    "description": "a funny video about cats",
    "blocked": false
    }
    • Problém je způsoben chybějící validací a mapováním vstupních dat na interní properties objektu.

Kam dál

Cheat sheety

Checklisty

Další