Как продемонстрировать эксплойт extract ($ _ POST)?

Я не разработчик PHP, но я оцениваю безопасность приложения PHP5.

Автор полагался на extract($_POST) и extract($_GET) в некоторых местах, за пределами функций.

Мое предложение состоит в том, чтобы вызвать extract($_POST, EXTR_PREFIX_ALL, 'form') и изменить код соответственно, но его позиция заключается в том, что любая переменная переопределяется внутри последующих включает в любом случае.

Я могу легко изменить суперглобалы, предоставив, например, _ENV=something внутри значений _ENV=something , но суперглобалы – это массивы, и я превращаю их в строки, я не уверен, что он может иметь злые эффекты.

Я мог бы взглянуть на несколько isset() и вернуться назад оттуда .. но я полагаю, что есть такие атаки, которые не требуют знания или гадания источника.

Есть ли какая-то интересная переменная, которая должна быть установлена ​​/ изменена, возможно, во внутренних PHP?

благодаря

Для оценки «возможно» попробуйте следующее:

Файл: HTDOCS / микс / extraction.php

 <?php extract($_GET); var_dump($_SERVER);//after extract ?> 

и назовите это так:

HTTP: //localhost/mix/extraction.php _SERVER = тест

После выделения на моем Xampp вывод выглядит примерно так:

string (4) "test"

Если кто-то знает что-нибудь о вашем именовании переменных, и вы используете извлечение на глобальные переменные $ _POST или $ _GET, у вас есть серьезная проблема. С небольшим количеством времени и работы можно было бы узнать некоторые прозвища в результате попыток и ошибок.

Не зная своего источника, злоумышленник может попытаться захватить любую глобальную переменную, такую ​​как $ _SESSION (но здесь это будет иметь какой-то эффект, только если вы выполните session_start (); перед извлечением ($ _ GET), $ _COOKIE или $ _SERVER и даже установите конкретные значения для них:

//localhost/mix/extraction.php?_SERVER[HTTP_USER_AGENT]=Iphone

Если вы используете такой экстракт:

экстракт ($ Var, EXTR_SKIP);

экстракт ($ Var, EXTR_PREFIX_SAME, 'префикс');

экстракт ($ Var, EXTR_PREFIX_ALL, 'префикс');

то вы будете совершенно в безопасности.

Общее имя для подключения к базе данных – $ db, но это просто взорвало бы систему, вы можете перезаписать переменную $ _SESSION.

 session_start(); $_SESSION['test'] ='test'; var_dump($_SESSION); $vars = array("_SESSION" => 'awww'); extract($vars); var_dump($_SESSION); 

вывод

 array(1) { ["test"]=> string(4) "test" } string(4) "awww" 

$idUser переменные $idUser или другие забавные вещи, хотите испортить итерации? Pass array('i' => 5) для извлечения, есть всевозможные развлечения, которые вы можете иметь в зависимости от области.

Редактировать:

Я просто подумал о другом, если форма обрабатывает загрузку файлов, почему бы не попробовать и не переписывать переменные с именем $file , $fileName , $fileExtention и посмотреть, можете ли вы заставить их читать файлы вне вашего уровня разрешений.

Я не знаю никакой универсальной эксплуататорской возможности.

Во всяком случае, это определенно ужасно плохая практика.

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

Для сильных общих аргументов против global extract () ing, см. Что это неправильно с extract ()?