如何演示对 extract($_POST)的攻击?

2022-08-30 22:10:12

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

作者依赖于功能之外,并且在某些地方。extract($_POST)extract($_GET)

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

例如,我可以通过在帖子值内部提供来轻松更改超全局,但是超全局是数组,我将它们转换为字符串,我不确定它是否会产生邪恶的效果。_ENV=something

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

有没有一些有趣的变量需要设置/更改,也许在PHP的内部?

谢谢


答案 1

要评估“可能”,请尝试以下操作:

文件:htdocs/mix/extraction.php

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

并这样称呼它:

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

在我的 Xampp 上提取后,输出如下所示:

字符串(4) “测试”

如果有人对你的变量命名有所了解,并且你在 $_POST 或 $_GET 全局变量上使用 extract,那么你就有一个严重的问题。通过一些时间和工作,可以通过尝试和错误找出一些命名。

在不知道您的来源的情况下,入侵者可以尝试劫持任何全局变量,例如$_SESSION(但在这里,只有在提取($_GET),$_COOKIE或$_SERVER之前执行session_start();甚至为它们设置特定值,它才会生效:

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

如果您像这样使用数据提取:

提取物($var,EXTR_SKIP);

提取($var,EXTR_PREFIX_SAME,'前缀');

提取($var,EXTR_PREFIX_ALL,'前缀');

那么您将完全安全。


答案 2

数据库连接的通用名称是$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"

覆盖变量或其他有趣的东西,想要搞砸可迭代对象吗?通过提取,根据范围,您可以拥有各种乐趣。$idUserarray('i' => 5)

编辑:

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


推荐