【问题标题】:Is this code vulnerable to hacker attack?这段代码容易受到黑客攻击吗?
【发布时间】:2009-07-31 08:03:49
【问题描述】:

我对在线网络应用程序真的很陌生。我正在使用php,我得到了这个代码:

if(isset($_GET['return']) && !empty($_GET['return'])){
return = $_GET['return'];
header("Location: ./index.php?" . $return);    
} else {
header("Location: ./index.php");    

}

$return 变量是 URL 变量,很容易被黑客更改。

例如,我从这里得到 $return 变量:www.web.com/verify.php?return=profile.php

有什么需要注意的吗?我应该在这一行中使用 htmlentities:

header("Location: ./index.php?" . htmlentities($return));    

是否容易受到黑客的攻击?

我应该怎么做才能防止黑客入侵?

【问题讨论】:

    标签: php security url variables


    【解决方案1】:

    除了第 2 行的错字(应该是 $return = $_GET['return'];)你应该做$return = urlencode($return) 以确保 $return 是一个有效的 QueryString,因为它作为参数传递给 index.php .

    index.php 然后应该验证 return 是用户有权访问的有效 URL。我不知道你的 index.php 是如何工作的,但如果它只是显示一个页面,那么你最终可能会得到类似 index.php?/etc/passwd 或类似的东西,这确实可能是一个安全问题。

    编辑:您遇到了什么安全漏洞?我可以看到两个可能的问题,具体取决于 index.php 如何使用返回值:

    • 如果 index.php 将用户重定向到目标页面,那么我可以使用您的站点作为中继,将用户重定向到我控制的站点。这可以用于网络钓鱼(我创建的网站与您的网站一模一样,并要求用户输入用户名/密码)或仅用于广告。
    • 如果 index.php 显示返回参数中的文件,我可以尝试传入一些系统文件的名称,例如 /etc/passwd 并获取所有用户的列表。或者我可以通过 ../config.php 之类的内容并获取您的数据库连接
      • 我认为情况并非如此,但这是一个常见的安全漏洞,我仍然想指出。

    如前所述,您要确保通过查询字符串传入的 URL 是有效的。这样做的一些方法可能是:

    • $newurl = "http://yoursite/" 。 $返回;
      • 这可以确保您始终只在您的域中,而不会重定向到任何其他域
    • $有效 = file_exists($return)
      • 如果 $return 始终是硬盘驱动器上存在的页面,则此方法有效。通过检查 return 确实指向一个有效文件,您可以过滤掉虚假条目
      • 如果 return 接受查询字符串(即 return=profile.php?step=2),那么您需要解析出“profile.php”路径
    • 有一个 $return 的有效值列表并与之比较
      • 这通常是不切实际的,除非你真的将你的应用程序设计成 index.php 只能返回给定的一组页面

    有很多方法可以给这只猫剥皮,但通常你想以某种方式验证 $return 指向一个有效的目标。这些有效目标是什么取决于您的规范。

    【讨论】:

    • 嗨,迈克尔,请查看我对 shonee 的评论。我按照他们的方法,最后在这里发布了这个问题。请帮帮我
    • 我对帖子进行了一些更改以指出一些问题
    【解决方案2】:

    如果您运行的是 PHP 4 或 5 的旧版本,那么我认为您将容易受到标头注入的攻击 - 有人可以设置返回 URL,然后是行返回,然后是他们想要的任何其他标头让您的服务器发送。

    您可以通过首先清理字符串来避免这种情况。去掉换行可能就足够了,但最好有一个允许的字符列表——这可能不切实际。

    4.4.25.1.2:此功能现在可以防止多个标题 立即发送以防止 标头注入攻击。

    http://php.net/manual/en/function.header.php

    【讨论】:

      【解决方案3】:

      如果您放入一个不存在的页面会发生什么。例如:

      return=blowup.php
      

      return=http://www.google.co.uk
      

      return=http%3A%2F%2Fwww.google.co.uk%2F
      

      您可以通过在变量中不包含 .php 来混淆引用。然后,您可以将其附加到代码隐藏中并检查目录中是否存在该文件/在重定向到它之前使用允许值的 switch 语句。

      【讨论】:

      【解决方案4】:

      在这种情况下,它更多地取决于对index.php 上的那部分查询字符串做了什么。如果它被发送到数据库查询、输出、eval()exec(),是的,这是一个非常常见的安全漏洞。 大多数其他情况未经过滤是安全的,但最好编写自己的通用清理函数,将所有品种的引号转换为它们的 HTML 实体,以及等号。

      【讨论】:

        【解决方案5】:

        我会做的事情是:

        1. 定义,允许什么类型的返回值?
        2. 写下所有可能的返回值类型。
        3. 然后,下结论:哪些字符是不允许的,url最大长度是多少,允许哪些域等等。
        4. 最后:根据以上结论做一个过滤函数。

        【讨论】:

          【解决方案6】:

          I Thing 黑客可以做到这一点 如果$_GET['return'] 包含任何内容,您将重定向 黑客可以将其用作xss 重定向到病毒或任何类似的东西 但是没有能力做任何其他的东西

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-29
            • 2020-10-15
            • 1970-01-01
            • 2014-04-19
            相关资源
            最近更新 更多