知识点
1、PYC文件反编译
2、Python-Web-SSTI
3、SSTI模版注入利用分析
彩蛋~
案例
PY反编译-PYC编译文件反编译源码
SSTI入门-原理&分类&检测&分析&利用
SSTI考点-CTF靶场-[WesternCTF]shrine
SSTI考点-CMS源码-MACCMS_V8.X执行
模板文件决定了网站显示的样式,换个模版数据不会受影响,只是会换个显示方式
PY反编译-PYC编译文件反编译源码
pyc文件时py文件编译后生成的字节码文件(byte code),pyc文件经过python解释器最终会生成机器码运行,因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后,都会重新生成pyc文件。
反编译平台:
https://tool.lu/pyc/
https://tools.bugscaner.com/decompyle/
之前我自己做题用到的好用的反编译平台:https://rivers.chaitin.cn/tools/pyc2py
反编译工具:
https://github.com/wibiti/uncompyle2
SSTI入门-原理&分类&检测&分析&利用
1、什么是SSTI?有什么漏洞危害?
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模版内容的一部分,模版引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模版的语句,因而可能导致了敏感信息泄露、代码执行、GetShell等问题。其影响范围主要取决于模版引擎的复杂性
2、如何判断检测SSTI漏洞的存在?
-\输入的数据会被浏览器利用当前脚本语言用解析执行,譬如输入4之类的看它会不会进行解析
3、SSTI会产生在哪些语言开发应用?
4、SSTI安全问题在生产环境哪里产生?
-\存在模版引用的地方,如404错误页面展示
-\存在数据接受引用的地方,
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 Wordl!'
@app.errorhandler(404)
def page_not_found(e):
template = '''
{%% block body %%}
<div class = "center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>//可控值 留给数据库语句去操作取出数据 显示
</div>
{%% endblock %%}
''' % (request.arags.get('404_url'))
return render_template_string(template),404
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
当输入404_url=4,发现回显为4,说明代码被解析了,那说明存在SSTI漏洞,可以执行命令执行操作
web应用是很多模版,它是一个界面样式的
h3之间存在可以控制执行的地方,譬如说下次发文章就要靠这一行代码去执行一些操作,但是如果被嗨客发现了就会被用来进行命令执行
SSTI考点-CTF靶场-[WesternCTF]shrine
1、源码分析SSTI考点
2、测试判断SSTI存在
3、分析代码过滤和FLAG存储
4、利用Flask两个函数利用获取
https://blog.csdn.net/houyanhua1/article/details/85470175
import flask
import os
app=flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG') //flag就在这里
@app.route('/')
def index():
return open(__file__).read() //访问当前脚本并读取
@app.route('/shrine/<path.shrine')//要先访问到shrine这个路径才能进行ssti注入
def shrine(shrine)
def safe_jinja(s):
s = s.replace('(','').replace(')','')//过滤左右括号
blacklist = ['config','self'] //黑名单
return ''.join(['{{% set {}=None %}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
ssti考点判断,看有没有引用flask框架,看到有没有flask.render_template_string函数,看到这种函数不用想,就是ssti。
url_for()函数是用于构建操作指定函数的URL
get_flashed_messages()函数是获取传递过来的数据
上面用的绕过姿势可以用于他过滤了括号也就是函数的情况。
SSTI考点-CMS源码-MACCMS_V8.X执行
苹果cms这个源码经常被用来做一些sese网站,所以百度会说这个官网有违法信息(乐)
存在ssti命令执行
Payload:index.php?m=vod-search&wd={if-dddd:phpinfo()} {endif-dddd}
最终在ifex函数中找到了eval命令执行函数,可以实行控制了。
总结:
1、根据wd传递的代码找指向文件
2、index->vod->tpl->ifex->eval
3、构造Payload带入ifex并绕过后执行