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

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

第三次手撸,再崩溃真的要本地写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 flagsubmit,拿到flag。

**

0x04

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

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

2017年8月6日 00:41:40

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值