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

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

В своих местах автор использовал extract($_POST) и extract($_GET) за пределами функций.

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

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

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

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

Спасибо

Ответы

Ответ 1

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

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

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

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

http://localhost/mix/extraction.php?_SERVER=test

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

string (4) "test"

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

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

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

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

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

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

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

тогда вы будете в полной безопасности.

Ответ 2

Общее имя для подключения к базе данных - $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 или другие забавные вещи, хотите испортить итерации? Pass array('i' => 5) для извлечения, есть всевозможные развлечения, которые вы можете иметь в зависимости от области.

Edit:

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

Ответ 3

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

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

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

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