File Upload â High
Nu wordt het lastiger. De MIME-type header manipuleren werkt niet meer, want de server voert een dieptecontrole uit op het bestand.
1. Predict (Voorspel)â
De backend controleert nu de werkelijke inhoud van het bestand via getimagesize():
if( !getimagesize( $_FILES[ 'uploaded' ][ 'tmp_name' ] ) ) {
echo "Dit is geen geldige afbeelding!";
}
De extensie moet ook eindigen op .jpg, .jpeg of .png.
Vraag: De functie getimagesize() leest de eerste bytes van het bestand op zoek naar een Image Signature (de "Magic Bytes" van een JPG/PNG). Kun je dit omzeilen?
Antwoord
Je kunt een echte JPG-afbeelding downloaden en met een tool zoals exiftool PHP-code verstoppen in de metagegevens (bijv. in het Copyright-veld). De server scant de Magic Bytes: geldig. De extensie is .jpg: geldig. Maar verstopt in de metadata zit jouw uitvoerbare code. Om de code te activeren heb je daarna een File Inclusion-kwetsbaarheid nodig om het .jpg-bestand als PHP te laten uitvoeren.
2. Run (Uitvoeren)â
Start het lab.
Labbeperking: Deze aanval vereist geavanceerde tools zoals exiftool en een combinatie met de File Inclusion-kwetsbaarheid. Het lab simuleert de server-side logica, maar voor de volledige hands-on ervaring heb je een lokale DVWA-installatie nodig.
Upload een normale .jpg-afbeelding en observeer dat dit werkt.
3. Investigate (Onderzoeken)â
Probeer shell.php te uploaden (zelfs als je de Content-Type header aanpast). Probeer ook een bestand met de naam shell.php.jpg.
Vraag: Welke controles stopt het High level tegelijk? Wat is de enige manier om door al deze controles heen te komen?
Antwoord
Het High level blokkeert: (1) foute extensies â de naam moet eindigen op .jpg/.jpeg/.png, en (2) foute bestandsinhoud â getimagesize() eist echte image Magic Bytes. Je kunt de extensie-check omzeilen door de naam .jpg te geven, maar dan nog controleert getimagesize() of de bytes kloppen. De enige doorgang is een echt afbeeldingsbestand met verstopte PHP-code in de metadata.
4. Modify & Make (Aanpassen & Maken)â
Stel dat je erin geslaagd bent een geldig .jpg-bestand met verstopte PHP-code (hacked.jpg) op de server te uploaden. Er is nog ÊÊn probleem: hoe activeer je de PHP-code in een bestand met .jpg-extensie?
Tip
Denk terug aan de File Inclusion-module. We moeten de webserver forceren om het .jpg-bestand als PHP-broncode in te laden in plaats van als afbeelding.
Antwoord
Je hebt een File Inclusion (LFI)-kwetsbaarheid nodig om dit af te ronden. Via de File Inclusion-module vraag je:
?page=../../hackable/uploads/hacked.jpg
De include()-functie laadt dan de .jpg als PHP-broncode en voert de verstopte code uit. Dit is waarom het combineren van kwetsbaarheden het meesterstuk van een hacker is.
5. â Wat moest je zien?â
- Een PHP-bestand met
.php-extensie wordt geweigerd â zowel door de extensiecheck alsgetimagesize(). - Een
.jpg-bestand met geldige Magic Bytes maar PHP-code in de metadata wordt wel geaccepteerd. - Activeren van de code vereist een tweede kwetsbaarheid (LFI).
Wil je dit volledig uitproberen? Je hebt exiftool (in Kali), een echte .jpg-afbeelding, en de File Inclusion-module op High level nodig.