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:
awards.rar 3,32 KB 184 Ilość pobrańExploit jak i łatka na pewno działa na PS v3.1 oraz v3.2.2a. Na innych wersjach prawdopodobnie również.


Dodatki SourceMod












