XSS攻击与绕过

概念:

  1、跨站脚本(Cross-Site Scripting),简称XSS或CSS或跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,代码注入的一种。

  2、XSS漏洞一直被认为是web安全中危害较大的漏洞,在owasp一直处于top3,而在对sql注入防范越来越严密的今天,xss也成了绝大部分黑客更喜欢的漏洞利用方式。

  3、XSS可分为三种:反射性、存储型、DOM型

原理:

  攻击者再有漏洞的前段页面嵌入恶意代码,导致受害者访问页面时不知情的情况下触发恶意代码,获取受害者关键信息。

反射性XSS

反射性XSS又称非持久型XSS,这种攻击方式往往具有一次型。

攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意连接发给目标用户。当目标用户访问改链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,浏览器解析这段代码后就会触发XSS攻击,完成攻击者想要的功能(获取cookie、url、浏览器信息、IP等)

例:

1、“输入”表单中输入内容,单击“提交”按钮后,将输入的内容放到“输出”表单中,例如当输入“12”,单击“提交按钮”,“12”将被输出到“输出”表单中。

2、当访问http://127.0.0.1/web/XSS/xss1.php?xss_input_value="><img src=1+onerror=alert('xss')>

输出到页面的HTML代码变成了如下所示。可以看到,输入的双引号闭合了value属性的双引号,输入的>闭合了input的标签<,导致输入的<img src=1 onerror=alert(‘xss’)>变成了HTML标签。

浏览器渲染时,执行了<img src=1 onerror=alert(‘xss’)>,JS函数alert()导致浏览器弹窗。

(注::弹框实际上并不能造成什么危害,但这是我们用来测试xss漏洞点的一个方法。

<script>标签中可以执行javascript代码,所以理论上可以做任何事)

存储型XSS:

存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意叫你本的帖子时,恶意脚本会在他们的浏览器中得到执行。

例:

1、储存型XSS页面实现的功能是:获取用户输入的留言信息,标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面上。

2、当输入标题为<img src=X onerror=alert(‘xss’)>,然后将标题输出到页面时,页面执行了<img src=1 onerror=alert(‘xss’)>,导致弹窗。此时,这里的XSS就是持久性的,也就是说,任何人访问该URL时都会导致一个显示XSS的框

 DOM型XSS:

DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

HTML的标签都是节点,而这些节点组成了DOM的整体结构——节点树。通过HTML DOM,树中的所有结点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。

攻击方式

用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

1、XSS常用的测试语句:

  <script>alert(1)</script>

  <img src=x onerror=alert(1)>

  <svg onload=alert(1)>

  <a href=javascript:alert(1)>

2、常见的绕过

JS编码、HTML实体编码、URL编码

JS提供了四种字符编码的策略:

  三个八进制数字,如果个数不够,在前面补0,例如“e”的编码为“145”。

  两个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“x65”。

  四个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“u0065”。

  对于一些控制字符,使用特殊的C类型的转义风格(例如 和 )。

HTML实体编码:  

  命名实体:以&开头,以分号结尾如 “<”的编码是“<”。

  字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为“&#数值”。例如”<”可以编码为“<”和“<”。

URL编码:

  在使用XSS编码测试时,需要考虑HTML渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试。

原文地址:https://www.cnblogs.com/xiangbing123/p/12969428.html