Как продемонстрировать эксплойт экстракта ($ _ POST)? - PullRequest
17 голосов
/ 01 октября 2010

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

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

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

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

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

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

Спасибо

Ответы [ 3 ]

16 голосов
/ 01 октября 2010

Для оценки "может" попробуйте это:

Файл: htdocs / mix / extract.php

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

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

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

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

string (4) "test"

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

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

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

Если вы используете извлечение вот так:

extract ($ var, EXTR_SKIP);

extract ($var, EXTR_PREFIX_SAME, 'prefix');

extract ($ var, EXTR_PREFIX_ALL, 'prefix');

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

9 голосов
/ 01 октября 2010

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

Edit:

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

1 голос
/ 01 октября 2010

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

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

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

Сильные общие аргументы против глобального извлечения () см. Что не так с extract ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...