Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от взлома! Прошу тыкнуть на дырки!
 
 автор: Panker   (23.11.2006 в 10:31)   письмо автору
 
 

Дописал уже скриптик конкретный, и уже вылизываю ошибки, и на наличия дырок решил проверить, если не трудно тыкните, сто пудов знаю что есть :) но где ))

Просто покажу пару примеров скрипта на чём почти всё и работает, вы плиз скаждите как лучше :)
А то стока наговорили я не чего и не понял :)

Файл index.php


<?
       
include "config.php"//Стартует соединение с базой данных
    
    
include "plugins/stat.php"//Подключаем статистику посещения людей
    
    
include "plugins/search_bot.php"//Подключаем статистику посещения ботов
    
    
include_once('templars/xtemplate.class.php'); //Стартует подключение к шаблону сайта

    
$xtpl = new XTemplate('templars/standart/templars.xtpl'); //Обьявляем класс шаблонов

    
ob_start();        
    
$mod=$_GET["mod"];
    if(
$mod==""){$mod=index;}
    if (!IsSet(
$mod))
    {
    include 
"./modules/".$mod.".php";
    }
    else
    {                                                                                                
    include 
"./modules/".$mod.".php";
    }                                                                                            
    
$contents=ob_get_contents();                                                                
    
ob_end_clean();                                                                                  
?>


Тут есть дырки какиенить? или нет? вроде код маленький но кто то говорил что дырявый :(
Если не трудно плз подскажите :)

   
 
 автор: Loki   (23.11.2006 в 10:40)   письмо автору
 
   для: Panker   (23.11.2006 в 10:31)
 

>Тут есть дырки какиенить?
ну через $mod можно передать любое имя файла... причем, вместе с путем. Если не ошибаюсь, то расширение php можно отсечь нулевым символом... Короче, любой файл на сервере можно выполнить как php скрипт.
В общем, классическая дыра.

   
 
 автор: Panker   (23.11.2006 в 10:53)   письмо автору
 
   для: Loki   (23.11.2006 в 10:40)
 

хех ) действительно ))

http://newcms/?mod=../administration/password захожу так )) и хоп пароль спрашивают, хорошо что не чего не выводит и так далее, так как в админке не по шаблону сделано, но факт :)

   
 
 автор: Aac   (23.11.2006 в 12:38)
 
   для: Panker   (23.11.2006 в 10:53)
 

Что еще за нулевой символ??

   
 
 автор: Trianon   (23.11.2006 в 12:47)   письмо автору
 
   для: Aac   (23.11.2006 в 12:38)
 

chr(0)

   
 
 автор: Binura   (11.08.2007 в 01:06)   письмо автору
 
   для: Panker   (23.11.2006 в 10:31)
 


    if (!IsSet($mod)) 
    { 
    include "./modules/".$mod.".php"; 
    } 
    else 
    {                                                                                                 
    include "./modules/".$mod.".php"; 
    }   


подняла тему.. =) мне интересно для чего это? какая разница что будет перменная $mod или нет... одно и тоже

   
 
 автор: Trianon   (11.08.2007 в 01:17)   письмо автору
 
   для: Binura   (11.08.2007 в 01:06)
 

Я больше скажу. После строки $mod=$_GET["mod"]; она всегда будет существовать.

А в строке if($mod==""){$mod=index;} потенциальная дыра.
Если кто-то раньше по потоку объявит константу - то сможет загрузить собственный файл.

Сколько раз говорить, нотайсы отключать можно только программистам уровня cheops'a.

   
 
 автор: Binura   (11.08.2007 в 05:33)   письмо автору
 
   для: Trianon   (11.08.2007 в 01:17)
 

1)
>Если кто-то раньше по потоку объявит константу - то сможет загрузить собственный файл.

как это понять?по потоку? объявит константу? ты про GET? =))

2)
>Сколько раз говорить, нотайсы отключать можно только программистам уровня cheops'a.
что отключать? =))

   
 
 автор: Unkind   (11.08.2007 в 05:54)   письмо автору
 
   для: Binura   (11.08.2007 в 05:33)
 

1. Насчет загрузки своего файла Trianon ошибся. Все равно $mod вставляется в путь на сервере и указать URL не выйдет. Иначе если пользователь каким-то образом смог бы задать свое значение константе "index", то он бы мог загрузить свой скрипт.

2. Notice - замечание, которое может быть вызвано, допустим, вызовом несуществующей константы.

   
 
 автор: Trianon   (12.08.2007 в 00:54)   письмо автору
 
   для: Unkind   (11.08.2007 в 05:54)
 

>1. Насчет загрузки своего файла Trianon ошибся. Все равно $mod вставляется в путь на сервере и указать URL не выйдет. Иначе если пользователь каким-то образом смог бы задать свое значение константе "index", то он бы мог загрузить свой скрипт.

А вот это совсем не факт.
include'ов там сверху преизрядно. Достаточно одному оказаться слабеньким и ...

   
 
 автор: Unkind   (12.08.2007 в 11:55)   письмо автору
 
   для: Trianon   (12.08.2007 в 00:54)
 

include'ов там сверху преизрядно.
В том-то и дело, что они сверху. Эта потенциальная дыра ниже. Хотя, конечно, возможно в файле с модулем могут быть дыры.

   
 
 автор: Trianon   (12.08.2007 в 12:08)   письмо автору
 
   для: Unkind   (12.08.2007 в 11:55)
 

>include'ов там сверху преизрядно.
>В том-то и дело, что они сверху. Эта потенциальная дыра ниже. Хотя, конечно, возможно в файле с модулем могут быть дыры.

Оставляя обращение к контенту через неопределенную константу (или переменную - неважно) программист расширяет область ответственности за возникновение потенциальной уязвимости с одной строчки до всего кода выше нее, включая все файлы которые могут инклудить данный файл. Вот что я имел в виду под дырой.

Интересно, куда делось мое исходное сообщение?

   
 
 автор: zxcAq   (11.08.2007 в 02:30)   письмо автору
 
   для: Panker   (23.11.2006 в 10:31)
 

Нужно регуляркой отрезать всё, кроме букв и цифр(если нужны) в переменной $mod и всё будет хорошо)

   
 
 автор: parczynski   (11.08.2007 в 02:48)   письмо автору
 
   для: Panker   (23.11.2006 в 10:31)
 

По моему безопаснее в параметре mod передавать не название страницы, а какой-либо ключ соответствующий этой странице, а путь к странице выбирать либо
1. при помощи switch, уже в зависимости от mod,
2. либо хранить путь в массиве типа
$files = array (1 => "index.php",
...)
а потом получать его вот так $files[$mod].
в любом из 2-х случаев уже не получиться открыть левый файл из вашего скрипта.

   
 
 автор: Binura   (11.08.2007 в 05:44)   письмо автору
 
   для: Panker   (23.11.2006 в 10:31)
 

>

><?
>    $mod=$_GET["mod"];
>    if(
$mod==""){$mod=index;}
>    if (!IsSet(
$mod))
>    {
>    include 
"./modules/".$mod.".php";
>    }
>    else
>    {                                                                                                
>    include 
"./modules/".$mod.".php";
>    }                                                                                            
>    
$contents=ob_get_contents();                                                                
>    
ob_end_clean();                                                                                  
>
?>
>


и вот мне все равно не понятно... как?
ладно с расширением я поняла, ставим 0байт перед ним...

но как же ./modules/ ?
он все равно будет....

получется ./modules/http://hack.ru/hello.php%00.php
это может навредить? =(

может вообще удалять с подобных мест 'http://'
или
$mod = str_replace(chr(0), '', $mod);

   
 
 автор: Sobachka   (11.08.2007 в 09:22)   письмо автору
 
   для: Binura   (11.08.2007 в 05:44)
 

имееться ввиду лоакльный файл подгрузить например.. имея паралельный доступ на сервер (например хостинг) загрузить в /tmp файл shell.php а дальше ?mod=../../../../../../../../../tmp/shell :)

   
 
 автор: Unkind   (11.08.2007 в 09:26)   письмо автору
 
   для: Sobachka   (11.08.2007 в 09:22)
 

но вроде как в пхп 5 этого уже нету
Лёха, не пугай меня. NUL-байт (0x00) с PHP вообще не связан.

   
 
 автор: Sobachka   (11.08.2007 в 09:50)   письмо автору
 
   для: Unkind   (11.08.2007 в 09:26)
 

>Лёха, не пугай меня. NUL-байт (0x00) с PHP вообще не связан.
Ога... я не спал ещё... тежело думаецо =) ну я убрал ещё до того как ты писал :-p

   
 
 автор: parczynski   (11.08.2007 в 20:55)   письмо автору
 
   для: Unkind   (11.08.2007 в 09:26)
 

Что-то я на счет нулевого байта не понял, как это с PHP не свзяан? на сколько я знаю он отрезает всю строку после себя. и передается вот так %00, а избежать этого можно, вклдючив magic_quotes_gpc = ON, тогда он просто экранируется
Конечно я могу ошибаться, или просто что-то не так понял, тогда поправьте меня пожалуйста и еще особо не бейте: я хороший, пригожуся.

   
 
 автор: stas1987   (12.08.2007 в 08:24)   письмо автору
 
   для: parczynski   (11.08.2007 в 20:55)
 

Lichno ya sozdal sebe functiu tipa


<?php
function safe($x,$length FALSE){
$x=trim($x);
$x=htmlspecialchars($x);
 if(!
get_magic_quotes_gpc()){   // Ne pomnyu pravilnogo nazavaniya, esli chesno - pishu po pamyati
$x=mysql_escape_string($x);
}
$x=str_replace('%',' percent',$x);
$x=str_replace('\n','<br>',$x);
if(
is_numeric($length)){
 
$x=substr($x,0,$length);
}
return 
$x;
}

$var safe($_POST['name'],50);
?>

   
 
 автор: Ralph   (12.08.2007 в 09:15)   письмо автору
 
   для: stas1987   (12.08.2007 в 08:24)
 

Блин,вбывав бы гадив... :-D Раньше носились с идеей создать философский камень,превращающий все в золото,теперь-с универсальной функцией защиты,защищающей от всего (кстати,в этой функции забыли еще применить strip_tags)... а если в переменной пользователя не текст,а зашифрованный пароль передается ? После trim'а и htmlspecialchars'а-пипец паролю наверняка...

   
 
 автор: stas1987   (15.08.2007 в 19:37)   письмо автору
 
   для: stas1987   (12.08.2007 в 08:24)
 

Не хер значит передавать зашифрованные пароли.

А функция не универсальная, это, скажем, небольшое решения для проверки ввода данных. Чтоб не вводили, то что не нужно

   
 
 автор: Trianon   (15.08.2007 в 19:52)   письмо автору
 
   для: stas1987   (15.08.2007 в 19:37)
 

>Не хер значит передавать зашифрованные пароли.
А по-моему, куда разумнее не применять этот код.

>А функция не универсальная, это, скажем, небольшое решения для проверки ввода данных.
>Чтоб не вводили, то что не нужно

Сделать так, чтоб некоторые еще и не советовали то, что ненужно, куда сложнее.
Функцией тут не обойдешься.

   
 
 автор: Ralph   (15.08.2007 в 20:52)   письмо автору
 
   для: stas1987   (15.08.2007 в 19:37)
 

Говорите,нехер передавать шифрованные пароли...В таком случае рекомендую вставить в ваши скрипты строку :echo 'Введите пароль (напоминаю,ваш пароль -76800912)'... По моему мнению,любой,кто передает пароль в открытом виде в кукисах(пост,гет)-потенциальный мазохист-самоубийца...

   
 
 автор: Ralph   (15.08.2007 в 20:59)   письмо автору
 
   для: Ralph   (15.08.2007 в 20:52)
 

И вообще,как правильно заметил не помню кто,если бы была универсальная функция защиты от всего,то разработчики php (люди,по моему,отнюдь не глупые),давно ввели нечто вроде $a=protect($_GET['login'].и что значит-чтобы не вводили что не надо ? А если надо мат.формулу ,где должны быть и > и < ???

   
 
 автор: Unkind   (15.08.2007 в 21:07)   письмо автору
 
   для: Ralph   (15.08.2007 в 20:52)
 

По моему мнению,любой,кто передает пароль в открытом виде в кукисах(пост,гет)-потенциальный мазохист-самоубийца...
Как Вы прошли аутентификацию? Вы потенциальный мазохист-самоубийца?

   
 
 автор: Ralph   (15.08.2007 в 21:20)   письмо автору
 
   для: Unkind   (15.08.2007 в 21:07)
 

Да-один раз,при регистрации,в противном случае ,увидев ВТОРОЙ РАЗ мой пароль в открытом виде ,я навсегда покину такой ресурс (или вы не понимаете,о чем речь,или одно из двух...)

   
 
 автор: Unkind   (15.08.2007 в 21:25)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:20)
 

увидев ВТОРОЙ РАЗ мой пароль в открытом виде ,я навсегда покину такой ресурс
Посмотрите исходный HTML-код страницы.


<input size=25 class=input type=password name=pswrd size=61 maxlength=100 value='Тут_Ваш_пароль_в_отрытом_виде'>


Вы что, собираетесь сейчас покинуть этот ресурс навсегда?

вы не понимаете,о чем речь
А Вы понимаете?

   
 
 автор: Trianon   (15.08.2007 в 21:27)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:20)
 

Отвечая на сообщение, просто откройте исх. текст HTML страницы с формой ответа и поищите там type=password

   
 
 автор: Ralph   (15.08.2007 в 21:28)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:20)
 

Для особо непонятливых-повторю еще раз:человек изложил свою функцию,я обьяснил,что во многих случаях она не подойдет,он мне ответил,что не стоит передавать пароль в зашифрованном виде,я ответил,что он неправ...Вы мне возразили,то есть вы считаете,чтоб все же стоит передавать пароль пользователя в открытом незакодированном виде ???

   
 
 автор: Unkind   (15.08.2007 в 21:29)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:28)
 

Для особо непонятливых-повторю еще раз
Уж кто непонятливый, так это Вы. :) Какая бы дрянная и бесполезная функция ни была, он имел ввиду не нужно передавать зашифрованный пароль самой функции.

   
 
 автор: Trianon   (15.08.2007 в 21:37)   письмо автору
 
   для: Unkind   (15.08.2007 в 21:29)
 

>Какая бы дрянная и бесполезная функция ни была, он имел ввиду не нужно передавать зашифрованный пароль самой функции

Дряную и бесполезную функцию нужно выкинуть. Тогда не представится оказии ей что-то передать.
И в этом Ralph прав абсолютно.

   
 
 автор: Trianon   (15.08.2007 в 21:33)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:28)
 

>то есть вы считаете,чтоб все же стоит передавать пароль пользователя в открытом незакодированном виде ???

Нет, конечно. Это плохо. И с этим активно несогласны пожалуй лишь администраторы форума.

Я Вам возразил, потому что считаю, что Вам стоит быть сдержаннее в выражениях.
Unkind, я уверен - тоже.
А то придется наклеиться на собственный ярлык. Либо покинуть ресурс.

   
 
 автор: Ralph   (15.08.2007 в 21:35)   письмо автору
 
   для: Unkind   (15.08.2007 в 21:07)
 

Обьясню еще раз для особо одаренных:человек написал функцию,я ответил,что не во всех случаях она пригодна,он ответил,что не стоит передавать пароль в зашифрованном виде,я ответил,что он неправ...То есть вы за то,чтобы пароль передавался в открытом виде постоянно ?

   
 
 автор: Unkind   (15.08.2007 в 21:39)   письмо автору
 
   для: Ralph   (15.08.2007 в 21:35)
 

я ответил,что не во всех случаях она пригодна
А Вы её собираетесь для всех случаев использовать? :)

он ответил,что не стоит передавать пароль в зашифрованном виде
Функции не стоит передавать. Никто Вас не просит передавать шифрованный пароль фукнции. Никто.

я ответил,что он неправ
Очень необдуманно.

То есть вы за то,чтобы пароль передавался в открытом виде постоянно ?
Я считаю, как и Trianon, что Вам надо обдумывать ответ, прежде чем нажать "Отправить".

   
 
 автор: Ralph   (15.08.2007 в 22:04)   письмо автору
 
   для: Unkind   (15.08.2007 в 21:39)
 

Функции не стоит передавать...ГДЕ Я ПИСАЛ О ПЕРЕДАЧЕ ФУНКЦИИ ??? По моему,вы не хотите вникнуть в суть вопроса,а просто придраться к словам...Поверьте,я это умею не хуже вас...А если вас раздражает то,что я смею кому-то перечить,то...уж извините,мне плевать на статус,я выскажу,как оно есть.Буду неправ-признаю это,нет-буду бороться за свою точку зрения до конца.Кстати,спасибо за инфу,что в этом форуме пароль открыт...

   
 
 автор: Ralph   (15.08.2007 в 22:08)   письмо автору
 
   для: Ralph   (15.08.2007 в 22:04)
 

Извиняюсь за флуд,с телефона не сразу увидишь,кэширована страница или нет...

   
 
 автор: Unkind   (15.08.2007 в 22:12)   письмо автору
 
   для: Ralph   (15.08.2007 в 22:08)
 

Извиняюсь за флуд,с телефона не сразу увидишь,кэширована страница или нет...
Вот лучше поднимите тему - http://softtime.ru/forum/authorthmes.php?id_author=2453&id_forum=1. А то про неё забыли.

   
 
 автор: Unkind   (15.08.2007 в 22:10)   письмо автору
 
   для: Ralph   (15.08.2007 в 22:04)
 

ГДЕ Я ПИСАЛ О ПЕРЕДАЧЕ ФУНКЦИИ ???

а если в переменной пользователя не текст,а зашифрованный пароль передается ? После trim'а и htmlspecialchars'а-пипец паролю наверняка...
А как это понимать? Каким таким образом зашифрованный пароль попадет "под раздачу" trim'а и прочих функций, присутствующих в функции stas1987'а?

Вы странный человек. Говорите и тут же забываете.

   
 
 автор: Ralph   (15.08.2007 в 22:23)   письмо автору
 
   для: Unkind   (15.08.2007 в 22:10)
 

Возьмите пароль и шифраните через AES_ENCRYPT.и когда у вас первый байт пароля будет %20 или любой байт пароля равен %26,тогда посмотрим...Или вы считаете,что все функции кодирования пароля ограничиваются md5 с его диапазоном (0-9a-f) ???

   
 
 автор: Unkind   (15.08.2007 в 22:40)   письмо автору
 
   для: Ralph   (15.08.2007 в 22:23)
 

Скажите мне, пожалуйста, при чем тут обработка бинарных данных строковыми функциями? Я разве спорил по этому поводу?

   
 
 автор: Ralph   (15.08.2007 в 22:57)   письмо автору
 
   для: Unkind   (15.08.2007 в 22:40)
 

Все,оффтоп зашел слишком далеко...Всем желающим отвечать в теме раздела "разное",тема "Trianon & Unkind vs Ralph",а эту тему засирать не стоит...

   
 
 автор: Unkind   (12.08.2007 в 12:09)   письмо автору
 
   для: parczynski   (11.08.2007 в 20:55)
 

Что-то я на счет нулевого байта не понял, как это с PHP не свзяан?
NUL-байт и его значение в компьютерном мире - не заслуга программистов PHP. Поэтому, то, что в PHP он может появится, а может пропасть сказано, мягко говоря, необдуманно. Но по заверению автора того поста, он еще спал. :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования