XSS 原理、构造

2023年 1月 4日 39.5k 0

XSS是一种在前端执行JavaScript脚本的攻击方式。随着UGC站点的流行,用户产生数据剧增,数据块的网络连接越来越有利于XSS的实施与传播。XSS带来的危害有:窃取用户cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起ddos攻击; 篡改页面、弹出广告等。

1. 名词解释

  • XSS。全称Cross Site Script,跨站脚本攻击。
  • XSS向量。通常将,一段用于XSS攻击的代码片段称之为XSS向量。比如:
1
<script>alert(/This is a xss test!/)</script>
  • XSS Filter。即跨站脚本过滤器。用于分析用户输入和提交的数据,消除潜在的XSS、恶意的HTML或简单的HTML格式错误。一般,XSS Filter是基于黑白名单的安全过滤策略实施的。比如,仅允许特定的输入字符,或仅阻止特定的输入字符。

2. XSS原理

所有来自COOKIE、POST表单、GET请求、HTTP头的内容都可能是XSS攻击的入口。下面以窃取cookie为例,描述XSS的攻击链路。

2.1 反射型XSS

反射型XSS是一种最常见的XSS方式。XSS向量,通常附加在URL中,诱导用户点击。攻击链路:

  • 攻击者精心构造一个包含恶意字符串的 URL,将其发送给受害者
  • 攻击者欺骗受害者,使其访问该 URL
  • 网站在响应中包含了来自 URL 的恶意字符串
  • 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器
  • 2.2 存储型XSS

    存储型XSS是一种危害很大的XSS方式。通过表单等输入,提交XSS向量,存入数据库。在信息的输出页面,执行XSS向量。在UGC站点,存储型XSS传播速度很快,如果不及时制止,会产生很大影响。攻击链路:

  • 攻击者利用网站的表单插入恶意字符串到网站数据库
  • 受害者请求网站页面
  • 网站在响应中包含来自数据库的恶意字符串,并返回给受害者
  • 受害者的浏览器执行了响应中的恶意字符串,将受害者的 cookie 发送到了攻击者的服务器
  • 2.3 DOM Based XSS

    DOM Based XSS,是通过修改受害者浏览器中的DOM环境,来执行攻击的。也就是说,页面响应不会更改,但是由于DOM环境中发生的恶意修改,页面中攻击脚本能够被执行。攻击链路:

  • 攻击者构造一个包含恶意字符串的 URL,将其发送给受害者。
  • 攻击者欺骗受害者,使其访问了该 URL
  • 网站接收到响应,但是响应中并不包含恶意字符串
  • 受害者浏览器执行响应中合法的 JavaScript,导致恶意代码插入到了页面中
  • 受害者浏览器执行插入到页面中的恶意代码,将 cookie 发送到了攻击者的服务器
  • 2.4 MXSS

    突变XSS,浏览器的解析引擎将一段没有威胁的代码渲染成具有威胁的XSS攻击代码,攻击代码可能被js或是其他流程输出到DOM中或是在其他地方被再次渲染导致XSS的执行。这种XSS利用方式具有很强的攻击性。攻击链路:

  • 攻击者精心构造一个包含非敏感字符串的URL,将其发送给受害者
  • 攻击者欺骗受害者,使其访问该 URL
  • 网站在响应中包含了来自URL的字符串
  • 浏览器将响应中的非敏感字符串,渲染成可执行的XSS攻击代码。
  • 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器
  • 2.5 UXSS

    浏览器通用型XSS,利用浏览器或浏览器插件漏洞来构造XSS。不同于其他XSS方式,只能获取同源(同协议、同域名、同端口)信息。UXSS能够对没有漏洞的页面发起攻击。

    3. XSS构造方式

    这里列出了七种方法:

    3.1 利用<>标记注入HTML/JavaScript

    如果能够引入<>标记,可以直接构造JavaScript编写的XSS向量,就可以成功注入。这部分的关键在于找到可以回显的输入点,闭合<之前的字符配对。

    1
    
    <script>alert(/XSS/)</script>
    

    3.2 利用HTML标签属性执行XSS

    很多HTML标记的属性都支持JavaScript:[code] 伪协议,这类特殊的协议由JavaScript的解释器运行,所以用户可以利用部分HTML标记的属性进行XSS。如下面的代码:

    1
    2
    
    <img src = "javascript:alert(/XSS1/);">
    <table background = "javascript:alert(/XSS2/)"></table>
    

    但并不是所有浏览器支持伪协议。

    3.3 利用空格、回车、Tab等分隔符

    由于通常XSS Filter采取的黑名单策略,不一定将全部分隔符列为敏感字符。JavaScript语法中以下三种方式都能编写合法的语句:

    • 如果JavaScript引擎确定一个句子完成,而行尾有换行符,那么分号可以省略。
    • 如果一行中有多个句子,那么每句都得用分号结束。
    • 额外的空白无论以何种方式添加都可以,在构成一个完整的语句或遇到分号之前不会结束。这里就是利用了第三条,拆分敏感字符,绕过XSS Filter
    1
    2
    3
    
    <img src = "https://www.chenshaowen.com/blog/javas
    cript:
    alert(/XSS/)" width = "100">
    

    3.4 对标签的属性值转码

    Web系统对于普通HTML标记的属性进行过滤,还可以通过编码处理来绕过。因为HTML中属性本身支持ASCII码形式。

    1
    2
    3
    
    <img src = "javascript:alert(/XSS/);">
    替换成
    <img src = "https://www.chenshaowen.com/blog/javascrip&">
    

    3.5 产生自己的事件

    JavaScript与HTML之间的交互是通过事件来实现的,比如click、mouseover等动作触发事件处理函数执行。事件可以让javaScript执行,当然也可以用来执行XSS脚本。

    1
    
    <img src = "https://www.chenshaowen.com/blog/principle-and-construction-of-xss.html" onerror = alert(/XSS/)>
    

    3.6 利用CSS跨站解析

    XSS跨站脚本的另一个载体是CSS样式表,使用CSS样式表执行JavaScript具有隐蔽、灵活多变等特点,但是有一个很大的缺点是:各浏览器之间不能通用,甚至同一浏览器的不同版本之间都不能通用。使用CSS直接执行JavaScript代码的示例如下:

    1
    
    <div style="background-image: url(javascript:alert('XSS'))">
    

    3.7 扰乱过滤规则

    利用前面叙述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,攻击者能顺利绕过XSS Filter的重重过滤。但是,开发者在开发过程中,可能也已经考虑到各种触发XSS的情况,让系统变得更加牢固安全。但是攻击者的手段是多种多样的,看看这些示例:一个正常的XSS输入:

    1
    
    <img src = "javascript:alert(1);">
    

    转换大小写后的XSS:

    1
    
    <IMG SRC = "javascript:alert(1);">
    

    大小写混淆的XSS:

    1
    
    <ImG SRc = "jAVasCRIpT:AlerT(1);">
    

    不用双引号,而是使用单引号的XSS:

    1
    
    <img src='javascript:alert(0):'>
    

    不使用引号的XSS:

    1
    
    <img src=javascript:alert(0);>
    

    其他:

    1
    
    <img/src="javascript:alert('XSS');">
    

    4. 参考

    • http://drops.xmd5.com/static/drops/tips-956.html
    • http://www.secist.com/archives/1785.html
    • http://www.contriver.me/xss-construction-method-conclusion/
    • https://segmentfault.com/a/1190000006904327

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论