JavaScript

玩法

只要能提交success这个词,就算成功

设计这个模式,应该是为了让初学者知道如何使用JS并实施攻击
image.png

分析

Low

先进入Low级别看看

可以看到这里先来有一个固定值为ChangeMe
image.png

再看一下源代码和F12,得出前端是有JS代码的,默认对Id为phrase的值进行加密
image.png
image.png

知道这些后,在输入success,看一下什么效果
出现了invalid token,并且Phrase的值为之前的固定值:ChangeMe,为什么?,作为疑问一,下面解释
看一下token,看到这里token值和默认的ChangeMe一样,为什么?作为疑问二,下面解释
image.png
image.png

讲解之前,再看看原PHP代码
Low.php
image.png

index.php
image.png

在说几个知识重要点:
1:想要获取前端自定义的JS函数生成的值,必须要手动调用该函数,然后输入想要的值
**
2:这里输入的值,是跟index.php中md5(str_rot13(“success”))做比较,符合成功,不符合失败

讲解

先输入success的时候会出现invalid token,是因为没有手动调用前端定义的generate_token函数

也就生成不了正确的token值,所以就会使用默认ChangeMe的token值(疑问二的答案)

然后这个token值去跟index.php做比较,失败,所以才会报错,输出invalid token !!!(疑问一的答案)

解法1

问题是没有手动调用函数生成值,那就先调用函数,在生成值
image.png
image.png

解法2

问题是没有手动调用函数生成值,那就生成值,然后抓包换一下值就好了
image.png

将抓到的包的token值改为38581812b435834ebf84ebcc2c6424d6,并forward
image.png
image.png

Medium

先抓个包看一眼token值是什么样的,不是加密了
image.png

看看View Source,懂了,这里是将生成token的值单独放进了一个js文件中
可以看出这里使用了拼接,将 e(do_elsesomething函数传入的值) + Id为phrase的值(用户输入的值) + 固定字符串XX

这里e和Id为phrase的值我们是可以控制
image.png

再看看index.php,判断是是否为XXsuccessXX,是—>成功,不是—>失败
image.png

单独输入seccess看看,看到phrase是success,但是token值不是
image.png

解法

输入success,f12将表单中的value改为success,控制台打入do_elsesomething(“XX”),再点击success的按钮
image.png
image.png
image.png

High

真累,我淦!!!!

好了,直接看View Source,这里看起来跟Medium一样,有个额外的生成token的JS
image.png

访问看看内容,恩,是JS混淆(恩,JS混淆,什么东西???,真是越学越菜了)
image.png

JS混淆讲解

使用JS的混淆加密,其目的是为了保护我们的前端代码逻辑

大概的意思就是通过各种方式去加密JS代码,反正看不懂的JS代码很有可能就是JS混淆

这里就不多说,有兴趣的可以看看这几篇文章:JS混淆安全加固 | JS混淆与解混淆的那些事儿

大概了解过后,继续解题,这里有个JS解混淆网站:JS解混淆
解完过后,关键代码如下

如下图可知:
1.由于有300毫秒延时,所以执行了token_part_1(“ABCD”, 44);
2.然后执行了 token_part_2(“XX”)
3.token_part_3被添加在提交按钮的click事件上,也就是点提交时会触发执行
image.png

再看看index.php
image.png

解法

输入success,f12改value值,
image.png

然后去控制台先将所有的JS输入一遍,包括那些非常长非常长的一部分,但是要排除**选中的以下几行
image.png**

然后依次执行token_part_1(“ABCD”,44)、**token_part_2(“XX”)
image.png

最后点击提交,就ok了
image.png

Impossible

哈哈哈,直接没有输入了,也就不可能了

image.png