【问题标题】:How to protect against this type of attack?如何防范此类攻击?
【发布时间】:2015-02-19 15:50:35
【问题描述】:

我最近有人对一个应用程序进行了渗透测试,它发现的一个关键问题是在这样的 URL 中传递了一些垃圾:

http://example.com/index.php/
%27%3e%3c%69%4d%67%20%53%72%43%3d%78%20%4f%6e%45%72%52%6f%52%3d%61%6c%65%
72%74%28%34%37%34%31%32%29%3e

问题在于,攻击者只需添加一个斜线,然后添加一些编码的 javascript(带有警报框的图像标签),这会杀死页面。简单有效的攻击。

如何针对它进行编码?我已经在清理所有预期的用户输入(例如当用户通过index.php?id=<script>alert(1)</script> 时)。那部分工作正常。

如何防止上述第一段下方引用的意外数据? (另外,这种类型的 XSS 攻击有具体的名称吗?)

【问题讨论】:

  • 您是否接受它,然后按原样返回给其他用户?用户只有点击正确的链接才会受到影响?还是在您的页面上解析并执行?
  • 我很好奇这个 URL 显示在哪里,或者 index.php 页面如何处理$_GET(如果有的话?)。
  • 应用程序查找通过 URL 传递的两个变量:idsort。这两个都被正确清理了——没有发现任何漏洞。不应显示其他用户传递的数据。
  • @acoder URL 中的 JS 不应该自己运行。你确定你没有在页面中呼应它吗?
  • 这个数据是 urlencoded 应该没有什么区别 - 如果你通过 urldecoding 正确读取它,那么通过htmlentities() 保护仍然可以。

标签: javascript php security xss


【解决方案1】:

谨慎使用$_SERVER['PHP_SELF]

你应该做htmlspecialchars($_SERVER["PHP_SELF"]);htmlentities($_SERVER["PHP_SELF"]);

这是正常的 XSS 攻击。

更多信息: Info

【讨论】:

    【解决方案2】:

    我在href 标记中使用了$_SERVER['PHP_SELF'],所以这就是触发JavaScript 的地方。

    解决方案很简单。我在使用前通过过滤器运行PHP_SELF,任何通过的垃圾都被清理干净并且可以安全地在页面上使用。

    【讨论】:

    • 你用什么功能清理垃圾?
    • 这是几年前的事了,我在 2015 年所做的事情并不容易,但现在我使用的是 SCRIPT_NAME 而不是 PHP_SELF。我通过 htmlpurifier 单独清理用户发布(并从数据库中检索)的内容。
    • @AbdulJabbarDumrai 对此没有万能的答案。您通常需要将$_SERVER['PHP_SELF'] 视为不受控制的用户输入并将其视为此类,与接受表单数据非常相似。根据预期严格验证输入,和/或根据您的输出格式对其进行正确编码,以免对其进行评估。
    【解决方案3】:

    前面的答案已经可以了,但由于某种原因htmlspecialchars() 不过滤单引号。如果需要过滤单引号,则需要在htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES)中添加参数

    【讨论】:

      【解决方案4】:

      如何防止第一个下面引用的意外数据 上一段?

      filter_input( INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
      

      感谢@Sverri M. Olsen 解释为什么使用filter_input 而不是超全局

      https://stackoverflow.com/a/15103555/11173494

      另外,这种类型的 XSS 攻击有具体的名称吗?

      这是存储的 XSS。黑客可以通过存储恶意代码构造自定义查询来攻击用户。

      @Sandeep Nair 解释了 Stored XSSReflected XSS

      之间的区别

      https://stackoverflow.com/a/48893119/11173494

      【讨论】:

        【解决方案5】:

        strip_tags() 函数可能会有所帮助。 例如:

        $str = 'index.php?id=<script>alert(1)</script>';    
        echo "<pre>";
        echo strip_tags($str), "\n";
        

        上面会输出:

        index.php?id=alert(1)
        

        【讨论】:

        • 一旦使用 strip_tags 删除脚本标签,注入的脚本就不会造成任何伤害。除此之外,验证“id”字段的输入应该提供更好的安全性。
        猜你喜欢
        • 1970-01-01
        • 2011-02-16
        • 2021-12-17
        • 1970-01-01
        • 2015-10-18
        • 2020-09-23
        • 2019-08-01
        • 2017-03-31
        • 1970-01-01
        相关资源
        最近更新 更多