Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie
- - - - -

Łatka dla PsychoStats


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 bociek1994

    Zaawansowany

  • Użytkownik

Reputacja: 3
Nowy

  • Postów:116
  • Lokalizacja:Polska
Offline

Napisano 07.04.2013 13:53

Wiedzę zaczerpnąłem z forum GHT od użytkownika : XvAK - myślę, że przyda się innym.

W znanych wszystkim dobrze statystykach - PsychoStats, a dokładnie w module "Awards" jest dziura pozwalająca na atak SQL injection.
Atakujący bez problemu może odczytać dane do FTP czy RCONa, a nawet uzyskać dostęp do innych baz jeśli serwer MySQL nie jest odpowiednio zabezpieczony.

Łatka jest banalna, co ciekawe - była już w kodzie PsychoStats tylko z niewiadomej przyczyny jest zakomentowana.

W folderze z PsychoStats odnajdujemy plik awards.php i usuwamy początek oraz koniec komentarza (w 76 i 85 linii).


// determine if this date exists
/*
list($valid_date) = $ps->db->fetch_list(sprintf("SELECT 1 FROM $ps->t_awards WHERE awarddate=%s AND awardrange=%s LIMIT 1",
$ps->db->escape($d, true),
$ps->db->escape($v, true)
));
// if the selected date is not in the database then default to the newest date for the current view
if (!$valid_date) {
$d = $range[$v]['max'];
}
*/


Ostatecznie powinno wyglądać tak :

// determine if this date exists
list($valid_date) = $ps->db->fetch_list(sprintf("SELECT 1 FROM $ps->t_awards WHERE awarddate=%s AND awardrange=%s LIMIT 1",
$ps->db->escape($d, true),
$ps->db->escape($v, true)
));
// if the selected date is not in the database then default to the newest date for the current view
if (!$valid_date) {
$d = $range[$v]['max'];
}

Funkcja ta sprawdza czy podana data jest w bazie danych, jeśli nie to wyświetla najnowszą oraz dodaje do zapytania addslashes (w zasadzie tylko to wystarczyłoby aby załatać dziurę).
Po tej zmianie będzie wykonywane 1 zapytanie więcej, jednak nie zauważyłem aby miało to jakiś istotny wpływ na wydajność strony.

Jeśli komuś nie chce się ręcznie edytować pliku to załączam gotowy do pobrania:
Załączony plik  awards.rar   3,32 KB  162 Ilość pobrań

Exploit jak i łatka na pewno działa na PS v3.1 oraz v3.2.2a. Na innych wersjach prawdopodobnie również.
  • +
  • -
  • 1




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych