目录
PYC文件反编译
SSTI
flask模板注入
BUUCTF-shrine靶场题目
SSTI考点-CMS源码-MACCMS_V8.X(苹果cms)执行
介绍:pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改变后,都会重新生成pyc文件。但在实战中很难获得pyc文件,获得的可以在反编译网站上尝试
介绍:SSTI就是网站的模板、主题等文件,它可以在不改变网站源码的情况下,对web站点输出的界面进行美化,修改。但是也会带来安全隐患。
1,漏洞成因:
就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
2,如何判断检测SSTI漏洞的存在?
输入的数据会被浏览器利用当前脚本语言调用解析执行
3、SSTI会产生在那些语言开发应用?并不是只有python有 其他开发语言也会存在的
https://img-blog.csdnimg.cn/1c99cec2bbc74074a3df099840df217d.pnghttps://img-blog.csdnimg.cn/1c99cec2bbc74074a3df099840df217d.png4、SSTI安全问题在生产环境那里产生?
存在模版引用的地方,如404错误页面展示
存在数据接收引用的地方,如模版解析获取参数数据
什么是Flask?
Flask是一个用Python编写的Web应用程序框架。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 这两个都是Pocco项目。Flask通常被称为微框架。
演示代码:
from flask import Flask
from flask import request
from flask import config
from flask import render_template_string
app = Flask(__name__)
app.config['SECRET_KEY'] = "flag{SSTI_123456}"
@app.route('/')
def hello_world():
return 'Hello World!'
@app.errorhandler(404)
def page_not_found(e):
template = '''
{%% block body %%}
Oops! That page doesn't exist.
%s
{%% endblock %%}
''' % (request.args.get('404_url'))
return render_template_string(template), 404
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
当访问一个不存在的地址时:
Oops! That page doesn't exist.这句话就是代码中page_not_found(e)函数所展示的页面,
然后细细对照一下页面中与源码中不同的点 发现 None对应 源码中的%s (输出),在分析源码 % (request.args.get('404_url')) 是接受 404_url传过来的参数,
所以这里可以构造一个payload为: 404_url={{1+1}}就会在None处回显2,也就是说这里的{{payload}}会被当做代码执行,所以可以利用反弹shell 直接创建后门文件等等操作
1、源码分析SSTI考点
2、测试判断SSTI存在
3、查看是否存在flask函数库
三个标记的位置,就是存放flag的位置 、过滤小括号()处、 以及函数flask.render_template_string 就可以判断处引用模板了 ,基本就是ssti注入类型
url_for()函数是用于构建操作指定函数的URL 则:
/shrine/{{url_for.__globals__}}
使用global内建属性
会以字典类型返回当前位置的全部模块,方法和全局变量,用于配合__init__
使用
get_flashed_messages()函数是获取传递过来的数据 ,可以返回所有的全局变量,在根据最初的源码 搜索关键字 app
先去看看 current_app里面的内容
构造payload /shrine/{{url_for.__globals__['current_app'].config}}
获取flag
根据网上别人复现的文章 借鉴个poc
http://127.0.0.1/maccms/index.php?m=vod-search&wd={if-A:phpinfo()}{endif-A}
分析一下payload,是在index.php文件中传递参数 m = vod-search
使用phpstrom打开源码项目开始进行分析
发现是通过be函数传递进来的变量。在分析be函数,就是接受变量的罢了,然后在分析变量 m接受到 m = vod-search 在干什么
在继续追踪 变量 $ac 可以看到 $ac 就变成了一个PHP文件名了
审计 vod.php 发现 $method ==search时 payload中的 $wd也出现了
发现 变量wd被 $tpl处理 然后全局搜$tpl 一个一个分析 发现index.php文件中
$tpl指向函数 ifex() 找到ifex()函数的声明,发现经过过滤后,回到exec函数去执行,所以出现了rce漏洞