如何演示extract的漏洞利用($ _ POST)?

Mar*_*ani 17 php security

不是 PHP开发人员,但我正在评估PHP5应用程序的安全性.

作者依赖extract($_POST)extract($_GET)在某些地方,不在职能范围内.

我的建议是相应地调用extract($_POST, EXTR_PREFIX_ALL, 'form')和更改代码,但他的立场是任何变量在后续包含中被重新定义.

例如,我可以通过提供_ENV=somethingpost值来轻松更改超全局,但是superglobals是数组,我将它们变成字符串,我不确定它是否会产生邪恶效果.

我可以看看几个isset()用途并从那里向后退.但我想有这种攻击不需要知识或占卜来源.

是否有一些有趣的变量可以设置/更改,也许在PHP的内部?

谢谢

ITr*_*ubs 16

要评估"可能",请尝试以下方法:

文件:htdocs中/混合/ extraction.php

<?php
extract($_GET);
var_dump($_SERVER);//after extract
?>
Run Code Online (Sandbox Code Playgroud)

并称之为:

HTTP://localhost/mix/extraction.php _ SERVER =测试

在我的Xampp上提取后,输出看起来像这样:

string(4)"test"

如果任何人知道你的变量命名,你在$ _POST或$ _GET全局变量上使用extract,那么你就会遇到严重的问题.通过一些时间和工作,可以通过尝试和错误找出一些命名.

在不知道你的来源的情况下,入侵者可能会试图劫持任何全局变量,例如$ _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, '前缀');

那么你将非常安全.


Kri*_*ard 9

数据库连接的通用名称是$ db,但这会炸毁系统,您可以覆盖$ _SESSION变量.

session_start();

$_SESSION['test'] ='test';
var_dump($_SESSION);
$vars = array("_SESSION" => 'awww');
extract($vars);
var_dump($_SESSION);
Run Code Online (Sandbox Code Playgroud)

产量

array(1) {
  ["test"]=>
  string(4) "test"
}
string(4) "awww"
Run Code Online (Sandbox Code Playgroud)

覆盖变量$idUser或其他有趣的东西,想搞乱迭代?通过array('i' => 5)提取,根据范围,你可以有各种各样的乐趣.

编辑:

我只是想到了另外一个,如果形式HANDELING文件上传,为什么不尝试并覆盖命名变量$file,$fileName,$fileExtention,看看你能得到它的阅读之外您的权限级别的文件.