time: 2019-05-12 21:23
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
什么是XSS攻击?
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
XSS的原理:
1.攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
2.诱使受害者打开受到攻击的服务器URL。
3.受害者在Web浏览器中打开URL,恶意脚本执行。
XSS攻击的危害包括:
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
XSS攻击分类
(1)反射型: 又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。详细说就是发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS随响应内容一起返回给浏览器,最后浏览器解析执行XSS代码,这个过程就像一次发射,所以叫反射型XSS。
简单例子
正常发送消息:
http://www.test.com/message.php?send=Hello,World!
接收者将会接收信息并显示Hello,Word
非正常发送消息:
http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!
接收者接收消息显示的时候将会弹出警告窗口
(2)存储型: 存储型XSS和反射型的XSS差别就在于,存储型的XSS提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。又称为持久型跨站点脚本,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。
简单例子:
从名字就可了解到存储型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如留言板
留言板表单中的表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>
正常操作:
用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。
非正常操作:
攻击者在value填写<script>alert(‘foolish!’)</script>
【或者html其他标签(破坏样式。。。)、一段攻击型代码】;
将数据存储到数据库中;
其他用户取出数据显示的时候,将会执行这些攻击性代码
DOMBasedXSS(基于dom的跨站点脚本攻击)
基于DOM的XSS有时也称为type0XSS。当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞,从效果上来说它也是反射型XSS。
通过修改页面的DOM节点形成的XSS,称之为DOMBasedXSS。
前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location 或document.URL 或 document.referrer获取数据(或者任何其他攻击者可以修改的对象)。
例如:
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
name是截取URL中get过来的name参数
正常操作:
http://www.vulnerable.site/welcome.html?name=Joe
非正常操作:
http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>
受害者的浏览器接收到这个链接,发送HTTP请求到www.vulnerable.site并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。
XSS攻击实例
1.简单XSS攻击
留言类,简单注入javascript
有个表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>
1、假若用户填写数据为:<script>alert('foolish!')</script>(或者<script type="text/javascript" src="./xss.js"></script>)
2、提交后将会弹出一个foolish警告窗口,接着将数据存入数据库
3、等到别的客户端请求这个留言的时候,将数据取出显示留言时将执行攻击代码,将会显示一个foolish警告窗口。
【将数据改成html标签进行攻击,则会将原本的样式打乱。。。。。。。。】
2.盗取cookie
什么是Cookie?
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265 [1] 。(可以叫做浏览器缓存)
这里,我们只是直观的感受一下Cookie。
在浏览器的地址栏输入:javascript:alert(document.cookie),按下Enter键,即能看到当前Cookie值。
有人可能会疑惑:这么复杂的一段代码,攻击者难道真的能破解出明文,然后冒充我们的身份?
事实上,攻击者并不需要知道这段代码的含义!
攻击者只需要把这个Cookie信息提交给服务器并通过验证,那么攻击者就可以冒充受害者的身份登陆网站。
这就是我们常说的Cookie欺骗/Cookie会话攻击。
Cookie窃取攻击
最基本的XSS跨站攻击方法就是窃取受害者Cookie信息。
其基本原理如下:
-
当攻击者发现网站存在XSS漏洞时,攻击者会先向存在XSS漏洞的网页中注入恶意的脚本代码。
-
当受害者访问到此含有恶意脚本代码的网页时,恶意脚本代码相应的执行。
-
由于在受害者请求服务器的协议中含有Cookie信息,网站相应的得到用户Cookie信息。
-
用户注入的恶意脚本代码是经过精心构造的,同时在远程服务器端或者攻击者使用的XSS平台上,有一个用户接受和记录Cookie信息的文本。
-
攻击者访问此记录Cookie信息的文本,得到受害者的Cookie信息。
-
攻击者利用受害者Cookie信息,通过桂林老兵、firecookie等工具,以受害者的身份信息访问网站。
Cookie窃取攻击的步骤:步骤一 判断网站是否存在反射型XSS/存储型XSS漏洞
步骤二 注入Cookie信息窃取的恶意代码
一般情况下,我们都是利用XSS平台的代码进行注入。这样,我们能够在XSS平台的对应项目中找到受害人Cookie。
步骤三 冒充被害人身份登陆网站。
可以使用的工具有很多,例如桂林老兵,firefox浏览器插件firecookie等。
##XSS的防御措施:
XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理。因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据进行安全过滤。
什么是html实体?
在html中有些字符,像(<)这类的,对HTML(标准通用标记语言下的一个应用)来说是有特殊意义的,所以这些字符是不允许在文本中使用的。要在HTML中显示(<)这个字符,我们就必须使用实体字符。
html实体的存在是导致XSS漏洞的主要原因之一。
因此我们需要将这些实体全部转换为相应的实体编号。
**编码:对用户输入的数据进行HTML Entity编码
用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。
在PHP中已经存在这样子功能的函数,即是htmlentities(
s
t
r
)
函
数
。
与
之
相
反
的
就
是
h
t
m
l
e
n
t
i
t
y
d
e
c
o
d
e
(
str)函数。 与之相反的就是html_entity_decode(
str)函数。与之相反的就是htmlentitydecode(str)函数,它将实体名称转换为相应的符号。
** 过滤: 移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。
1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
4、对数据进行Html Encode 处理
5、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
6、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus"
等等。
【特别注意:】
在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!
**校正:**避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签。