小迪安全笔记-23

第23天:WEB攻防-Python考点_CTF与CMS-SSTI模版注入_PYC反编译

PYC文件

python文件编译后生成的字节码文件(byte code),pyc文件经过python解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似java的.class文件,一般python文件改变后,都会重新生成pyc文件。

pyc文件反编译平台:

https://tool.lu/pyc

SSTI

ssti存在于多种计算机语言中

SSTI(模板注入)漏洞:
https://www.cnblogs.com/bmjoker/p/13508538.html

模板引擎:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。

SSTI:服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。

凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。

SSTI安全问题在生产环境中产生?

存在模板引用的地方,如404错误页面显示;

存在数据接收引用的地方,如模板解析获取参数数据。

如何判断存在SSTI漏洞?

查看源代码,是否使用框架包;

是否使用类似flask.render.template.string()函数

在可控参数中输入类似/0,看界面是否解析2-2

发现SSTI漏洞之后,思路就是命令执行和文件读取。
黑盒里面基本上找不到SSTI模板注入。

[WesternCTF2018]shrine

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
return open(__file__).read()


@app.route('/shrine/<path:shrine>')
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)

s = s.replace(‘(‘, ‘’).replace(‘)’, ‘’)

看到这行,说明()被过滤了,但是可以双写绕过

2-2.jpg

先测试一下

/shrine/

当前脚本的全局变量.jpg

url_for()函数是用于构建操作指定函数的 URL
get_flashed_messages()函数是获取传递过来的数据

/shrine/

/shrine/