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!

  3. Well I think the most efficient way to contact with me is through steam. Add me as an friend „DarkGL” or „darkgl2”.

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.