感想不想重新打了,直接上题目了 题目传送门
**
**
直接看到第一关题目
一开始以为是道注入题,然后直接看源代码
主要代码:`
<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
**
** 来到第二关,看到
点击下拉框到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}**
** 这道题不是很难,但是自己技术不行,做的很慢。这里提供第二关的另一种解法,这种解法是大佬给的,感觉也挺黑科技的~ 首先还是得改cookie,让privilege=0,然后还是得绕过最后的一个判断。 于是,花式绕过开始了。 直接开chorme F12,然后编辑html,剪切掉select段代码,点击页面,这样页面就没有select了。 然后再把select粘贴回去!没错就是粘贴回去! 然后,然后选print flag,submit,拿到flag。
**
** 大佬给的方法当时我试了挺久才弄出来,主要是自己的理解以及基础不够扎实可以这么说吧,不敢确定自己的想法,不敢确定自己的知识。 主要谈谈收获吧,这道题还是受益匪浅,特别是大佬的方法,一开始非常不理解,这拿出来又放进去,不是没有用吗? 不是的,首先看源码,submit那是一个匿名函数,事件绑定如果用的是匿名函数的话是可以删掉的,两个明文一样的元素不一定是绑定同一个事件,就如这题重新贴进去以后的select已经不是f了,这两个select不是同一个select,但是form的提交还是会把select提交上去,所以就可以绕过f.val那个方法。
从这题个人也可以看出自己的基础不是很牢固,很多原理的东西没弄清楚,今后打算重新看一遍基础的东西,顺便加上原理的深入理解。 至于00的弱判断,今后再加以分析。
2017年8月6日 00:41:40