浏览器入门探索教程--console(javascript)

自行安装谷歌浏览器按下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来混淆代码

http://www.jsfuck.com/

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],总之花样很多,无非就是基于一个字符串类型去做操作罢了。

猜你喜欢

转载自blog.csdn.net/Vdieoo/article/details/109613714
今日推荐