攻防世界 WEB 高手进阶区 tinyctf-2014 NaNNaNNaNNaN-Batman Writeup

攻防世界 WEB 高手进阶区 tinyctf-2014 NaNNaNNaNNaN-Batman Writeup

题目介绍

image-20210111222831998

题目考点

  • 了解js代码(eval函数、splice函数)
  • 了解正则

Writeup

下载附件打开,如图,目测是 一段js代码

image-20210111224220707

复制的源码:

<script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){	[0]);.splice(0,1)}}}	\'<input id="c">< onclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=["	write(s[o%4]buttonif(e.ment';for(Y in $='	')with(_.split($[Y]))_=join(pop());eval(_)</script>

将文件打开方式 采用 浏览器打开 查看 是一个输入框+按钮

image-20210111224612839

F12 查看页面源码 一眼看去基本啥也没有

image-20210111224734257

回过头去js源代码分析:

  • _等于一个$函数内容
_='function $()
  • 一个输入框 (页面显示的输入框)
<input id="c">< onclick=$()>Ok</>\');
  • 一个重要的函数
eval(_)

这里我查询了eval()函数功能

image-20210111225356323

可见,eval()函数的参数是一个字符串,它将$()函数当作字符串执行了,非法操作导致页面乱码。因而页面html页面没有任何显示,只显示了input标签的内容,但是我们想让源代码正常显示出来,不进行执行,那么,我们就用到了alert弹窗(将eval函数改为alert),将乱码的$()函数源码完整显示出来。

修改源码,继续以浏览器打开,弹出源代码

image-20210111230546262

整理如下:

function $(){
var e=document.getElementById("c").value;	//**重点1**				
if(e.length==16)
   if(e.match(/^be0f23/)!=null)
      if(e.match(/233ac/)!=null)
         if(e.match(/e98aa$/)!=null)
             if(e.match(/c7be9/)!=null){
             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)}		//**重点2**
             }
}
document.write('<input id="c"><button οnclick=$()>Ok</button>');
delete _
  • 看到splice()函数,百度了一下

image-20210111233304719

现在解题思路就有了,我们 输入一个满足条件的e,让重点2输出

分析源码:4个正则匹配

/^be0f23/ ---------- ^ 头部匹配

/233ac/ ---------- 中间匹配

/e98aa$/ ---------- $ 尾部匹配

/c7be9/ ---------- 中间匹配

构造字符串e be0f233ac7be98aa

  • 法一:直接在原来附件浏览器打开的输入框中输入 be0f233ac7be98aa,即可拿到Flag

  • 法二:直接修改源码,只保留输出部分, 如下代码,浏览器打开文件即可拿到Flag

<script>
 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)}	
</script>

image-20210112123933523

posted @ 2021-01-12 13:14  FreeK0x00  阅读(182)  评论(0编辑  收藏  举报