天,这博客的编辑器为什么这么容易崩溃呢?
第三次手撸,再崩溃真的要本地写md了
感想不想重新打了,直接上题目了
题目传送门
**
0x01
**
直接看到第一关题目
一开始以为是道注入题,然后直接看源代码
主要代码:`
<body>
<form action="" method="post">
Username: <input type="text" name="username" value="john" disabled /><br />
Password: <input type="password" name="password" id="s287fg" /><br />
<input type="submit" value="Submit" />
</form>
<script>
var _0xc7f1=[
"\x73\x32\x38\x37\x66\x67",
"\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64",
"\x76\x61\x6C\x75\x65",
"\x69\x5F\x63\x61\x6E\x5F\x6D\x61\x6E\x69\x70\x75\x6C\x61\x74\x64\x5F\x68\x74\x6D\x6C\x5F\x65\x6C\x65\x6D\x65\x6E\x74\x73",
"\x69\x64",
"\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65"
];
f= document[_0xc7f1[1]](_0xc7f1[0]);
f[_0xc7f1[2]]= _0xc7f1[3];
f[_0xc7f1[5]](_0xc7f1[4]);
</script>
</body>
`
是段js混淆。
然后我们把题目转义过来,主要还是js段:
var _0xc7f1=[
"s287fg",
"getElementById",
"value",
"i_can_manipulatd_html_elements",
"id",
"removeAttribute"
];
f= document.getElementById("#s287fg");
f.value= "i_can_manipulatd_html_elements";
f.removeAttribute(id);
这样就看的很清楚了,然后直接随便输入一下看提示
There’s a typo in the password
ps:英语不太好,就直接挂google翻译,大概意思就是密码有个拼写错误
然后把
i_can_manipulatd_html_elements
丢到google翻译,发现是可以直接译出来的:
我能操控html元素
就很奇怪,这里卡顿了几分钟
然后拿 manipulatd 这个丢到有道才发现这个译不出来。。。
正确是 manipulate
拼回原句,密码便是
i_can_manipulate_html_elements
**
0x02
**
来到第二关,看到
点击下拉框到print flag,直接点击submit
提示 Error: You need privilege level 0 to print the flag.
源码:
<body>
<noscript>Error: You need to enable JavaScript in order to complete this challenge.<p></noscript>
<form action="" method="post">
Username: <input type="text" name="username" value="john" disabled /><br />
Password: <input type="password" name="password" id="s287fg" /><br />
<input type="submit" value="Submit" />
</form>
<script>var _0xc7f1=["\x73\x32\x38\x37\x66\x67","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x76\x61\x6C\x75\x65","\x69\x5F\x63\x61\x6E\x5F\x6D\x61\x6E\x69\x70\x75\x6C\x61\x74\x64\x5F\x68\x74\x6D\x6C\x5F\x65\x6C\x65\x6D\x65\x6E\x74\x73","\x69\x64","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65"];f= document[_0xc7f1[1]](_0xc7f1[0]);f[_0xc7f1[2]]= _0xc7f1[3];f[_0xc7f1[5]](_0xc7f1[4]);</script>
</body>
看到这些就头大,硬是照着转义得到:
<script>
var _0xb506=[";","cookie","=","split","length","shift",";","pop","#04jt32","privilege","0","do nothing","val","submit","form","id","removeAttr"];
function getCookie(_0x2b2dx2){
var _0x2b2dx3=";" + document.cookie; // ;privilege=0
var _0x2b2dx4=_0x2b2dx3.split(";" + "privilege" + "=");
if(_0x2b2dx4.length == 2){
return _0x2b2dx4.pop().split(";").shift();
}
}
f= $("#04jt32");
$(form).submit(function(){
if(getCookie("privilege") == 0){
f.val("do nothing");
}
});
f.removeAttr(id);
</script>
这样就比较好了,接下来就是js函数的调用了。
于是那就根据hint弄cookie让privilege=0呗。
只是在做的时候,弄懂了全部代码,最后还是没什么思路。
然后就慢慢弄,发现还是得绕过最后的判断,于是想到了弱相等
"" == "0" // false
0 == "" // true
0 == "0" // true
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true
然后把cookie
Cookie:PHPSESSID=lch8u9vmruf97i9inpmk24j2q4; privilege=1
改成了
privilege=0
privilege=
privilege= (ps:这里是空格)
privilege=false
privilege=null
privilege=\t
等等都不行,最后随便试了一个
privilege=00
莫名其妙就过了~拿到flag
Congratulations!
flag{y0u_H4v3_m@5teR3d_t3h_ba5!cS}
**
0x03
**
这道题不是很难,但是自己技术不行,做的很慢。这里提供第二关的另一种解法,这种解法是大佬给的,感觉也挺黑科技的~
首先还是得改cookie,让privilege=0,然后还是得绕过最后的一个判断。
于是,花式绕过开始了。
直接开chorme F12,然后编辑html,剪切掉select段代码,点击页面,这样页面就没有select了。
然后再把select粘贴回去!没错就是粘贴回去!
然后,然后选print flag,submit,拿到flag。
**
0x04
**
大佬给的方法当时我试了挺久才弄出来,主要是自己的理解以及基础不够扎实可以这么说吧,不敢确定自己的想法,不敢确定自己的知识。
主要谈谈收获吧,这道题还是受益匪浅,特别是大佬的方法,一开始非常不理解,这拿出来又放进去,不是没有用吗?
不是的,首先看源码,submit那是一个匿名函数,事件绑定如果用的是匿名函数的话是可以删掉的,两个明文一样的元素不一定是绑定同一个事件,就如这题重新贴进去以后的select已经不是f了,这两个select不是同一个select,但是form的提交还是会把select提交上去,所以就可以绕过f.val那个方法。
从这题个人也可以看出自己的基础不是很牢固,很多原理的东西没弄清楚,今后打算重新看一遍基础的东西,顺便加上原理的深入理解。
至于00的弱判断,今后再加以分析。
2017年8月6日 00:41:40