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
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 🙂
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!
Well I think the most efficient way to contact with me is through steam. Add me as an friend „DarkGL” or „darkgl2”.
I did added you on Steam, my name is PodarokLV. Do you also have skype or msn?
I did added you on Steam, my name is PodarokLV. Do you also have skype or msn? // yes of course