代码之家  ›  专栏  ›  技术社区  ›  Marco Mariani

如何演示如何利用Extract($_Post)?

  •  17
  • Marco Mariani  · 技术社区  · 14 年前

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

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

    我的建议是打电话 extract($_POST, EXTR_PREFIX_ALL, 'form') 并相应地更改代码,但他的立场是,在随后的include中,任何变量都将被重新定义。

    例如,我可以通过提供 _ENV=something 在post值中,超全局是数组,我将它们转换成字符串,我不确定它是否会有邪恶的效果。

    我可以看几张 isset() 使用并从那里向后移动..但我认为,这种攻击并不需要知道或预言源头。

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

    谢谢

    3 回复  |  直到 8 年前
        1
  •  16
  •   ITroubs    14 年前

    评估“可能”时,请尝试以下方法:

    文件:htdocs/mix/extraction.php

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

    这样称呼它:

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

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

    字符串(4)“测试”

    如果有人知道有关变量命名的任何信息,并且您在$\u post或$\u get globals上使用extract,那么您将遇到一个严重的问题。 有了一点时间和工作,就可以通过尝试和错误找出一些动态。

    在不知道您的来源的情况下,入侵者可能会尝试劫持任何全局变量,如$_会话(但这里只有在提取($_get)、$_cookie或$_服务器之前执行session_start(),并且甚至为它们设置特定值时才会产生任何效果:

    //localhost/mix/extraction.php?_服务器[http_user_agent]=iphone

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

    提取($var,extr_skip);

    提取($var,extr_prefix_same,'prefix');

    提取($var,extr_prefix_all,'prefix');

    那你就完全安全了。

        2
  •  9
  •   Kristoffer Sall-Storgaard ProllyGeek    14 年前

    数据库连接的一个常见名称是$db,但这只会破坏系统,您可以覆盖$_会话变量。

    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) 要提取,根据范围,可以有各种各样的乐趣。

    编辑:

    我想到了另一个方法,如果表单正在处理文件上载,为什么不尝试重写名为 $file , $fileName , $fileExtention 看看是否可以让它读取权限级别之外的文件。

        3
  •  1
  •   Community CDub    8 年前

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

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

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

    有关反对全局提取()ing的强常规参数,请参见 What is so wrong with extract()?