频道栏目
读书频道 > 安全 > Web应用漏洞侦测与防御:揭秘鲜为人知的攻击手段和防御技术
2.1 理解HTML 注入
2014-09-29 16:06:50     我来说两句
收藏   我要投稿
全书共8章:第1章介绍HTML5的新增特性及使用和滥用HTML5的安全考虑;第2章展示了如何只通过浏览器和最基本的HTML知识就可以利用Web中最常见的漏洞;第3章详细讲解CSRF(跨站请求伪造)攻击的实现机制及应对策略;  立即去当当网订购

跨站脚本攻击(XSS)可以更概括地描述为HTML 注入。XSS 这个更为流行的名字掩盖了如下事实:成功的攻击不需要跨站点或跨域,而且并非必须由 JavaScript 组成。在接下来的几章,我们将会不断围绕注入展开,它是一种安全弱点,将数据(像电子邮件地址或名字等信息)与代码(Web 页面的语法,比如<script> 元素的创建)以不好的方式混合在一起。XSS 攻击重写Web 页面结构或者在被攻击者的浏览器内执行任意的JavaScript 脚本。这种情况发生在网站需要从用户获取一些信息时,例如电子邮件地址、用户的ID、一篇博文的评论、状态消息等等,并且在Web 页面中显示这些消息。如果该网站设计疏忽,那么HTML文档的意义可能被精心制作的字符串修改。

现代浏览器实现了基本的应对XSS 攻击的措施,以防止在浏览器中执行特定类型的XSS 漏洞利用。如果你在自己的网站上尝试下面的例子,当你期望出现一个JavaScript 弹窗告警,但你没有看到时,请检查浏览器的错误控制台(通常会在Developer或Tools菜单下),看看它是否报告了安全异常。本章会介绍这一浏览器行为的更多细节及如何对它进行修改。

以某在线商店的搜索功能为例,网站的访问者希望寻找自己喜爱的书籍、电影或粉色的鱿鱼抱枕,如果找到了这些商品便购买它们。如果访问者搜索标题包含“ living dead ”的DVD,那么这个短语可能在HTML源码的许多地方出现。下面显示了它出现在元标签中:


 

当访问者可以使用通常为HTML 标记保留的字符作为搜索项的一部分时,XSS 就可以发挥作用了。想象一下如果访问者在这个短语后面附加一个双引号(”)的情况。图2.1 和图2.2 显示了浏览器如何渲染这两个不同查询的结果。

注意在图2.1 中,显示出网站的数据库中有多个标题同搜索项匹配,但是第二个搜索报告“No matches found ”,并显示了一些猜测的近似匹配。之所以会发生这样的事情,是因

数据库查询中使用的是living dead ”(带有双引号),而在数据库中不存在哪个电影的名字是以双引号结尾的。查看相应的HTML 源码可以确认双引号被保留下来(参见图2.2):


 

根据搜索短语,我们可以看到如何重写页面,使得Web 浏览器上显示同网站开发人员意图完全不同的消息。HTML 语言是关于语法和句法的一组规则,告诉浏览器如何解释页面的各个部分。呈现的页面被称为文档对象模型(DOM)。双引号和尖括号的使用使得攻击者能够改变页面的语法,从而添加JavaScript 元素,该元素的代码启动一个弹出窗口。之所以会发生这种情况,是因为短语被直接放置到其余的HTML 内容之中。

 

浏览器没有像它对单词living dead 所做的那样将<script>alert...作为文本显示,而是把<script> 标签看作代码块的开始并按照代码来渲染它。因此,攻击者能够通过操纵DOM任意地改变页面的内容。

在我们深入地介绍攻击之前,先看看短语出现在meta 标签和广告条上时会发生什么。这里是使用短语living dead ”时的meta 标签:

 

已经用H TML编码对双引号进行了重写,即用&quot; 表示,浏览器知道要将它显示为双引号。这个编码使得meta 标签和DOM大体上保持了句法。否则,meta 标签的句法将会略有差别。注意在content值结尾处的两个双引号:

 

这两个双引号出现在元素内不会产生什么伤害,并且大多数的浏览器都能从明显的输入错误中恢复过来。另一方面,如果搜索短语在meta 元素的content属性原样出现,那么攻击者就有了XSS 有效负载的入口:

 

下面是一个更清晰的有注释的XSS 有效负载。注意HTML 页面的句法和语法是如何被修改的。第一个meta 元素正常结束,然后是一个脚本元素,然后又出现了第二个meta 元素以维持HTML 的有效性。

 

可以采用类似方法来操纵广告条脚本元素中的ggl_hints 参数。但是在本例中,有效负载已经出现在脚本元素中,所以攻击者只需要插入有效的JavaScript 代码就可以对网站进行漏洞利用。这个攻击不需要向DOM添加新的元素。即使开发人员已经很聪明地把<script> 标签或所有带有尖括号的元素都加入到黑名单里,攻击仍然会成功。

 

前面的每个例子都揭示了XSS 攻击的一个重要的特性:有效负载需要注入到什么上下文中会影响攻击页面需要使用的字符。在某些情况下可以创建新的元素,如 <script> 或<iframe> 。其他情况下可以对元素的属性进行修改,如果有效负载出现在一个JavaScript 变量中,那么有效负载可以仅包含代码。

在<meta>标签中的未保护的值不仅是注入的目标,该标签本身也可以是有效载荷的一部分。特别有趣的是,浏览器将按照<meta>刷新DOM中所有的标签,而不仅仅是那些出现在<head>中的标签。2012年1 月,安全网站Dark Reading (http: //www. darkreading. com/)遭受了一次XSS 攻击,攻击的有效负载是通过注释来传递的。注意图2.4 中高亮显示的”> 字符后面的<meta>标签,后面章节中我们将用其他有效负载介绍包含”> 的原因。

 

弹出窗口仅仅是为了示范XSS ,更恶毒的有效负载可以做以下的事情:

窃取cookie ,使得攻击者可以冒充受害者且无需盗取密码。

伪造登录提示来窃取密码(攻击者喜欢无孔不入)。

捕获网上银行、电子邮件、在线游戏等网站的按键。

使用浏览器对局域网进行端口扫描。

偷偷重新配置家庭路由器使其防火墙失效。

为你的社交网络自动添加随机人员。

为跨站请求伪造(Cross Site Request Forgery,CSRF)攻击打基础。

不论有效负载的意图是什么,任何形式的XSS 都依赖于向网站页面注入内容,而对该有效负载的呈现都会导致DOM结构被修改,而且这种修改不是网站开发人员所期望的。记住,改变HTML 意味着网站本身仅仅是攻击的受害者之一,攻击者会将网站作为一个中继,将有效负载传送到所有访问该网站的浏览器。

以下将逐步介绍发现HTML 注入漏洞并进行攻击的方法。该方法包括HTML 注入的三个方面:

注入点:用来传送有效负载的攻击向量(attack vector)。它必须能够提交数据,这些数据不会被网站忽略并且将会在某些位置及时显示。

反射类型:有效负载必须在网站内(或相关应用程序,如同我们将会看到的)的某个地方被显示并持续一段时间。攻击的位置和持续时间确定了反射类型。

呈现位置的上下文:注入的有效负载不但必须被某个应用程序显示,而且显示位置的上下文会影响有效负载如何组合起来。浏览器有多个上下文用来执行 JavaScript、解释HTML 、应用同源策略。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:本章内容
下一篇:2.1.1 确定注入点
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站