Я не разработчик 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 ()?