#CTFWEB#对一道入门题的思考

来源:互联网 发布:数据库安全管理制度 编辑:程序博客网 时间:2024/05/16 07:04

天,这博客的编辑器为什么这么容易崩溃呢?

第三次手撸,再崩溃真的要本地写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=falseprivilege=nullprivilege=\t

等等都不行,最后随便试了一个
privilege=00
莫名其妙就过了~拿到flag

Congratulations!flag{y0u_H4v3_m@5teR3d_t3h_ba5!cS}

**

0x03

**
这道题不是很难,但是自己技术不行,做的很慢。这里提供第二关的另一种解法,这种解法是大佬给的,感觉也挺黑科技的~
首先还是得改cookie,让privilege=0,然后还是得绕过最后的一个判断。
于是,花式绕过开始了。
直接开chorme F12,然后编辑html,剪切掉select段代码,点击页面,这样页面就没有select了。
然后再把select粘贴回去!没错就是粘贴回去!
然后,然后选print flagsubmit,拿到flag。

**

0x04

**
大佬给的方法当时我试了挺久才弄出来,主要是自己的理解以及基础不够扎实可以这么说吧,不敢确定自己的想法,不敢确定自己的知识。
主要谈谈收获吧,这道题还是受益匪浅,特别是大佬的方法,一开始非常不理解,这拿出来又放进去,不是没有用吗?
不是的,首先看源码,submit那是一个匿名函数,事件绑定如果用的是匿名函数的话是可以删掉的,两个明文一样的元素不一定是绑定同一个事件,就如这题重新贴进去以后的select已经不是f了,这两个select不是同一个select,但是form的提交还是会把select提交上去,所以就可以绕过f.val那个方法。

从这题个人也可以看出自己的基础不是很牢固,很多原理的东西没弄清楚,今后打算重新看一遍基础的东西,顺便加上原理的深入理解。
至于00的弱判断,今后再加以分析。

2017年8月6日 00:41:40

原创粉丝点击