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)