攻防世界-NaNNaNNaNNaN-Batman
分析
下载附件后打开查看:
通过审计代码发现,这是一个html网页代码,将其用浏览器打开发现:
其显示结果是一个输入框和一个ok的按钮,这时,查看页面源码,
但是其中的js代码出现了乱码,分析原因,发现是由于eval函数导致的,分析代码可以发现,_ 为定义的一个函数变量,而后续的eval函数传入的参数即为 _ ,所以,之所以出现乱码,是由于eval函数对变量 _ 的处理,那么,将eval换成alert函数,即可再页面弹窗处看到页面的源代码:
将源码复制下来进行代码审计:
解法一:
分析代码中的判断语句:
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
在页面输入框中输入相应字符串:
成功得到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在线运行):
这样,就可以直接得到flag的值!
(附:JS在线运行网址 http://jsrun.net/new)