网络知识 娱乐 【XSS攻击介绍(一)】

【XSS攻击介绍(一)】

目录

一、前言 

二、攻击条件和漏洞验证方法

三、XSS漏洞分类

四、利用方法

五、XSS payload变形

六、防护总结


一、前言 

      XSS:跨站脚本攻击,即CSS。利用网页开发时留下的漏洞(web应用程序对用户的输入过滤不足),巧妙的将恶意的代码注入到网页中,使用户浏览器加载并执行恶意制造的代码,以达到攻击的效果。这恶意的代码通常是JS代码,但实际上也可以是JAVA、VBS、ActiveX、Flash或者是普通的HTML。(浏览器不会判断,只要是符合解析,那么就会执行恶意的代码)。可能存在XSS的地方:微博、留言板、聊天室等收集用户输入的地方都可能遭受XSS攻击的风险。只要你对用户的输入没有严格过滤。

二、攻击条件和漏洞验证方法

攻击条件:1. 需要向WEB页面注入精心构造的恶意代码。

                   2. 对用户的输入没有做过滤或者过滤不严谨,恶意代码能够被浏览器成功执行。

验证XSS漏洞存在的一般方法:可以使用script标签来手动检测。

   如:   

  

 

反射型xss将数据插入到页面中:

XSS漏洞有如下的危害:盗取各种用户的账号、窃取用户的cookie然后冒充用户甚至是管理员进入网站、劫持用户会话,执行任意操作、刷流量,广告弹窗、网页挂马传播蠕虫病毒、记录用户键盘输入。

三、XSS漏洞分类

          

     反射性XSS :非持久型的XSS,没有长期被放在服务器中,是现在最容易出现的一种XSS 漏    洞。当用户在请求某一个URL得治的时候,会携带某一部分数据。当客户端进行访问某一条链接的时候,攻击者就可以将恶意的代码植入到URL中,如果服务器端未对URL的参数做判断或者是过滤,直接就返回相应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而出发反射型XSS。可配合短链接实现钓鱼。反射型XSS的payload常常是构造在网站的某一个通过GET传递的参数中。(对应的数据流向是:浏览器---后端---浏览器)

      存储型XSS :存储型XSS又叫做持久型XSS。它是危害最大的XSS。这种类型的XSS可以将恶意的攻击代码持久化的保存在服务器上,然后被显示到HTML页面中。此类型的XSS漏洞经常出现 在用户评论的页面,将攻击者精心构造的恶意代码保存在数据库中。如果其他的用户访问到该页面时就会触发恶意的XSS代码执行,从而窃取用户的信息。(数据流向:浏览器---后端---数据库---后端---浏览器)

     DOM型XSS :DOM是由许多不同类型的节点共同组成,主要由元素节点、文本节点、属性节点。DOM型XSS漏洞是基于文档对象模型的一种漏洞。这种XSS和反射型XSS、存储型XSS的原理上由本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠的是浏览器端的DOM解析。客户端上的JS脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获得数据并执行。在客户端直接输出DOM内容的时候非常容易触发DOM型XSS漏洞,如doccment.getElementByld("x").innerHTML、doccument.write等。

四、利用方法

1.  XSS构造以及变形:

利用构造html标签和标签

  如:

   

 2. 利用HTML标签的属性值--伪协议

 如: hello

          

 3.  利用JS事件

  如:

       

  常见的事件:

 4. 古老的CSS利用方法

  利用CSS层叠样式表来触发XSS,基本上不能适合现在的主流浏览器。

  如:

  

五、XSS payload变形

    1. 大小写混编:


click me

2. 双写关键字:

alert(/xss/)

3. /代替空格:

4. 反引号代替双引号:

 5. tab水平制表符和回车:在一些位置添加Tab和回车符号来绕过关键字检测

1. <img src='#' onerror
='alert(/xss/)' />
2. click me!<A href="j
avascript:alert(/xss/)">click me!

6. HTML实体编码和URL编码:


六、防护总结

    对于存储型和反射型:1. 修改为纯前端渲染,把代码和数据分开。浏览器先加载静态的HTML,此HTML中不包含任何跟业务相关的数据。然后浏览器执行HTML中的JavaScript。JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上。但是纯前端的渲染还要避免DOM型XSS漏洞,如:onload和Javascript:xxx事件。2. 对HTML做充分的转义操作。非必要不使用HTML拼接,如果拼接HTML是必要的,就要采用市面上安全合适的转义库,对HTML模板进行充分的转义。常用的模板引擎有:doT.js、ejs、FreeMarker等。。

   对于DOM型XSS攻击,在使用.innerHTML   outerHTML document.write()时不要把不可信的数据插入到HTML页面中,应尽量使用.textContent .setAttribute()等。 如果使用到Vue/React技术栈,不使用v-html/dangerouslySetInnerHTML功能,就在前端render阶段避免innerHTML、outerHTML的XSS隐患。尽量避免使用DOM中的内联事件监听器,如:location onclick onerror   onload  onmouseover以及标签的href属性,javascript的eval()、setTimeout()、setInterval()等,都能将恶意的字符串作为代码运行。如果项目中有用到这些的话,一定要避免在字符中拼接不可信的数据。

      其他方法:输入内容长度控制,虽然无法完全避免xss,但是可以增加攻击难度。HTTP-only Cookie:禁止javascript读取某些敏感的cookie,就算攻击者完成攻击也无法读取cookie。加入验证码机制:防止脚本冒充用户提交危险操作。执行严格的CSP(Content Security Policy)策略。