定义
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
三种XSS
反射型实例
1 | <form action="" method="get"> |
一个最简单的例子,整个页面就是一个表单,当点击之后就会提交一个值给本页面,然后php代码会把你提交的内容显示出来,所以只需要在框框里输入<script>alert(1)</script>就可以了(PS:请不要使用chrome),然后查看一下源码:
1 | <form action="" method="get"> |
非常容易理解吧?也就是本质上就是你的输入,被浏览器当成了代码执行了。当时我在学习这部分的时候,最不能理解的是,这能有什么危害呢?我自己输入的变成了代码,那我相当于我自己害自己么?我肯定不会这么做的,那么XSS能有什么危害呢?其实这主要是这个例子仅仅是为了说明XSS的原理,所以导致我有这样的错觉。
现在举一个能造成破坏的例子。假设你经常访问一个网站(假设为xss.com),这个网站有XSS漏洞,有黑客知道了你经常访问的网站存在XSS漏洞,然后他构造了一个恶意的网站(假设为trap.com),上面分别有两个页面,一个页面单纯用来把发送给它的信息发送到指定邮箱,还有一个页面用来调用这个发邮件的页面。
发邮件的页面如下:
1 |
|
而调用上面这个页面的页面(也就是受害者会去访问的页面):
1 | <html> |
内嵌了一个iframe,然后这个能够实现去访问xss.com(也就是存在xss漏洞的页面)并且把xss.com的cookie发送到发邮件的那个页面,这样你在xss.com的cookie就发送到了坏人的邮箱里,拿到了cookie能干什么就不用多说了吧。
以上的两个页面只是最简单的利用,实际上可以利用的可以比这个复杂的多。
存储型实例
就是把直接显示在页面上改成了插入数据库,然后从数据库里查询出来,我觉得本质上没有什么区别,所以这里先不提供实验了。
从危害上来说,肯定是存储型的危害大,因为它已经插入了数据库,相当于之后任何人来这个页面都会被感染;当然它的难度也更大,因为多了一层插入数据库的操作,所以会多一层检查。
DOM XSS实例
还是用一个实例来看看:
1 | <?php |
这个例子中,其实这段代码已经在你的浏览器中了,然后你在url栏中输入服务器地址?name=<img src=1 onerror=alert(1)>就可以看到xss的结果了。
这个与之前的两个的区别在于,上面的那两个其实是服务器已经把恶意的HTML代码构造好了,直接发送给你;而这个其实不是你和服务器进行交互,而是直接由JavaScript来进行动态生成的。
危害
想想看JavaScript能干什么,XSS就能造成什么危害,包括但是不限于:获取用户的Cookie、记录下用户的输入、XSS蠕虫等。
绕过和防护
首先需要明白在一次XSS攻击中有四个对象:攻击者,被害者,存在XSS漏洞的网站,浏览器厂商。这里之所以把浏览器厂商加入其中,是因为像Chrome这种其实也对XSS做了防护。
而产生这个漏洞的根本原因是:在生成HTML的过程中,一些特殊的字符没有被正确的处理,从而导致了意想不到的结果。所以需要对用户的输入进行转义处理,详情见下。
HTML转义
<input name="bob" gender="man">这里的bob和man都是属性值,对于属性值我们需要做的就是用双引号括起来,并且对用户输入的双引号进行转义。
<p>段落</p> 这里的段落叫做元素内容,这里需要做的就是将<进行转义掉。
辅助性防护
这里的操作只是辅助性的防护,而不是从根本上杜绝。
- 输入校验
- 设置HttpOnly属性,这样JavaScript就不能读取cookie的值了。
- 关闭TRACE方法