Статьи Php Underground

Discussion in 'Статьи' started by Robin_Hood, 14 May 2007.

  1. Robin_Hood

    Robin_Hood Elder - Старейшина

    Joined:
    30 Oct 2006
    Messages:
    144
    Likes Received:
    155
    Reputations:
    47
    Оригинальную статью на английском можно заценить тут -
    http://www.playhack.net/view.php?type=1&id=22


    -[ INFOS ]-----------------------------------------------------------------------

    Title: "PHP Undergroud Security"
    Author: Omnipresent
    E-Mail: [email protected] - [email protected]
    Website: http://omni.playhack.net - http://www.playhack.net
    Date: 2007-04-12

    ---------------------------------------------------------------------------------


    -[ SUMMARY ]---------------------------------------------------------------------

    0x00: Начнем..
    0x01: Глобальные переменные.. Осторожно
    [*] Patching
    0x02: File Inclusion
    [*] Patching
    0x03: XSS
    0x04: SQL Injection
    \_ 0x04a: Login Bypass
    \_ 0x04b: 1 Query? No.. 2 one!
    [*] Patching
    0x05: File Traverse
    [*] Patching
    0x05: Заключение



    ---------------------------------------------------------------------------------



    ---[ 0x00: Let"s start.. ]


    В этом туториале я объясню основные PHP уязвимости и ошибки, расскажу про то как
    их использовать и не допускать их.

    Удачи!


    -----------------------------------------------------------------------------[/]


    ---[ 0x01: Глобальные переменные, осторожнее!]


    В PHP не нужно декларировать переменные, это отличная вещ для кодера, переменные
    создаются "автоматически" когда нужно.
    Отличная вещь... Иногда
    PHP, как известно, также принимает данные от пользователя, обрабатывая их. Если
    мы не определили переменную до её использования могут возникнуть проблемы,
    касающиеся безопасности приложений. Для примера, взглянем на следующий код:

    PHP:

        
    if ($is_admin == 1) {
            
    //Да, я админ, открываем админ.панель
            
    [...]
        } else {
            
    //Нет, не админ
            
    [...]
        }
    Как можно увидеть, $is_admin не определена раньше, поэтому мы легко
    можем получить несанкционированный доступ к админ.панели.
    Да, но как? Просто:

    http://remote_host/bugged.php?is_admin=1

    ---[ Patching ]---

    Как защитится от этого? Просто: задекларировать $is_admin до блока IF,
    примерно так:

    PHP:
    $is_admin 0;

    [...]

        if (
    $is_admin == 1) {
            
    //Yes, I"m the admin so call the Administration Pannel
            
    [...]
        } else {
            
    //No, I"m not the admin
            
    [...]
        }
    -----------------------------------------------------------------------------[/]


    ---[ 0x02: File Inclusion]


    -----[Local File Inclusion]


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

        
    include "/users/".$include_path.".php";
        [...]
    ?>
    $include_path не задекларированная до использования, поэтому можно поместить в
    переменную любое значение, к примеру то же /etc/passwd.
    Для этого просто нужно модифицировать include_path в URL; к примеру

    http://remote_host/bugged.php?include_path=../../../../etc/passwd%00

    В результате мы получим
    PHP:
    <?php

        
    include "/users/../../../../etc/passwd%00.php"
        
    [...]
    ?>
    - [ NOTE ] -

    А что такое %00? Это означает нулевой символ, который "удаляет" расширение PHP.
    Если мы пропустим нулевой байт, мы сможем смотреть ТОЛЬКО .php файлы, потому что
    расширение подключаемого файла - PHP (include "/users/".$include_path.".PHP")


    -------------------------------------------------------------------------------

    -----[ Remote File Inclusion]


    Возьмем следующий код:

    PHP:
    <?php

        
    [...]

            include(
    $_GET["pag"]);

        [...]

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

    Пример один: (доступ к машине)

    http://remote_host/inc.php?pag=[Evil Script - our shell located on our server]

    Пример 2: (просмотр файлов)

    http://remote_host/inc.php?pag=/etc/passwd

    ---[ Patching ]---

    Какое решение? подтверждать ввод. Один из многих методов - создать список
    разрешенных страниц, как показано ниже:

    PHP:
    [...]

        
    $pag $_GET["pag"];

        
    $pages = array("index.php""alfa.php""beta.php""gamma.php");
        
            if(
    in_array($pag$pages))
            {
                include(
    $pag);
            {
                else
                {
                die(
    "Hacking Attempt!");
                }

    [...]
    -----------------------------------------------------------------------------[/]

    ---[ 0x03: XSS]


    Хочешь узнать про XSS?

    Мой партнер написал большую статью про это, а я не вижу смысла писать об этом
    дважды, поэтому держите:


    [+] "Cross-Site Scripting for Fun and Profit"
    http://www.playhack.net/view.php?type=1&id=18

    [+] "Applying XSS to Phishing Attacks"
    http://www.playhack.net/view.php?type=1&id=20

    -----------------------------------------------------------------------------[/]

    ---[ 0x03: SQL Injection]

    С помощью SQL Injection, как видно из названия, можно внедрить произвольный SQL
    Code в уязвимое приложение.


    ------[ 0x04b Login Bypass ]

    До того как мы начнем с небольшого примера, нужно узнать несколько вещей про SQL:

    - (")кавычка. В SQL это оператор разграничивает строки, что важно для поиска
    уязвимостей.

    - (#)комментарий. Означает, что мы пытаемся сделать комментарии. Запомните, это
    важно и нужно!

    - (;)Это значит мы делаем новый запрос.. легко

    После небольшого перерыва на важные операнды, приступим к первому примеру. Обход
    Логина - Получаем права администратора

    PHP:
    <?php

        
    // login.php
            
        
    $nick $_POST["nick"];
        
    $pass $_POST["pass"];

        
    $link mysql_connect("localhost""root""root") or die("Error: ".
            
    mysql_error());

        
    mysql_select_db("sql_inj"$link);


    $query mysql_query("SELECT * FROM sql_inj WHERE nick ="".$nick."" 
    AND pass ="" .
    $pass. """
    $link);

    if (
    mysql_num_rows($query) == 0) {
    echo 
    "<script type="text/javascript">window.location.href="index.html";
    </script>"
    ;
    exit;
    }

        
    $logged 1;

        [...]

        
    //EoF

        
    ?>
    Этот скрипт очень простой, но очень полезный, для того чтобы узнать
    немного о SQL Injection.
    Как мы видим, переменные $nick и $pass не обработаны должным образом до того
    как они были использованы в запросе, поэтому можем вставить код.. наш SQL код.

    Посмотрим на запрос:

    "SELECT * FROM sql_inj WHERE nick ="".$nick."" AND pass ="" .$pass. """

    Что случится, если мы передадим две переменные, испорченные как тут:

    $nick = 1" OR "1" = "1
    $pass = 1" OR "1" = "1

    Новый запрос будет:

    "SELECT * FROM sql_inj WHERE nick ="1 OR "1" = "1" AND pass ="1" OR "1" = "1""


    Понятно? нет? Ладно, объясню более понятно..

    Если ты хоть немного знаешь о таблицах истинности, тебе будет легко понять..

    1 OR 1 = 1 ??


    Один или один эквивалентно один? Да, правильно

    А кто первый пользователь в таблице "sql_inj"?
    Тот кто установил приложение? Да! Админ)

    Итак, мы вошли как первый пользователь, а первый пользователь - админ=)

    Также мы можем задать следующий запрос:

    $nick = 1" OR "1" = "1" #
    $pass = what_we_want_to_put


    Новый запрос будет:

    "SELECT * FROM sql_inj WHERE nick ="1 OR "1" = "1" #
    AND pass = what_we_want_to_put"


    Как сказано выше, "#" означает что все что идет после оператора, является
    комментарий.
    НОВЫЙ запрос:

    "SELECT * FROM sql_inj WHERE nick ="1 OR "1" = "1"


    И мы опять Админ)

    ------[ 0x04b: 1 Query? No.. 2 one! ]


    С SQL Injection мы можем модифицировать запросы, изменять даты, обновлять
    профили и многое другое...
    Посмотрим на следующий код:
    PHP:
    <?php

    //email.php

    [...]

    $email $_POST["email"];

    [...]

    $query mysql_query("SELECT email, passwd, user_name FROM users WHERE email = 
    "".
    $email.""");
    [...]

    ?>
    Что мы здесь видим? $email не объявлена до использования..отлично!
    Мы можем использовать это и.. к примеру, обновить базу данных, вводя новый
    запрос вроде этого:

    $email = x"; UPDATE users SET email = "[email protected]"
    WHERE email = "[email protected] ";

    новый запрос будет такой:

    SELECT email, passwd, user_name FROM users
    WHERE email = " x"; UPDATE users SET email = "[email protected]"
    WHERE email = "[email protected] ";

    Здесь, нападающий обновил таблицу "users", изменив админский email на свой.
    К примеру, со скриптом "Восстановление пароля", он может ввести свой email
    ([email protected])
    и получить письмо вроде такого:

    From: [email protected]
    To: [email protected]
    Subject: Login Password

    Ehy.. take it ;)

    Username: Admin
    Password: 12345

    Regards,
    Admin


    ---[ Patching ]---

    Для того чтобы пропатчить скрипты мы можем немного изменить php.ini файл:

    1. set magic_quotes_gcp to On

    Это позволит избежать кавычки в:
    -COOKIE
    -POST
    -GET

    2 использовать addslashes()

    Это позволит экранировать кавычки

    3. htmlspecialchars()

    Будет конвертировать спец. символы в HTML формат

    4. mysql_escape_string()

    Функция экранирует все спецсимволы в unescaped_string, вследствие чего,
    её можно безопасно использовать в mysql_query().

    5. Смотрите php.net, для использования других фунцкий

    6. Проверьте входные данные пользователя, как в примере ниже:

    $user_id = (int)$_GET["user_id"];

    $user_id это всегда целое число и можем отбросить ненужные вход. данные
    для безопасности.



    -----------------------------------------------------------------------------[/]


    ---[ 0x05: File Traverse ]


    Траверсинг файловой системы действительно важный и критический баг.

    Когда мы используем файл, мы должны индифитицировать имя файла и путь до него в
    указателях до скрипта. Во многих случаях, имя файла задается пользователем,
    аргумент задается в функцию fopen(), как здесь:

    PHP:
    <?php

    [...]

        
    $fp fopen("/path/{$_GET["filename"]}.txt""r");

    [...]

    ?>
    В этом скрипте есть уязвимость, потому что "filename" может быть задано
    удаленным пользователем. In this case the attacker can traveses the
    filesystem by using multiple instances of "../" to move up to the directory
    tree and see other files.

    К примеру:
    http://remote_host/path/bug.php?filename=../../../../path_of_another_file/file%00

    Всегда помните, что нулевой байт используется во многих атаках для удаления
    файлового расширения, задаваемого скриптом.

    ---[ Patching ]---

    Отличное решение пропатчить этот скрипт - использовать basename(), как показано
    в скрипте ниже:

    PHP:
    <?php
     
        $clean 
    = array(); 
        
        if (
    basename($_GET["filename"]) == $_GET["filename"]) 
            { 
                
    $clean["filename"] = $_GET["filename"]; 
            } 
        else 
            { 

                [...]

            } 

    $fp fopen("/path/{$clean["filename"]}.txt""r");


    ?> 
    -----------------------------------------------------------------------------[/]


    ---[ 0x06: Заключение ]


    Это конец статьи "PHP Undergroud Security", и я надеюсь она поможет вам
    обезопасить PHP code!

    При любых проблемах пишите на [email protected] или
    [email protected].



    -----------------------------------------------------------------------------[/]

    \======================================[EOF]=====================================/

    © milw0rm.com [2007-04-12]


    © перевод Robin_HOOD@GFS
    Спасибо Neminem за помощь в переводе
     
    4 people like this.
  2. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    А ещ проще попросить админа нормально настроить сервер, чтобы такого не было.

    А тогда почему мы ее сравниваем, если она не определена? Лол блин. придумай другой пример ;)
    Правда потом посмотри на камент выше и... )

    \0 вообще-то

    мм, а если GET пустое? =) Выдаст ошибку(нотайс) на девелоперской тачке, которую трудно не заметить

    Наконец то в пхп6 эту хрень отменят, чтобы криворуким недокодерам пришлось учить основы SQL.



    P.S. очень не понравилось.
    Сто раз одно ито же писать не надоело?
     
  3. vmn

    vmn Elder - Старейшина

    Joined:
    16 Oct 2006
    Messages:
    26
    Likes Received:
    12
    Reputations:
    3
    Что-то у меня большие сомнения насчет update в mysql через инъекцию.
     
  4. Validol

    Validol Elder - Старейшина

    Joined:
    15 Dec 2006
    Messages:
    177
    Likes Received:
    57
    Reputations:
    7
    На вкус и цвет карандаши разные...
    Есть и плюсы и минусы.
    +...
    С лекарствами.

    -...
    Мало и комментарии других форумчан не радуют.
     
  5. vmn

    vmn Elder - Старейшина

    Joined:
    16 Oct 2006
    Messages:
    26
    Likes Received:
    12
    Reputations:
    3
    Ну-ну приведи пример хоть одной рабочей инъекции в mysql где будет что-то наподобие id=-1;update .... /*
     
  6. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    nerezus +1
    громкое название, а контент банален=\

    ЗЫ http://www.xakep.ru/magazine/xa/090/072/1.asp
    имхо лучшая статья на эту тему (by Zadoxlik)
     
    _________________________
  7. D1mOn

    D1mOn Elder - Старейшина

    Joined:
    2 Oct 2005
    Messages:
    380
    Likes Received:
    144
    Reputations:
    29
    Полностью согласен с Нерезусом...
     
  8. Pridu_ROCK

    Pridu_ROCK Member

    Joined:
    11 Apr 2005
    Messages:
    15
    Likes Received:
    7
    Reputations:
    0
    Так енту же статью он сам не писал он ей ПЕРЕВОДИЛ =\
     
  9. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Тока вот я смысла в переводе не вижу=\
     
    _________________________
  10. Pridu_ROCK

    Pridu_ROCK Member

    Joined:
    11 Apr 2005
    Messages:
    15
    Likes Received:
    7
    Reputations:
    0
    Я Робина знаю, как он говорил он просто ради тренировки сделал переводик (тоесть чисто в сугубо личных целях =) ). Хотя я тоже в ентой статье нечего нового не вижу.....
    Хотя если подумать много ли нового по теме Php(защита) было в последнее время написанно....... =\
     
  11. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Название должно быть Начинаем безопасно програмировать на php, а не андеграунд.
     
  12. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Учитывая баги _самого_ пхп (т.е. unset, import_request_variables итп) ничего. Их ни в одной статье не затронули почти=\ Так же как и защиту от них. адвизори не в счёт=\
     
    _________________________
  13. NeMiNeM

    NeMiNeM Elder - Старейшина

    Joined:
    22 Aug 2005
    Messages:
    480
    Likes Received:
    310
    Reputations:
    201
    Тоха,

    Весь удар на меня должен быть)))
    Эт я ему сказал эту статью попробовать перевести=) Посмотрел что на милворме было достаточно много просмотров и относительно недавно написана: 2007-04-12 и контент сам по себе не очень сложный для перевода был.

    Согласен, что нового там нет ничего, но "повторение мать учения"=))
    Да и оригинальное и интересное теперь редко встречается =\

    Парень просто потренировался и попытался что-то сделать для форума)
    Не суди так строго ;)
     
  14. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Ну на милворм заходят все кому не лень + всех интригует гордое название "ПоХаПэ Ондерграун"=\
     
    _________________________
  15. NeMiNeM

    NeMiNeM Elder - Старейшина

    Joined:
    22 Aug 2005
    Messages:
    480
    Likes Received:
    310
    Reputations:
    201
    Согласен =\
    Вообщем, my mistake..
    Сам хорошо не проанализировал перед тем, как советовать челу(
     
  16. Robin_Hood

    Robin_Hood Elder - Старейшина

    Joined:
    30 Oct 2006
    Messages:
    144
    Likes Received:
    155
    Reputations:
    47
    NeMiNeM у меня в принципе и свой моск должен быть, но я чесно гря просто тренировался в переводе, поэтому просьба строго не судить)
    а все вышеизложеное учту)