点开网页下载了一个文件,右键用记事本打开
发现是有<script>
标签,猜测是一个HTML文件,于是放在本地服务器中运行一下(放入自己phpstudy的www目录下),得到这个界面
打开源码
<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]button
if(e.ment';
for(Y in $=' ')
with(_.split($[Y]))_=join(pop());
eval(_)
</script>
最后这里eval()中,下划线 _明显是一个变量。
这时候打开控制台的调试器,控制台的开发者模式调试代码,设置断点,监控变量“_”的值发现其值是一段函数
将这段函数复制下来
另外一种方法:
将eval替换成alert函数弹窗显示其值
function
$(){var e=document.getElementById("c").value;
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)
}
}
}
document.write('<input id="c"><button onclick=$()>Ok</button>');
delete _
这时候就需要考察我们代码审计的能力了,这里是一个正则表达式,第一个if中开头的^,我们查找一下他的用法:
他在这里是匹配它后面为开头的字符串,所以在这段代码中就是寻找开头为be0f23的字符串,冰球只有字符个数为16才可继续进行下去
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null)
第二个if开头中23明显是接着第一段’be0f23‘中末尾的23,而第四个if中的c则是姐第二段末尾的c,因此,我们将这段连起来就是:‘be0f233ac7be98aa’这个字符串,再将这串输入最开始web100的输入框中,就会运行这个函数,输出flag
总结:本题主要考察代码审计的能力,以及开头要注意到下划线_是一个变量,需要探究它所代表的意义,之后最开始的界面就是一个执行源码的脚本,所以将字符串输入到登录框内即可