Schipper mag ik (gratis) overvaren?
Eenmaal per week steek ik (voor woon-werk verkeer) bij Bergambacht met de veerpont de Lek over. Men werkt nu nog met een papieren knipkaart, maar per januari 2025 gaan verschillende veerdiensten in die regio over op de Veerpas. Donderdag 19 december tijdens de overtocht op weg naar huis kocht ik zo’n Veerpas en later die avond koppelde ik deze Veerpas aan mijn nieuwe veerpas.nl account. Toen ontdekte ik een blanco-cheque-kwetsbaarheid.
Tijdens het aanmaken van mijn account op veerpas.nl routeerde ik al het verkeer tussen mijn webbrowser en de server van veerpas.nl naar de proxy functie van de applicatie Burp Suite. Deze man-in-the-middle positie geeft mij de mogelijkheid om de werking van de website te analyseren en dingen te testen. Na wat “klikken, kijken, leren” viel mijn oog op het zogenaamde drop-down menu waarin je kon kiezen met welk bedrag je het tegoed op je Veerpas wil opwaarderen.
Zoals je ziet, bestaat iedere optie uit het daadwerkelijk te betalen bedrag én het bonuspercentage wat je als extra tegoed krijgt bij het opwaarderen. Zo kun je bijvoorbeeld voor € 15 opwaarderen en 10% extra tegoed krijgen waardoor het tegoed op je Veerpas met € 16,50 toeneemt. Nu is dat drop-down menu op zichzelf niet zo bijzonder, maar de HTML code waarmee het drop-down menu (achter de schermen) wordt opgebouwd is dat wel.
Het bovenstaand screenshot laat voor ieder van de 9 opties uit het drop-down menu de onderliggende HTML code zien. Kijken we naar de blauw gearceerde regel voor de eerste optie (15 euro + 10%), dan is met name de waarde van het attribuut “value” interessant.
In een meer leesbare vorm staat er {"amount":"15","percentage_bonus":"10"}
. Dit zijn de waarden die naar de server worden gestuurd bij het bevestigen van de geselecteerde optie. Voor de gebruiker volgt er een redirect naar Mollie voor de betaling, en als deze lukt wordt het tegoed aan je Veerpas toegevoegd. En dan kun je misschien al raden waar dit naartoe gaat.
Wanneer ik Burp Proxy met de zogenaamde ‘Match and replace’ functie de desbetreffende regel geautomatiseerd laat aanpassen naar een bedrag van € 1,00 en een bonus percentage van 5000%, dan ziet dat er als volgt uit:
En in principe is dit nog steeds niet erg. Het enige wat ik namelijk aanpas zijn waarden in mijn browser (dus client-side) en dat is op zichzelf niet te voorkomen. Het is namelijk mijn browser op mijn PC en daar heb ik per definitie 100% controle over alles wat er gebeurt. En precies om die reden is er een gouden regel bij het maken van webapplicaties die al jaren voorkomt in de OWASP Top 10: validate all input!
En dat is exact het punt waar veerpas.nl de mist in gaat; van de browser (gebruiker) afkomstige waarden worden niet gecontroleerd op juistheid; de zogenaamde semantische input validatie ontbreekt. Oftewel, een blanco cheque. En als gevolg daarvan kon ik met een betaling van € 1,00 euro mijn tegoed opwaarderen met € 51,00. Uiteraard had ik die bedragen nog een stuk extremer kunnen kiezen. Wel grappig, maar niet nodig om mijn punt te kunnen maken.
Hieronder zie je dat na mijn betaling van € 1,00 via Mollie de ontvangen bonus van € 50,00 ook netjes wordt weergegeven in de transactiehistorie van mijn veerpas.nl account.
Diezelfde avond nog besloot ik dit te melden via een e-mailadres op de website en de volgende dag werd ik gebeld door Rosegaar; de partij die deze website heeft gebouwd. Na dankwoorden voor het melden, volgde de mededeling dat de kwetsbaarheid reeds was verholpen en dat de medewerker in kwestie er even op was aangesproken. De persoon die mij te woord stond was er heel duidelijk over: “dit hoort natuurlijk niet zo gebouwd te worden”. Wat mij betreft een prima reactie en een pluim voor de snelle response.
Overigens heb ik van Veerdienst Bergstoep zelf geen enkele reactie gehad. Maakt voor het oplossen van de kwetsbaarheid natuurlijk niks uit, maar ik kan het toch niet laten om het even te zeggen: ik vind daar wel wat van. Ik hoef echt niet onthaald te worden met champagne en vuurwerk, en het gaat mij ook niet om een bug bounty, maar als ik dit soort ‘kadootjes’ weggeef is een simpele e-mail met “bedankt voor het melden, we hebben het doorgezet en er wordt contact met u gezocht” toch een logische reactie? Blijkbaar was dat niet belangrijk, maar die € 50,00 bonus is op de vroege vrijdagochtend om 5:50 wel meteen van mijn tegoed afgehaald.
Anyway, ik heb vrijdagavond nog even geverifieerd of het probleem inderdaad was verholpen, en dat was zo. In plaats van {"amount":"15","percentage_bonus":"10"}
heeft het value attribuut nu de waarde 0
(doorgenummerd tot 8 voor de andere opties) en bepaalt men vervolgens server-side dat bij 0
een bedrag van € 15,00 en een percentage van 10% hoort. Case closed.
Plaats een Reactie
Meepraten?Draag gerust bij!