35C3 Junior CTF WriteUp
2018-12-31 本文已影响166人
Eumenides_62ac
Web
flags
打开给了源码:
<?php
highlight_file(__FILE__);
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'ot';
$lang = explode(',', $lang)[0];
$lang = str_replace('../', '', $lang);
$c = file_get_contents("flags/$lang");
if (!$c) $c = file_get_contents("flags/ot");
echo '<img src="data:image/jpeg;base64,' . base64_encode($c) . '">';
主要是控制接收的
HTTP_ACCEPT_LANGUAGE
。通过
....//
来绕过str_replace('../', '', $lang);
。这样....//
会变成../
。构造:
把图片另存为
1.php
后可以得到flag。Mc Donald
访问robots.txt
发现DS.Store
泄露。
使用工具得到:
图片.png
Logged In
首先登录。
抓包得到验证码。
这里有一个功能,能创建小程序玩。
访问
http://35.207.132.47/pyserver/server.py
得到源码。看得出是拿
flask
写的。通过阅读源码知道了管理员是
admin
。尝试用admin
登录:cookie
里给了flag:saltfish
给了源码:
<?php
require_once('flag.php');
if ($_ = @$_GET['pass']) {
$ua = $_SERVER['HTTP_USER_AGENT'];
if (md5($_) + $_[0] == md5($ua)) {
if ($_[0] == md5($_[0] . $flag)[0]) {
echo $flag;
}
}
} else {
highlight_file(__FILE__);
}
第一个条件:md5($_) + $_[0] == md5($ua)
。绕过方法:
第二个条件:
$_[0] == md5($_[0] . $flag)[0]
。这里两个字符串的第一个字符必须要一样。使用python:
from hashlib import md5
import string
import itertools
good = string.ascii_letters + string.digits
for i in itertools.product(good, good, good, good, good):
hashed = md5("".join(i).encode('utf-8')).hexdigest()
if hashed[:2] == "0e" and hashed[2:].isdigit(): # 需要字符串0e开头且后面都要是数字
print(hashed,("".join(i)))
得到byGcY
。
最后payload: