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:

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