Włamanie na „Sklep SMS v0.13”

Wpis ten omawia sposób ataku na Sklep SMS wykonany przez Sloenthran który dostępny jest tutaj
http://amxx.pl/topic/116991-sklep-sms-v013/

Autor został poinformowany jakiego rodzaju jest to bug a także potwierdził naprawę tego ( no nie do końca 😛 ) http://amxx.pl/topic/116991-sklep-sms-v013/?p=565744

Podatny kod znajduje się w pliku index.php
Wygląda to tak

$Strona = PrzeczyscTekst($_GET['strona']);

...

if(!$SESSION_NAME || !$StanAdmina || !$StanUsera)
{
	$strona = './strony/niezalogowany/'.$Strona.'.php';
}
		
if($SESSION_NAME && $StanAdmina && !$StanUsera)
{
	$strona = './strony/zalogowany_admin/'.$Strona.'.php';
}
		
if($SESSION_NAME && $StanUsera)
{
	$strona = './strony/zalogowany_user/'.$Strona.'.php';
}
	
...
require_once($strona);

Wyciąłem niepotrzebny kod

Bugi są tak naprawdę dwa

  • Pierwszy to niedokładne filtrowanie zmiennej pobieranej z get
  • Drugi to niesprawdzanie uprawnień użytkownika w panelu administratora

Może najpierw jak to działa
Całość opiera się zmianie parametru site w get możemy podać tam dowolny plik który zostanie załadowany przez index.php wykorzystamy to aby uzyskać dostęp do panelu administratora

Przykład:

http://www.sloenthran.pl/projekty/sms_shop/?strona=../zalogowany_admin/glowna

Niestety na serwerze Sloenthran’a jest już wgrana łatka przez co nie zobaczymy efektu ale możecie zawsze sprawdzić to na localhoscie 😉

Wykorzystując ten bug możemy załadować dowolny plik z serwera 🙂

Dlaczego to działa ?
Przyjrzyjmy się samemu filtrowaniu

$Strona = PrzeczyscTekst($_GET['strona']);

i funkcji PrzeczyscTekst

function PrzeczyscTekst($Tekst)
{
	
	if(get_magic_quotes_gpc())
	{
		
		$Tekst = stripslashes($Tekst);
			
	}
		
	$Tekst = trim($Tekst);
	$Tekst = mysql_real_escape_string($Tekst);
	$Tekst = htmlspecialchars($Tekst);
		
	return $Tekst;
		
}

Widzimy to wywołanie 3 funkcji w celu wyczyszczenia zmiennej z niepożądanych znaków

Jak widać zasób znaków trochę się nam zmniejszył nadal jednak możemy korzystać z ‚../’ czy własnie slasha dzięki czemu możemy wędrować po strukturze katalogów.

Drugi podpunkt czyli nie sprawdzanie uprawnień jest prosty w plikach panelu nie było żadnego sprawdzania czy użytkownik jest zalogowany i czy jest administratorem.
W patchu został to naprawione tak

if(!$_SESSION['ZALOGOWANY'] && !$_SESSION['ADMINISTRATOR'])
{
	
	header("Location: ?strona=glowna");
	
}

Niestety bug w index.php z includowaniem dowolnego pliku nadal istnieje 😉

Jak to powinno zostać naprawione ?
Można to zrobić na kilka sposobów niektóre gorsze niektóre lepsze np.

  • Pierwszy trywialny i nie polecany przeze mnie to usuwanie z ciągu slashy i ‚../’
  • Drugi to stworzenie swego rodzaju whitelisty do jakich plików może odwoływać się zmienna get i skrypt index.php

Więcej informacji i gotowy kod tutaj
http://phpedia.pl/wiki/Jak_do%C5%82%C4%85cza%C4%87_pliki_za_pomoc%C4%85_include()_i_$_GET%3F

5 komentarzy o “Włamanie na „Sklep SMS v0.13”

  1. Dark Ty to masz pomysły ;]

    Aktualnie nie ma żadnych niebezpiecznych plików które można includować jednakże od następnej wersji zrobię tą WhiteListe 🙂

  2. Hi DarkGL. Could you please give me any of your contacts or something ? I saw this video and I was wondering if you could post a guide (or code) how to make such a stable sprite on players screen ? I mean its not going away when you move etc… (The Video : http://www.youtube.com/watch?v=fHD0OuDdJdk)
    Greetings, pawn coder from Latvia!

Dodaj komentarz