ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Веб-уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=114)
-   -   Трекер-движок TBDev 2.0 (https://forum.antichat.xyz/showthread.php?t=79705)

Qwazar 24.06.2009 13:45

Если добавить (int) как написано в твоём посте, то спасает. Я не знаю может в новой версии есть строгое приведение типа, я на старой смотрел, там его нет.

З.Ы.
Вот у меня код такой:

Код:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $choice = $_POST["choice"];
  if ($CURUSER && $choice != "" && $choice < 256 && $choice == floor($choice)) {


Qwazar 24.06.2009 14:15

Цитата:

Сообщение от m0Hze
Ник как у разработчика =)...

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

З.Ы.
Завязываем оффтопить.

З.З.Ы.
Разработчикам советую обратить внимание на: https://forum.antichat.ru/thread30641.html

Yuna 24.06.2009 15:19

Цитата:

Сообщение от Qwazar
Если добавить (int) как написано в твоём посте, то спасает. Я не знаю может в новой версии есть строгое приведение типа, я на старой смотрел, там его нет.

З.Ы.
Вот у меня код такой:

Код:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $choice = $_POST["choice"];
  if ($CURUSER && $choice != "" && $choice < 256 && $choice == floor($choice)) {


Не, ну это старенький код =)))

А насчет SQL-inj - да там проблема что когда движок весь собирался - (а это 2006-й год!!!) то малость я тогда и не знал что такое есть, и как защищаться

А лазить по всему коду - так влень, лучше списочком де дырки =)))))

HAXTA4OK 27.06.2009 00:50

Код:

if (get_user_class() < UC_MODERATOR)
        puke($tracker_lang['access_denied']);

$action = $_POST["action"];

if ($action == "edituser") {
        $userid = $_POST["userid"];
        $title = $_POST["title"];
        $avatar = $_POST["avatar"];
        // Check remote avatar size
        if ($avatar) {
                if (!preg_match('#^((http)|(ftp):\/\/[a-zA-Z0-9\-]+?\.([a-zA-Z0-9\-]+\.)+[a-zA-Z]+(:[0-9]+)*\/.*?\.(gif|jpg|jpeg|png)$)#is', $avatar))
                                                stderr($tracker_lang['error'], $tracker_lang['avatar_adress_invalid']);
                if(!(list($width, $height) = getimagesize($avatar)))
                                                stderr($tracker_lang['error'], $tracker_lang['avatar_adress_invalid']);
                if ($width > $avatar_max_width || $height > $avatar_max_height)
                                                stderr($tracker_lang['error'], sprintf($tracker_lang['avatar_is_too_big'], $avatar_max_width, $avatar_max_height));
        }
// Check remote avatar size
        $resetb = $_POST["resetb"];
        $birthday = ($resetb=='yes'?", birthday = '0000-00-00'":"");
        $enabled = $_POST["enabled"];
        $warned = $_POST["warned"];
        $warnlength = 0 + $_POST["warnlength"];
        $warnpm = $_POST["warnpm"];
        $donor = $_POST["donor"];
        $uploadtoadd = $_POST["amountup"];
        $downloadtoadd=  $_POST["amountdown"];
        $formatup = $_POST["formatup"];
        $formatdown = $_POST["formatdown"];
        $mpup = $_POST["upchange"];
        $mpdown = $_POST["downchange"];
        $support = $_POST["support"];
        $supportfor = htmlspecialchars($_POST["supportfor"]);
        $modcomm = htmlspecialchars($_POST["modcomm"]);
        $deluser = $_POST["deluser"];

        $class = 0 + $_POST["class"];
        if (!is_valid_id($userid) || !is_valid_user_class($class))
                stderr($tracker_lang['error'], "Неверный идентификатор пользователя или класса.");
        // check target user class
        $res = sql_query("SELECT warned, enabled, username, class, modcomment, uploaded, downloaded FROM users WHERE id = $userid") or sqlerr(__FILE__, __LINE__);
        $arr = mysql_fetch_assoc($res) or puke("Ошибка MySQL: " . mysql_error());
        $curenabled = $arr["enabled"];
        $curclass = $arr["class"];
        $curwarned = $arr["warned"];
        if (get_user_class() == UC_SYSOP)
                $modcomment = $_POST["modcomment"];
        else
                $modcomment = $arr["modcomment"];
        // User may not edit someone with same or higher class than himself!
        if ($curclass >= get_user_class() || $class >= get_user_class())
                puke("Так нельзя делать!");


$userid = $_POST["userid"];

$res = sql_query("SELECT warned, enabled, username, class, modcomment, uploaded, downloaded FROM users WHERE id = $userid") or sqlerr(__FILE__, __LINE__);

все это из файла modtask.php
посмари там через пост не уязвим ли? просто с постом работать не умею :(

Yuna 27.06.2009 10:43

Не уязвим ))

if (!is_valid_id($userid) || !is_valid_user_class($class))

меня больше волнует проблема траффика и проверка аватарки - ну залью я туда jph весом 500 метров и все, удаленном трекеру жопа

HAXTA4OK 27.06.2009 20:30

http://127.0.0.1/treker/users.php?search=1&page=1

тут у меня выдает

Ответ от сервера MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-100,100' at line 1

в C:\xampp\htdocs\treker\users.php, линия 131

Запрос номер 12.

Nightmarе 27.06.2009 20:55

Цитата:

Сообщение от Yuna
меня больше волнует проблема траффика и проверка аватарки - ну залью я туда jph весом 500 метров и все, удаленном трекеру жопа

Конфигурация upload_max_filesize спасает от разовой загрузки больших файлов ;)

Yuna 28.06.2009 13:23

нет, я не об этом я о возможности нагрузить канал трекера просто забив в поле аватара (урл аватарки!!) ссылку на файлик весом эдак под 500мб

т.е беру файлик Therion_-_The_Miskolc_Experience-2CD-2009-FKK.rar переименовываю в avatar.jpg

кидаю на какой-то хостинг, и давай на 3-х юзерских профилях - пункт проверка аватарки т.е установка, а там уже дело техники - каждый пхп будет качать эти 150 метров файлик, потом удалять, а мы тем временем продолжаем процесс.

результат - на сервере забит канал, и вот вам по сути ддос

if (!preg_match('#^((http)|(ftp):\/\/[a-zA-Z0-9\-]+?\.([a-zA-Z0-9\-]+\.)+[a-zA-Z]+(:[0-9]+)*\/.*?\.(gif|jpg|jpeg|png)$)#is', $avatar))
stderr($tracker_lang['error'], $tracker_lang['avatar_adress_invalid']);
if(!(list($width, $height) = getimagesize($avatar)))
stderr($tracker_lang['error'], $tracker_lang['avatar_adress_invalid']);

ZonD80 29.06.2009 18:06

Yuna привет:) Чет ты немнога поздно тут зарегался. Юзай идею:
PHP код:

function remote_fsize($path)
{
$fp = @fopen($path,"r");
if (!
$fp) return false;
$inf stream_get_meta_data($fp);
fclose($fp);
if (
$inf["wrapper_data"]) {
foreach(
$inf["wrapper_data"] as $v)
if (
stristr($v,"content-length"))
{
$v explode(":",$v);
return 
trim($v[1]);
}
} else return 
FALSE;



Rostov114 30.06.2009 18:06

Цитата:

Сообщение от HAXTA4OK
http://127.0.0.1/treker/users.php?search=1&page=1

тут у меня выдает

Ответ от сервера MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-100,100' at line 1

в C:\xampp\htdocs\treker\users.php, линия 131

Запрос номер 12.

Скуль тут не возможен из-за строки:
PHP код:

$offset = ($page $perpage) - $perpage


YouSeeBeter 03.07.2009 19:10

эксплоит Qwazar'a как-будто вымер.

Сейчас тестировал его на чистом SKy tracker где есть уязвимость:

Trying to get your cookies... [DONE]
Trying to get passhash:
Exploit failed


Проверьте сами, даже где пахал не пашет, помогите...

Rostov114 06.07.2009 23:18

Цитата:

Сообщение от YouSeeBeter
Проверьте сами, даже где пахал не пашет, помогите...

:) Cнимай штаны и бегай.
А по сабжу....проблема не в сплоите, а в тебе.

P.S. Простите не удержался.

HAXTA4OK 08.07.2009 21:07

http://127.0.0.1/treker/rss.php?passkey=1'

SQL

Код:

$passkey = $_GET["passkey"];
if ($passkey) {
$user = mysql_fetch_row(sql_query("SELECT COUNT(*) FROM users WHERE passkey = '$passkey'"));
if ($user[0] != 1)
exit();
} else
loggedinorreturn();

XSS

http://127.0.0.1/treker/viewrequests.php?sort=%3E%3Cscript%3Ealert(/XSS/)%3C/script%3E





P.S. сорр не бегал по всем страницам так что не знаю выкладывали или нет багу =)



http://127.0.0.1/treker/usersearch.php?r=%22%3Cscript%3Ealert(/XSS/)%3C/script%3E

=\ что то не понял...есть тут что нить или просто косяк кода?

во всех(или нет, не проверял) usersearch.php?....=%22%3Cscript%3Ealert(/XSS/)%3C/script%3E

такой косяк))))

HAXTA4OK 08.07.2009 21:57

http://127.0.0.1/treker/userhistory.php?action=viewposts&id=x


x= id у которого нету постов как я понял ..и он выдаст ошибку ))) но SQL не провернуть так как нету таблы такой у меня

так что наверно к разряду раскрытие путей

Yuna 09.07.2009 15:53

usersearch.php дыряв на XSS лучше чем решето =)))

peonix 09.07.2009 22:44

Цитата:

Сообщение от Yuna
usersearch.php дыряв на XSS лучше чем решето =)))

а по подробнее можно? и в каких версиях?

Yuna 10.07.2009 12:18

во всех

peonix 12.07.2009 01:13

Цитата:

Сообщение от Yuna
во всех

напиши что за XSS ты узал если не трудно...

Yuna 12.07.2009 11:42

для начала просто код откройте - нет проверки $_GET ваще никакой в файле...

peonix 13.07.2009 02:49

Yuna
а через какой скрипт Вы в usersearch.php параметры передавали? просто так его вызвать нельзя...

Nightmarе 13.07.2009 04:46

Это видимо особый стиль написания движка с новым подходом?
Хоть одну дырку (пусть беспонтовую) осмысленно оставить...

Yuna 13.07.2009 13:22

Цитата:

просто так его вызвать нельзя...
? в смисле нельзя

peonix 13.07.2009 17:37

Цитата:

Сообщение от Yuna
? в смисле нельзя

ну доступа к нему нет, ошибка 403, проверял и на локалхосте и во всех сайтах с этим движком

Yuna 13.07.2009 19:35

Видимо у вас что -то не так, вызвать его напрямую можно...
Только он доступен-то модератором только т.к это против них XSS

Rostov114 02.08.2009 10:39

Новый сплоит от меня. Базируеться на сплоите от Qwazar.

На данный момент он умеет обходить:
  • Коды регистрации
  • Запросы инвайтов
  • Бан по IP

Совершает атаки через:
  • ./rss.php
  • ./requests.php
  • ./takesignup.php
  • ./check_signup.php
  • ./viewoffers.php
  • Форум

Также имеет 2 способа работы:
  • Multi mode - атака по всем файлам, в том числе авторигистрация.
  • Qwazar exploit mode - работает как вторая версия эксплоита от Qwazar

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

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

Внимание: Данная программа выложена здесь для ознакомления.
Автор не несёт ответственности за негативные последствия, причинённые данной программой в результате правильного или неправильного её использования.
Также автор не несет ответственности за причерченный вред кому либо данной программой.

HAXTA4OK 05.08.2009 23:15

как еще можно залить шелл??кроме блоков

Yuna 07.08.2009 13:00

Цитата:

Сообщение от Rostov114
Новый сплоит от меня. Базируеться на сплоите от Qwazar.

Спасибо за сплоит, пару багов закрыл ;)

Цитата:

Сообщение от HAXTA4OK
как еще можно залить шелл??кроме блоков

Если лишних модов не ставились, и баги в rss.php и прочие закрыты - никак.

1ce666 07.08.2009 15:02

Делись фиксами :D

HAXTA4OK 07.08.2009 18:51

Цитата:

Сообщение от Yuna
Спасибо за сплоит, пару багов закрыл ;)


Если лишних модов не ставились, и баги в rss.php и прочие закрыты - никак.


зарегай меня там...а то скока мылов у тебя блочены =) а новые версии интересны =)

Qwazar 07.08.2009 19:20

Цитата:

Сообщение от Yuna
Если лишних модов не ставились, и баги в rss.php и прочие закрыты - никак.

Можно, если есть доступ в админку. По крайней мере в той версии, что сейчас доступна для скачивания и во всех предыдущих. Палю превад (From ROA with love):

RFI/LFI:

В каталоге 'admin' вообще лежит файлик (core.php) следующего содержания:
Код:

$op = (!isset($_REQUEST['op'])) ? "Main" : $_REQUEST['op'];

foreach ($_GET as $key => $value)
        $GLOBALS[$key] = $value;
foreach ($_POST as $key => $value)
        $GLOBALS[$key] = $value;
foreach ($_COOKIE as $key => $value)
        $GLOBALS[$key] = $value;

require_once($rootpath . 'admin/functions.php');

Этот файл инклудится в admin.php . Который в свою очередь инклудится в admincp.php. (Файлы из /admin/ закрыты при помощи .htaccess)

т.е. :
Код:

http://test/tbdev/admincp.php?rootpath=[RFI/LFI]

Yuna 07.08.2009 23:00

Если ты про Remote Code inclusion - работаьтьб бдует только если register_globals = On

а про доступ к админке -не думаю что там уже нужно что-то больше ;)

Jokester 07.08.2009 23:10

Yuna
LFI порой бывает вполне достаточно. Вариантов масса.

Yuna 07.08.2009 23:38

LFI? расшифруй

Local file inclusion?

в данном случае он тоже не пройдет, кстаи такая фишка и в announce.php Тоже ;)

Qwazar 07.08.2009 23:41

Цитата:

Сообщение от Yuna
LFI? расшифруй

Local File Inclusion, вкрадце, мы в логи фигачим PHP код, а потом эти лог файлы инклудим. (как один из вариантов, есть ещё)

В общем, обычно этого достаточно чтобы на сервере получить полноценный веб-шелл.

З.Ы.
На последней версии доступной для скачивания, проходит на 100%.

Yuna 07.08.2009 23:45

Цитата:

На последней версии доступной для скачивания, проходит на 100%.
повторяю - если register_globals = On

Qwazar 07.08.2009 23:46

Цитата:

Сообщение от Yuna
повторяю - если register_globals = On

Неа, при Off

http://test2.ru/admincp.php?rootpath=../2.php%00

Это при

php_flag register_globals Off
php_flag magic_quotes_gpc Off

Нормально запускает 2.php

при magic_quotes_gpc On также есть вариант отрезать всё что после нашего имени файла (в соседних темах метод описан).

Yuna 07.08.2009 23:51

Цитата:

Сообщение от Qwazar
Неа, при Off

http://test2.ru/admincp.php?rootpath=../2.php%00

Это при

php_flag register_globals Off
php_flag magic_quotes_gpc Off

ммм, да, вижу в чем прикол =)) забавно
у аннонсера просто прикол тоже с rootpath + globals + разрешить fopen + url =))

Qwazar 07.08.2009 23:53

Цитата:

Сообщение от Yuna
ммм, да, вижу в чем прикол =)) забавно
у аннонсера просто прикол тоже с rootpath + globals + разрешить fopen + url =))

Угу, при глобалс он права админа не нужны :)

Yuna 08.08.2009 00:09

можно сделать попроще - доступ к admincp.php - там тоже проверку если ты админ - проблему решает, не на 100%, но решает.

Qwazar 08.08.2009 00:17

Цитата:

Сообщение от Yuna
можно сделать попроще - доступ к admincp.php - там тоже проверку если ты админ - проблему решает, не на 100%, но решает.

Нельзя решать проблему не на 100%, к тому же мой метод пашет только для админа и так. Лучше заменить $rootpath на чтото типа dirname(__FILE__), или путь к корню дефайном куда нибудь засунуть, в общем избавиться от переменной.

P.S.
А вообще надо думать нафига вот такой кусок кода вообще нужен, т.к.он заведомо будет являться причиной уязвимостей, даже если конкретно эту пофиксить. (Там при добавлении каких нибудь модулей к примеру, ну или может где нибудь ещё какая переменная в админке инклудится, а не только $rootpath)


Время: 05:28