攻防世界-NaNNaNNaNNaN-Batman

攻防世界-NaNNaNNaNNaN-Batman

分析

下载附件后打开查看:

image-20211113083905625

通过审计代码发现,这是一个html网页代码,将其用浏览器打开发现:

image-20211113084017872

其显示结果是一个输入框和一个ok的按钮,这时,查看页面源码,

但是其中的js代码出现了乱码,分析原因,发现是由于eval函数导致的,分析代码可以发现,_ 为定义的一个函数变量,而后续的eval函数传入的参数即为 _ ,所以,之所以出现乱码,是由于eval函数对变量 _ 的处理,那么,将eval换成alert函数,即可再页面弹窗处看到页面的源代码:

image-20211113084330846

image-20211113084354592

将源码复制下来进行代码审计:

image-20211113085141543

解法一:

分析代码中的判断语句:

if(e.length==16)
    if(e.match(/^be0f23/)!=null)
                if(e.match(/233ac/)!=null)
                    if(e.match(/e98aa$/)!=null)
                        if(e.match(/c7be9/)!=null){

第一个if判断意思为字符串长度必须是16

第二个if判断意思为必须是以 be0f23 开头

第三个if语句意思为必须包含 233ac

第四个if判断语句为必须以 e98aa 结尾

第五个if判断语句为必须包含 c7be9

那么,按顺序排列出来之后的字符串为 be0f23 233ac c7be9 e98aa ,但是,此时的字符串长度为21,但是根据代码中判断,长度必须为16,则进行重复字符删减可以得到输入的字符串应该为:be0f233ac7be98aa

在页面输入框中输入相应字符串:

image-20211113085821758

image-20211113085849773

成功得到flag!

解法二

如果不想对if判断语句进行分析,可以直接看if判断成功后的执行代码:

var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
    document.write(s[o%4][0]);
    s[o%4].splice(0,1)
}

分析代码可知道,最后的document.write即为输出的flag,将这段代码尝试运行(可自己百度js在线运行):

image-20211113090217048

这样,就可以直接得到flag的值!

(附:JS在线运行网址 http://jsrun.net/new

猜你喜欢

转载自blog.csdn.net/weixin_46784800/article/details/121299968