`
whilew
  • 浏览: 22181 次
文章分类
社区版块
存档分类
最新评论

几种极其隐蔽的XSS注入的防护

 
阅读更多

原文地址:http://blogread.cn/it/article.php?id=5733&f=sinat

XSS注入的本质就是: 某网页中根据用户的输入, 不期待地生成了可执行的js代码, 并且js得到了浏览器的执行. 意思是说, 发给浏览器的字符串中, 包含了一段非法的js代码, 而这段代码跟用户的输入有关.

常见的XSS注入防护, 可以通过简单的 htmlspecialchars(转义HTML特殊字符), strip_tags(清除HTML标签) 来解决, 但是, 还有一些隐蔽的XSS注入不能通过这两个方法来解决, 而且, 有时业务需要不允许清除HTML标签和特殊字符. 下面列举几种隐蔽的XSS注入方法:

IE6/7 UTF7 XSS 漏洞攻击

隐蔽指数: 5
伤害指数: 5

这个漏洞非常隐蔽, 因为它让出现漏洞的网页看起来只有英文字母(ASCII字符), 并没有非法字符, htmlspecialchars 和 strip_tags 函数对这种攻击没有作用. 不过, 这个攻击只对 IE6/IE7 起作用, 从 IE8 起微软已经修复了. 你可以把下面这段代码保存到一个文本文件中(前面不要有空格和换行), 然后用 IE6 打开试试(没有恶意代码, 只是一个演示):

+/v8 +ADw-script+AD4-alert(document.location)+ADw-/script+AD4-

最容易中招的就是 JSONP 的应用了, 解决方法是把非字母和数字下划线的字符全部过滤掉. 还有一种方法是在网页开始输出空格或者换行, 这样, UTF7-XSS 就不能起作用了.

因为只对非常老版本的 IE6/IE7 造成伤害, 对 Firefox/Chrome 没有伤害, 所以伤害指数只能给 4 颗星.

参考资料:UTF7-XSS

不正确地拼接 JavaScript/JSON 代码段

隐蔽指数: 5
伤害指数: 5

Web 前端程序员经常在 PHP 代码或者某些模板语言中, 动态地生成一些 JavaScript 代码片段, 例如最常见的:

var a = '<?php echo htmlspecialchars($name); ?>';

不想, $name 是通过用户输入的, 当用户输入 a’; alert(1); 时, 就形成了非法的 JavaScript 代码, 也就是 XSS 注入了.

在解决问题之前, 我们要思考问题的本质是什么? 本质在于程序员可以用字符串来控制整个世界, 却没有用正确的方法来生成正确的字符串, 而是采用了功能强大且原始的”手工字符串拼接”.

只需要把上面的代码改成:

var a = <?php echo json_encode($name); ?>;

去掉单引号, 利用 PHP 的 json_encode() 函数来生成表示字符串的字符串. 这样做是因为,最好用 json_encode() 函数来生成所有的 JSON 串, 而不要试图自己去拼接. 程序员总是犯这样的错误: 自己去解析 HTTP 报文, 而不是用现成的成熟的库来解析. 用 json_encode() 的好处还在于, 即使业务要求”我要保留单引号”时, XSS注入也可以避免.

隐蔽指数最高级, 伤害所有的通用浏览器. 这种 XSS 注入方式具有非常重要的参考意义.

最后, 根据工作中的经验, 以及我自己和别人犯过的错, 我总结出一个定理: 没有一劳永逸的单一方法可以解决所有 XSS 注入问题.

有用的经验:

  • 输出 HTML 代码时 htmlspecialchars
  • 输出 JavaScript 代码时 json_encode
  • 输入过滤应该用于解决业务限制, 而不是用于解决 XSS 注入(与严进宽出的原则相悖, 所以本条值得讨论)

讨论:

上文提到的经验第3条, 是一种”宽进严出”的原则, 和”严进宽出”原则是相悖的. 其实, 我认为不应该把”严进宽出”作为一条伪真理, 好像除了它其它的说法都不对了似的. “宽进严出”和”严进宽出”应该具有完全相等的地位, 根据实现的成本进行取舍.

例如, 用户的名字可以采用”严进宽出”原则, 不允许用户填写单引号, 大于号小于号等. 但是用户的签名呢? 难道就不能填单引号? 如果要走极端, 想找出一种银弹, 那么我能想到的就是对所有的输入一律进行 htmlspecialchars 和 json_encode(且不说解决不了 utf7-xss).

其实, XSS 注入的解决应该是和输出端相关的. 当需要输出到文本文件时, 过滤和转义都是无必要的. 当输出到 HTML 渲染引擎时, json_encode 是无必要的. 当输出到 JS 引擎时, htmlspecialchars 是无必要的.

分享到:
评论

相关推荐

    XSS注入知识点总结.pdf

    XSS(跨站脚本攻击)是一种常见的网络安全漏洞,主要利用Web页面中存在的漏洞,允许攻击者在用户浏览器中执行恶意JavaScript代码。由于JavaScript的强大能力,攻击者可以通过XSS对网站用户进行多种恶意行为,如窃取...

    XSS漏洞挖掘与安全防护.pdf

    XSS漏洞的防护措施主要包括以下几点: 1. 输入验证:对所有用户输入进行严格的验证,确保输入不包含HTML或JavaScript代码,或者对这些代码进行适当的转义处理。 2. 输出编码:在将用户输入的内容返回给客户端时,对...

    360通用XSS/SQL防注入.zip

    在网络安全领域,XSS(跨站脚本攻击)和SQL注入是两种常见的威胁,它们对网站的稳定性和用户数据的安全构成严重隐患。360通用XSS/SQL防注入方案,就是针对这两种攻击类型提供的一套解决方案。本篇文章将详细介绍XSS...

    记录几种XSS绕过方式1

    本文主要记录了几种XSS绕过的方法,帮助开发者理解攻击者可能使用的技巧,提高网站的安全性。 1. 服务端全局替换为空的特性: 当网站的过滤机制将某些特定字符如"onerror"或"script"替换为空时,攻击者可以利用...

    xss漏洞讲解.pdf

    XSS漏洞分为几种类型,如反射型XSS、存储型XSS和DOM型XSS。 3. XSS漏洞类型及测试:XSS漏洞按照攻击方式的不同可以分为反射型、存储型和DOM型。这三种类型的XSS漏洞各有特点,测试方法也有所区别。反射型XSS通常...

    给开发者的终极XSS防护备忘录

    根据其攻击方式的不同,XSS攻击可以分为几种类型: - **反射型XSS**:当用户输入的数据未经验证就被直接返回到用户浏览器,并由浏览器解析执行时发生的攻击。这类攻击通常通过URL参数或表单提交的方式触发。 - **...

    xssProject所需jar包

    XSS攻击是一种常见的网络安全威胁,主要发生在Web应用程序中。攻击者通过注入恶意脚本到网页上,使得其他用户在访问这些页面时,恶意脚本被执行,从而盗取用户的敏感信息或进行其他恶意操作。为了解决这一问题,...

    xss_javaxss_XSS_

    "xss_javaxss_XSS_"这个主题正是关于如何在Java应用程序中防止XSS注入的问题。 在Java中,处理XSS攻击通常涉及以下几个关键步骤和策略: 1. 输入验证:首先,对所有用户输入进行严格的验证,确保其符合预期的格式...

    springmvc4配置防止XSS攻击的方法

    对于SQL注入的防范,通常在业务代码层面需要注意以下几点:使用参数化查询、避免拼接SQL语句、对用户输入进行严格的验证以及在服务端合理限制查询范围等。在Spring MVC中,使用MyBatis或JPA等ORM框架通常能提供参数...

    XSS Attacks

    - **绕过XSS长度限制**:介绍了几种绕过XSS长度限制的方法。 - **XSS过滤规避**:探讨了如何绕过常见的XSS过滤机制。 - **当脚本被阻止时**:讨论了如何应对浏览器的安全机制阻止脚本执行的情况。 - **浏览器特性**...

    XSS平台网站源码.zip

    XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的网络安全漏洞,它允许攻击者在用户浏览器中注入恶意脚本,进而控制用户的交互、窃取敏感信息或执行其他恶意操作。XSS平台网站源码是用于学习和研究XSS攻击及...

    php_XSS防攻击插件

    这个库通过定义一套详尽的净化规则,可以有效地消除任何可能的XSS注入,同时保持HTML结构的完整性和可读性。 **HTMLPurifier的使用** 使用HTMLPurifier时,首先需要安装并引入库。可以通过Composer(PHP的依赖管理...

    xss游戏平台源码

    开发者需要关注如何防止XSS注入,例如使用参数化查询、转义特殊字符、HTTP头部设置Content-Security-Policy等方法来加固代码。 客户端源码则主要负责用户界面展示和与服务器的交互,这部分通常涉及HTML、CSS和...

    xss跨站脚本攻击

    为了有效地防御XSS攻击,企业和开发者可以采取以下几种措施: - **输入验证**:确保所有来自用户的输入都经过严格的验证,防止非法字符的注入。 - **输出编码**:在展示用户提交的数据之前,对其进行HTML实体编码,...

    XSS漏洞

    XSS是一种常见的网络安全漏洞,它允许恶意攻击者通过在网页上注入可执行的脚本来对用户进行攻击。攻击者通常利用这种漏洞来窃取用户的敏感信息,如Cookie、会话令牌等,从而实现身份冒充。 博客链接提到的...

    前端开源库-xss-filters

    在前端开发中,XSS(Cross-site scripting)攻击是一种常见的安全威胁,它允许攻击者通过注入恶意脚本到网页上,从而控制用户浏览器的行为。"前端开源库-xss-filters"是一个专门针对这种情况设计的开源库,其目标是...

    XSS跨站总结

    XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web应用程序安全漏洞,它允许攻击者通过注入恶意脚本来攻击用户。这种攻击通常发生在用户浏览器上,利用的是用户对目标网站的信任。 - **定义**:XSS攻击是...

    Python-JShell用XSS获取一个JavaScriptshell

    此外,应用程序开发者也可以通过输入过滤、输出编码等方式防止XSS注入。 总的来说,理解XSS攻击和如何利用Python-JShell构建JavaScript shell对于提升Web安全意识至关重要。开发者应当学习如何检测和防御XSS,同时...

    ASP.NET源码——通用防SQL注入漏洞程序(Global.asax方式).zip

    SQL注入是一种常见的网络安全攻击手段,攻击者通过输入恶意的SQL代码,试图获取、修改或删除数据库中的敏感信息。在ASP.NET中,如果不进行适当的参数化查询或预编译语句,就容易遭受这种攻击。 这个程序的核心原理...

    注入技术总结

    本文将深入探讨几种主要的注入技术,包括SQL注入、文本框内注入以及绕过防注入策略。 一、SQL注入 SQL注入是利用不安全的SQL查询语句进行攻击的一种方式。当用户输入的数据未经充分验证直接与数据库交互时,攻击者...

Global site tag (gtag.js) - Google Analytics