Как продемонстрировать эксплойт 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()?