WEB渗透学习笔记6——XSS漏洞

XSS——跨站脚本漏洞

跨站脚本(Cross-Site Scripting),简称为XSS或CSS或跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响。恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。可以用于钓鱼攻击,挂马,cookie获取,前端js挖矿等攻击行为,而且广泛适用于和其他漏洞结合,达到攻击服务器的目的

  • 防范:

    1.对所有不可信的输入数据进行恰当的转义escape

    2.使用白名单的具有恰当的规范化解码功能的输入验证方法

    3.使用内容安全策略(CSP)来抵御整个站点的攻击

  • XSS根据效果不同可以分为三类:

    1.反射型XSS(reflected)

    2.存储型XSS(stored)

    3.DOM型XSS

XSS攻击原理

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

形成XSS漏洞的原因本质上还是对输入输出的过滤限制不严格,导致精心构造的脚本输入后,在前端被当做有效代码并执行

反射型XSS

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

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

存储型XSS

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

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

DOM型XSS

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

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

HTML的标签都是节点,而这些节点组成了DOM的整体结构——节点树。通过HTML DOM,树中的所有结点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。HTML DOM树结构如下:
WEB渗透学习笔记6——XSS漏洞
在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个项级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段

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

XSS常用的语句及绕过

XSS常用的测试语句

  1. <script>alert(123)</script>script>
  2. <img src=x onerror=alert(123)>
  3. <svg onload=alert(1)>
  4. <a href=javascript:alert(1)>

常见的绕过

  • JS编码

    JS提供了四种字符编码的策略,如下所示:

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

    四个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“\u0065”。对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)。

  • HTML实体编码

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

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

  • URL编码

    这里的URL编码,也是两次URL全编码的结果,如果alert被过滤,结果为%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34

RL编码,也是两次URL全编码的结果,如果alert被过滤,结果为%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34

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