我不是 PHP开发人员,但我正在评估PHP5应用程序的安全性.
作者依赖extract($_POST)并extract($_GET)在某些地方,不在职能范围内.
我的建议是相应地调用extract($_POST, EXTR_PREFIX_ALL, 'form')和更改代码,但他的立场是任何变量在后续包含中被重新定义.
例如,我可以通过提供_ENV=somethingpost值来轻松更改超全局,但是superglobals是数组,我将它们变成字符串,我不确定它是否会产生邪恶效果.
我可以看看几个isset()用途并从那里向后退.但我想有这种攻击不需要知识或占卜来源.
是否有一些有趣的变量可以设置/更改,也许在PHP的内部?
谢谢
ITr*_*ubs 16
要评估"可能",请尝试以下方法:
文件:htdocs中/混合/ extraction.php
Run Code Online (Sandbox Code Playgroud)<?php extract($_GET); var_dump($_SERVER);//after extract ?>
并称之为:
在我的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, '前缀');
那么你将非常安全.
数据库连接的通用名称是$ 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,看看你能得到它的阅读之外您的权限级别的文件.