XSS漏洞
XSS漏洞
XSS是指跨站脚本攻击。是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。
静态站点完全不受XSS的影响。
恶意攻击者会在Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
恶意用户利用xss 代码攻击成功后,可能得到很高的权限、私密网页内容、会话和cookie等各种内容。
产生层面
产生层面一般都是在前端,JavaScript代码能干什么,执行之后就会达到相应的效果
函数类
比如说php中的脚本的输出函数。
常见的输出函数有:print、print_r、echo、printf、sprintf、die、var_dump、var_export。
危害影响
- 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
- 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 盗窃企业重要的具有商业价值的资料
- 非法转账
- 强制发送电子邮件
- 网站挂马
- 控制受害者机器向其它网站发起攻击
攻击举例
窃取网页浏览中的cookie值
在网页浏览中我们常常涉及到用户登录,登录完毕之后服务端会返回一个cookie值。
这个cookie值相当于一个令牌,拿着这张令牌就等同于证明了你是某个用户。
如果你的cookie值被窃取,那么攻击者很可能能够直接利用你的这张令牌不用密码就登录你的账户。
如果想要通过script脚本获得当前页面的cookie值,通常会用到cookie。
劫持流量实现恶意跳转
如果在网页中插入一句下述语句:<script>window.location.href="http://www.baidu.com";</script>
, 那么所访问的网站就会被跳转到百度的首页。
XSS的分类
根据XSS脚本注入方式的不同,我们可以将XSS攻击简单的分类为反射型XSS、存储型XSS、DOM-based 型、基于字符集的 XSS、基于 Flash 的跨站 XSS、未经验证的跳转 XSS 6种类型。
反射型(非持久化)、存储型(持久化)、DOM型。
反射型XSS
又称非持久型XSS。
原理
这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的: 发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。
这个过程像一次反射,故叫反射型XSS。
这种攻击方式具有一次性,由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用。因此也称为称为非持久型XSS。
攻击方式
攻击者通过电子邮件等方式给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,特有的恶意代码参数被 HTML 解析、执行。
非持久型 XSS 漏洞攻击的四大特点:
① 即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;
② 攻击者需要诱骗点击;
③ 反馈率低,所以较难发现和响应修复;
④ 盗取用户敏感保密信息。
反射型XSS 漏洞修复方式
① Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端;
② 尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染;
③ 尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法;
④ 对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义;
⑤ 前端渲染的时候对任何的字段都需要做 escape 转义编码。
存储型XSS
原理
存储型XSS提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求目标页面时不用再提交XSS代码。
一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。
这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。
随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。
当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。
持久型XSS 的三大特点:
① 持久性,植入在数据库中;
② 危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡;
③ 盗取用户敏感私密信息。
持久型XSS 漏洞修复方式
① 后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理;
② 后端在输出给前端数据统一进行转义处理;
③ 前端在渲染页面 DOM 的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。
DOM-based 型
DOM中有很多对象,其中一些对象可以被用户所操纵,如url,location等。
客户端的脚本程序可以通过DOM来动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端取得DOM中的数据后并在本地执行,因此仅从服务器端是没有办法防御DOM型XSS漏洞的,如若DOM中的数据没有经过严格的验证,便会产生基于DOM的XSS漏洞。
例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。
需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。
基于字符集的 XSS
哪怕现在很多的浏览器以及各种开源的库都专门针对了 XSS 进行转义处理,尽量默认抵御绝大多数 XSS 攻击,但是还是有很多方式可以绕过转义规则,让人防不胜防。
比如「基于字符集的 XSS 攻击」就是绕过这些转义处理的一种攻击方式,比如有些 Web 页面字符集不固定,用户输入非期望字符集的字符,有时会绕过转义过滤规则。
避免基于字符集的 XSS 攻击的两大方法:
① 记住指定 ;
② XML 中不仅要指定字符集为 utf-8,而且标签要闭合。
③ 浏览器与web应用端采用相同的字符编码
基于 Flash 的跨站 XSS
基于 Flash 的跨站 XSS 也是属于反射型 XSS 的一种,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中。
主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie。
基于 Flash 的跨站 XSS 的两种避免方法 :
① 严格管理 cookie 的读写权限;
② 对 Flash 能接受用户输入的参数进行过滤 escape 转义处理。
③ 使用HTTP Only来禁止JavaScript读取cookie值
未经验证的跳转 XSS
有一些场景是后端需要对一个传进来的待跳转的 URL 参数进行一个 302 跳转,可能其中会带有一些用户的敏感(cookie)信息。
如果服务器端做302 跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本。
防止未经验证的跳转 XSS漏洞的两种措施:
① 对待跳转的 URL 参数做白名单或者某种规则过滤;
② 后端注意对敏感信息的保护, 比如 cookie 使用来源验证。
HttpOnly
什么是HttpOnly
如果Cookie中设置了HttpOnly属性,那么通过JS脚本将无法读取到Cookie信息,这样能有效防止XSS攻击,窃取Cookie内容。 但是还是存在xss跨站语句,阻止的仅仅是获取cookie。
各个主流的脚本语言都支持HttpOnly。
HttpOnly的设置样例
JavaEE
设置完毕后通过js脚本是读不到该cookie的,但使用 Cookie cookies[]=request.getCookies()
方式可以读取。
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
C#
HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);
PHP≥5.2
PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中, 设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性。
session.cookie_httponly = 1
PHP4和PHP≤5.1
对于PHP5.1以前版本以及PHP4版本,则需要通过header函数来传递:
<?php
header("Set-Cookie: hidden=value; httpOnly");
?>
反制HttpOnly
本文不教大家做坏事。因此跳过。但有保护就会有破解,这是避免不了的。