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