XSS攻击

图片.png

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值。
图片.png

有人可能会疑惑:这么复杂的一段代码,攻击者难道真的能破解出明文,然后冒充我们的身份?

事实上,攻击者并不需要知道这段代码的含义!

攻击者只需要把这个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> , &lt; for <, &gt; for >, &quot for

6、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus"等等。

【特别注意:】

在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!
**校正:**避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BerL1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值