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

时间:2010-10-01 09:06:47

标签: php security

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

作者在函数之外的某些地方依赖extract($_POST)extract($_GET)

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

我可以通过在post值中提供_ENV=something来轻松更改超全局,但是superglobals是数组,我将它们变成字符串,我不确定它是否会产生邪恶效果。< / p>

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

是否有一些有趣的变量需要设置/更改,可能在PHP的内部?

由于

3 个答案:

答案 0 :(得分:16)

评估“可能”试试这个:

  

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

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

并称之为:

  

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

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

  

string(4)“test”

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

在不知道你的来源的情况下,入侵者可能会试图劫持任何全局变量,例如$ _SESSION(但是如果你在提取($ _ GET),$ _COOKIE或$ _SERVER之前执行session_start(),它只会产生任何影响。甚至为它们设置了特定的值:

  

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

如果你使用这样的提取物:

  

提取物($变种,EXTR_SKIP);

     

提取物($变种,EXTR_PREFIX_SAME, '前缀');

     

提取物($变种,EXTR_PREFIX_ALL, '前缀');

那么你将非常安全。

答案 1 :(得分:9)

数据库连接的通用名称是$ 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)提取,根据范围,您可以享受各种乐趣。

修改

我只想到另一个,如果表单是handeling文件上传,为什么不尝试覆盖名为$file$fileName$fileExtention的变量,看看是否可以让它读取超出权限级别的文件。

答案 2 :(得分:1)

我不知道任何普遍的可利用性。

无论如何,这绝对是非常糟糕的做法。

脚本的作者所说的是脚本的安全性依赖于他不会忘记后续包含中的任何内容,这很可怕。

有关针对全局extract()的强大的一般参数,请参阅What is so wrong with extract()?