跨站脚本攻击(xss)是客户端脚本安全中的头号大敌。OWAPSP TOP 10多次把xss攻击置为榜首。可见它影响力,所以,今天来探讨一下那些好玩的xss。
攻击简介
XSS攻击,通常指黑客通过“HTML”注入篡改了网页,插入了恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。一开始这种攻击是跨域的,所以叫做跨站脚本攻击。但是,随着时间的推移,出现了javascript,它的强大功能以及网站前端的逐渐复杂化,是否跨域已经不是关注的重点。但是,这个名字保留了下来。
XSS攻击原理
XSS攻击发展到现在,例如HTML注入的情况已经很少了,而更多的是在网页上嵌入客户端javascript恶意脚本代码,所以要想精通xss就要有一定水平的javascript的知识储备。XSS的威力能做到多大,很大程度上取决于javascript注入代码的编写水平。
Javascript可以用来获得用户的cookie,改变网页内容和URL跳转,这样的话,我们就知道了,存在XSS漏洞的网站我们可以做什么?答案就是盗取用户cookie,黑掉页面,以及把网站导航到恶意网站,黑客仅需要做的就是注入javascript代码。
引入
举个简单的梨子,来引入一下XSS漏洞。
下面是一个网站的源码:
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
输入<script>alert(/xss/)</script>
发现成功弹窗
这是一个反射型的XSS,具体分类下面会介绍,我们查看网页源码发现我们注入的脚脚本已经被写入网页,如下:
而这显然不是我们所希望的,如果黑客写了一个能弹出恶意链接的弹框,那就是恶意攻击了。
下面根据xss效果的不同可以分成下面几类:
反射型XSS
反射型XSS只是简单的把用户输入的数据“反射”给浏览器。所以说这种XSS一般是诱惑用户“点击”一个恶意链接才能成功。反射型XSS也叫做非持久型XSS(Non-persistent XSS)。
存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端。所以,这种XSS具有很强的稳定性,这也是XSS中最危险的一类。
比较常见的一个场景就是,一个黑客写下一篇含有恶意javascript代码的博客文章,那么凡是浏览这篇文章的人都会在他们的浏览器中执行这串恶意代码。黑客把这段恶意的脚本保存到服务器端,所以这种XSS攻击就叫做“存储型XSS”。
DOM XSS
DOM 全称是Document Object Model,即文档对象模型。DOM通常用来代表在HTML,XHTML,和XML中的对象。
使用DOM可以允许程序和脚本动态访问和更新文档的内容,结构和样式。
通过javascript可以重构整个HTML页面,而要重构页面或者页面中的某个对象。就需要知道HTML中某个元素的位置。
而DOM为文档提供了结构化表示。并且定义了如何通过脚本来访问文档结构。根据DOM规定,HTML文档中的每个成分都是一个节点。
DOM规定如下:
.整个文档是一个文档节点。
.每个HTML标签一个元素节点。
.包含在HTML元素中的文本是文本节点。
.每个HTML属性是一个属性节点。
.节点与节点之间有等级关系。
所以HTML标签都是一个个节点,而这些节点组成了DOM的整体结构:节点树。如图:
简单了解DOM后,我们来举个简单的梨子,来引入下DOM XSS。
我们可以发现,DOM本身就代表文档的意思,而基于DOM的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。
下面举个经典的DOM XSS:
<script>
Var temp =document.URL; //获取URL
Var index = document.URL.indexOf(“content=”)+4;
Var par = temp.substring(index);
Document.write(decodeURI(par)); //输入获取内容
</script>
上述的代码是用来获取content的值,并且输出。如果在浏览栏输入http://xxx.xxx.xx/dom.htmlcontent=<script>alert(/sss/)</script>
,就会产生DOM XSS漏洞。
检测
检测方式分为两种,一种是手工,另一种是自动检测。两者各有利弊,手工检测结果会更为精准,但是对于稍微复杂的网站,工作量会很大,自动检测,具有方便的特点,但是也会出现误报的情况,在现实生活中往往把二者结合起来应用。
手工检测XSS
手工检测的时候我们首先要考虑的是哪里有输入,输入的数据在什么地方输出。
使用手工检测的时候要一步一步来,不要直接输入XSS跨站语句测试,最好先选择有特殊意义的字符。这样可以快速检测是否存在XSS漏洞。
分为下面两种情况测试:
1.可得知输出位置
这时候可以用一些特殊字符测试,比如:“<, > , ”,’ , ()”提交请求后查看HTML源代码,看这些输入的字符是否被转义。
2.无法得知输出位置
其实我们知道非常多的网页源码我们是不能无法直接看到的。这时候进行XSS测试时就有可能无法得知到底在何处显示,比如还有些评论,可能必须需要管理员同意,才能显示。这时候我们就无法得知输入的数据在后台管理界面处于何种状态。例如:
在div标签中:<div>XSS test</div>
在input标签中:
<input type=”text”name=”content”value=”XSS Test”/>
这时候我们通常用””/>XSS test
的方式来检测。
工具检测
至于工具检测,这里主要介绍一些工APPSCAN,AVWS,BRUP SUIT都可以检测XSS,比较专业工具有XSSER,XSSF这些都是比较好的选择。与手工检测相结合会事半功倍。
XSS高级利用
XSS漏洞利用,当然不止弹出一个框那么简单。它能做的远远不止如此,下面是一些常见的漏洞利用:
1.盗取cookie
2.盗取网站内容
3.网站挂马
4.利用网站重定向恶意网站
5.XSS蠕虫
讨论到这里,希望大家已经对XSS有了一个基本的认识,至于一些高级利用的payload,我们以后再结合具体漏洞讨论,今天不早了,祝大家睡一个好觉!拜拜!