<?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: Al Fondo Del Ciber</title>
    <description>The latest articles on DEV Community by Al Fondo Del Ciber (@alfondodelciber).</description>
    <link>https://dev.to/alfondodelciber</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%2F1264040%2F2d8ccd09-145a-4614-930d-b4b74ae99509.jpeg</url>
      <title>DEV Community: Al Fondo Del Ciber</title>
      <link>https://dev.to/alfondodelciber</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfondodelciber"/>
    <language>en</language>
    <item>
      <title>Cómo detectar usuarios existentes en un sistema con un ataque de fuerza bruta inteligente ⚠️🔐</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Mon, 30 Jun 2025 12:01:00 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/como-detectar-usuarios-existentes-en-un-sistema-con-un-ataque-de-fuerza-bruta-inteligente-54pf</link>
      <guid>https://dev.to/alfondodelciber/como-detectar-usuarios-existentes-en-un-sistema-con-un-ataque-de-fuerza-bruta-inteligente-54pf</guid>
      <description>&lt;h2&gt;
  
  
  Cómo detectar usuarios existentes en un sistema con un ataque de fuerza bruta inteligente ⚠️🔐
&lt;/h2&gt;

&lt;p&gt;En muchos sistemas web, el proceso de autenticación puede tener vulnerabilidades sutiles que permiten a un atacante saber si un usuario existe o no, simplemente analizando los mensajes de error que devuelve el servidor. Esta información, aunque parezca trivial, puede facilitar ataques de fuerza bruta mucho más efectivos y peligrosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué sucede realmente?
&lt;/h2&gt;

&lt;p&gt;Cuando intentamos iniciar sesión con credenciales erróneas, el servidor responde con un mensaje genérico que indica que el usuario o la contraseña no son válidos. Sin embargo, si el sistema no maneja correctamente estos mensajes, puede devolver pistas diferentes cuando el usuario no existe frente a cuando la contraseña es incorrecta.&lt;/p&gt;

&lt;p&gt;Este pequeño fallo es clave: al distinguir estas respuestas, un atacante puede comprobar rápidamente qué usuarios existen en la base de datos sin necesidad de adivinar contraseñas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herramientas y técnica para detectar usuarios existentes
&lt;/h2&gt;

&lt;p&gt;Para explotar esta vulnerabilidad usamos un proxy interceptador, como el que ofrece BurpSuite, que permite capturar y modificar peticiones web en tiempo real.&lt;/p&gt;

&lt;p&gt;El proceso es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activar el proxy interceptador.&lt;/li&gt;
&lt;li&gt;Realizar un intento de inicio de sesión con datos cualquiera (por ejemplo, usuario “complementes” y contraseña “test”).&lt;/li&gt;
&lt;li&gt;Capturar la petición y enviarla a una herramienta de ataque, en este caso el módulo “intruder” de BurpSuite.&lt;/li&gt;
&lt;li&gt;En el intruder, seleccionar el parámetro &lt;code&gt;username&lt;/code&gt; para reemplazarlo por una lista de usuarios potenciales.&lt;/li&gt;
&lt;li&gt;Iniciar el ataque de fuerza bruta con esta lista para comprobar qué usuarios existen.&lt;/li&gt;
&lt;li&gt;Analizar las respuestas con un filtro “grep match” para detectar diferencias en los mensajes de error.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Análisis de respuestas y detección
&lt;/h2&gt;

&lt;p&gt;El filtro busca la expresión &lt;code&gt;"invalid username or password"&lt;/code&gt; en la respuesta. Si esta aparece exactamente igual en todas, no hay problema. Pero si alguna respuesta se diferencia aunque sea mínimamente —por ejemplo, un signo de puntuación que falta—, el servidor podría estar tratando de ocultar la diferencia, pero nos da una pista valiosa.&lt;/p&gt;

&lt;p&gt;En este caso, la ausencia de un punto en el mensaje de error para un usuario concreto indica que ese usuario &lt;strong&gt;sí existe&lt;/strong&gt; en la plataforma. Así, sin conocer la contraseña, sabemos con certeza que el usuario está registrado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Este tipo de vulnerabilidad, conocida como &lt;strong&gt;enumeración de usuarios por mensajes de error&lt;/strong&gt;, es muy común y peligrosa. Permite que un atacante optimice sus ataques de fuerza bruta o ingeniería social.&lt;/p&gt;

&lt;p&gt;Por ello, es fundamental que los desarrolladores implementen mensajes de error uniformes, genéricos y que no revelen ninguna pista sobre la existencia o no de un usuario.&lt;/p&gt;




&lt;p&gt;🚨 La seguridad no está solo en proteger contraseñas, sino también en no dar pistas innecesarias a posibles atacantes.&lt;/p&gt;

&lt;p&gt;TikTok: &lt;a href="https://www.tiktok.com/@alfondodelciber/video/7519933408512871702" rel="noopener noreferrer"&gt;https://www.tiktok.com/@alfondodelciber/video/7519933408512871702&lt;/a&gt;&lt;br&gt;
YouTube Shorts: &lt;a href="https://youtube.com/shorts/tDJzlBVeu9M" rel="noopener noreferrer"&gt;https://youtube.com/shorts/tDJzlBVeu9M&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  AlFondoDelCiber #SeguridadWeb #FuerzaBruta #Ciberseguridad
&lt;/h1&gt;

</description>
      <category>alfondodelciber</category>
      <category>ciberseguridad</category>
      <category>fuerzabruta</category>
      <category>seguridadweb</category>
    </item>
    <item>
      <title>Inyección de JavaScript a través de una búsqueda mal validada 🧠💻⚠️</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Wed, 25 Jun 2025 18:14:59 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/inyeccion-de-javascript-a-traves-de-una-busqueda-mal-validada-89</link>
      <guid>https://dev.to/alfondodelciber/inyeccion-de-javascript-a-traves-de-una-busqueda-mal-validada-89</guid>
      <description>&lt;h3&gt;
  
  
  Inyección de JavaScript a través de una búsqueda mal validada 🧠💻⚠️
&lt;/h3&gt;

&lt;p&gt;Una de las formas más simples —y peligrosas— de encontrar vulnerabilidades XSS es observar cómo se comporta una página al mostrar resultados de búsqueda.&lt;/p&gt;

&lt;p&gt;En este caso, nos encontramos con una aplicación que incrusta directamente el valor de búsqueda dentro de una variable JavaScript. Eso por sí solo ya es una bandera roja 🚩.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Verificar cómo se refleja el input
&lt;/h2&gt;

&lt;p&gt;Hacemos una búsqueda sencilla, por ejemplo &lt;code&gt;hola&lt;/code&gt;, y observamos el código fuente. Lo encontramos tanto en el contenido de la página como dentro de un bloque &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, asignado a una variable JavaScript. Algo así como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hola&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;img&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/search/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí es donde empieza el problema.&lt;/p&gt;

&lt;p&gt;Paso 2: ¿Podemos romper esa variable?&lt;br&gt;
La idea es simple: si no se ha escapado correctamente el contenido que introducimos, podríamos cerrar la cadena de la variable y escribir nuestro propio código JavaScript.&lt;/p&gt;

&lt;p&gt;Intentamos inyectar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;;alert(1);// 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero falla. ¿Por qué?&lt;/p&gt;

&lt;p&gt;Paso 3: Diagnóstico en consola&lt;br&gt;
Al abrir la consola del navegador, vemos que hay un error de sintaxis. Eso significa que hemos salido correctamente de la variable, pero algo está mal formado.&lt;/p&gt;

&lt;p&gt;Y efectivamente: hay una comilla colgando al final del script original, porque el input que metimos no cerró bien el bloque.&lt;/p&gt;

&lt;p&gt;Paso 4: Solucionar la sintaxis&lt;br&gt;
Entonces la solución es cerrar la comilla abierta y añadir algo que equilibre el código JavaScript.&lt;/p&gt;

&lt;p&gt;Por ejemplo, esta carga funciona perfectamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;;alert(1);const a=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código:&lt;/p&gt;

&lt;p&gt;Cierra la comilla de la variable.&lt;/p&gt;

&lt;p&gt;Ejecuta alert(1);&lt;/p&gt;

&lt;p&gt;Y define una constante a que utiliza la comilla final que el script original estaba esperando.&lt;/p&gt;

&lt;p&gt;✅ ¡Inyección de JavaScript conseguida!&lt;/p&gt;

&lt;p&gt;Conclusión&lt;br&gt;
Cuando una aplicación refleja valores de entrada dentro de scripts sin escaparlos correctamente, abre la puerta a vulnerabilidades XSS basadas en JavaScript embebido.&lt;/p&gt;

&lt;p&gt;Este caso demuestra lo fácil que puede ser romper el contexto del script e insertar código malicioso.&lt;/p&gt;

&lt;p&gt;🔒 La validación y el escape de caracteres en contextos de JavaScript es esencial. No solo se trata de proteger el HTML.&lt;/p&gt;

&lt;h1&gt;
  
  
  AlFondoDelCiber #XSS #JavaScript #Ciberseguridad
&lt;/h1&gt;

&lt;p&gt;🎥 TikTok: &lt;a href="https://www.tiktok.com/@alfondodelciber/video/7497239841000787222" rel="noopener noreferrer"&gt;https://www.tiktok.com/@alfondodelciber/video/7497239841000787222&lt;/a&gt;&lt;/p&gt;

</description>
      <category>alfondodelciber</category>
      <category>xss</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to test your startup idea before developing it</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Sun, 17 Nov 2024 17:22:24 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/how-to-test-your-startup-idea-before-developing-it-52h6</link>
      <guid>https://dev.to/alfondodelciber/how-to-test-your-startup-idea-before-developing-it-52h6</guid>
      <description>&lt;p&gt;We’ve all been there, you have a startup idea but are not sure if you should make it, because you don’t know how many people are interested in your idea?&lt;/p&gt;

&lt;p&gt;Then you ask yourself the question of “Should I spend my time building this even tho I don’t know how people will react to it?”.&lt;/p&gt;

&lt;p&gt;I am going to show you how to showcase your idea to the internet very quickly, to get feedback ASAP.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Creating a landing page&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First, what you need the most is a landing page with a waiting list. I strongly recommend using &lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; or if you aren’t technical, using &lt;a href="https://www.hostinger.es/" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The advantage of Bolt is, it’s free and after downloading your code you can deploy it anywhere. My most preferred choice is Cloudflare pages because of the clean looking *.pages.dev domain. You will be amazed with how Bolt is ready to make a clean looking website in just seconds, and tweaking it should only take some minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Add a waitlist&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After that, we need to connect the landing page to a waitlist, in this case we will be using &lt;a href="https://getwaitlist.com" rel="noopener noreferrer"&gt;Waitlist&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a wishlist is done in seconds, and interacting with its API doesn’t even need an API key, just send a request with the email and waitlist ID, and everything should work. To look further into the API, you can read their documentation: &lt;a href="https://getwaitlist.com/docs/api-docs/waiter#create-a-signup" rel="noopener noreferrer"&gt;Waitlist Documentation&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const response = await fetch('https://api.getwaitlist.com/api/v1/signup', {&lt;br&gt;
        method: 'POST',&lt;br&gt;
        headers: {&lt;br&gt;
          'Content-Type': 'application/json',&lt;br&gt;
        },&lt;br&gt;
        body: JSON.stringify({&lt;br&gt;
          email:email,&lt;br&gt;
          waitlist_id:waitlist_id&lt;br&gt;
        }),&lt;br&gt;
      });&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Voilà!&lt;/strong&gt;&lt;br&gt;
Now you have a product landing page with an integrated waitlist. You just have to send the link to lots of forums, Discord servers, real life people, and see if people join your waitlist!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Greatly improve your Health Endpoint with these tips!</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Wed, 06 Nov 2024 21:03:53 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/greatly-improve-your-health-endpoint-with-these-tips-1ea4</link>
      <guid>https://dev.to/alfondodelciber/greatly-improve-your-health-endpoint-with-these-tips-1ea4</guid>
      <description>&lt;p&gt;Every API should have a /health endpoint, to make sure their app is ready and running without any problems.&lt;/p&gt;

&lt;p&gt;Normally /health endpoints only answer with a STATUS_200, but that does not give us that much info as we can think it does.&lt;/p&gt;

&lt;p&gt;Here are the main reasons why:&lt;/p&gt;

&lt;p&gt;Your API may not be crashing but could be having very slow downtimes&lt;br&gt;
This approach doesn’t let you check on other services you may use like: Third Party API’s, remote databases, your frontend.&lt;br&gt;
So to fix this, I am going to give you some ideas on what your /health endpoint responses should look like!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is a coded example&lt;/strong&gt;&lt;br&gt;
As you can see, this is for Django but it can be applied for any API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res = {
        "database":’unknown’,
        "stripe":’unknown’,
        ‘server’:’unknown’,
    }
    try:
        #* check database connection 
        start = time.time()
        users = User.objects.all()
        products = Product.objects.all()
        user = User.objects.filter(email=os.getenv(‘EMAIL_HOST_USER’))
        product = Product.objects.filter(id=1)

        # do some "modification" to the database queries, to force django to query them
        str(users)
        str(products)
        str(user)
        str(product)
        res[‘database’] = f"{round((time.time() - start) * 1000, 5)} ms to make 4 queries."


        #* check stripe connection 
        start = time.time()
        stripe.Customer.list(limit=20)
        res['stripe'] = f"{round((time.time() - start) * 1000, 5)} ms to query 20 rows."


        #* check server usage
        load = psutil.cpu_percent(interval=1)
        memory = psutil.virtual_memory().percent
        res['server']  = f"{load}% CPU Usage, {memory}% Memory Usage"


    except Exception as e:
        #* define other services as ready, find the one that caused the error, and leave the others as unknown
        for key in res.keys():
            if res[key] == None:
                res[key] = f"Error: {e}"
                break
    return Response(res, status=200)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, I am checking if my connections to my database and the Stripe API are working and have a low latency. I am also seeing how my server’s resources are working, and if they are too overloaded.&lt;/p&gt;

&lt;p&gt;This endpoint of course is protected by authentication, only staff users can access it.&lt;/p&gt;

&lt;p&gt;You can apply this example for all the services you may use! If you have any more ideas on what metrics to measure, don’t hesitate to leave them in the comments.&lt;/p&gt;

&lt;p&gt;❤️ Thank you for reading this article and please share it if you found it helpful!&lt;/p&gt;

</description>
      <category>api</category>
      <category>programming</category>
      <category>django</category>
      <category>security</category>
    </item>
    <item>
      <title>Programmatically monitor your API from your iPhone</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Wed, 06 Nov 2024 21:02:21 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/programmatically-monitor-your-api-from-your-iphone-5aoe</link>
      <guid>https://dev.to/alfondodelciber/programmatically-monitor-your-api-from-your-iphone-5aoe</guid>
      <description>&lt;p&gt;Everybody knows that having an active API is a very stressing process! You can always be anxious about your API suddenly breaking, and not knowing about it when it happens.&lt;/p&gt;

&lt;p&gt;This is why setting up an automated health check on your iPhone, which notifies you when your API breaks can be so helpful.&lt;/p&gt;

&lt;p&gt;I have made this iOS Shortcut which you can copy to your iPhone with this &lt;a href="https://www.icloud.com/shortcuts/ad1d616d9cec466eabdbe8aefd3569d4" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shortcut simply sends an HTTP request to your health endpoint and notifies you if the response is different than the expected one.&lt;/p&gt;

&lt;p&gt;After setting up the shortcut and testing it to see if it works with your API, you can now with Apple Shortcut Automations, set it up to execute every half hour, hour, day, etc…&lt;/p&gt;

&lt;p&gt;❤️ Thank you for reading this article, please share it if you found it helpful 😁&lt;/p&gt;

</description>
      <category>ios</category>
      <category>api</category>
      <category>programming</category>
      <category>django</category>
    </item>
    <item>
      <title>Save 50% of your Django development time with this tool</title>
      <dc:creator>Al Fondo Del Ciber</dc:creator>
      <pubDate>Wed, 06 Nov 2024 21:00:48 +0000</pubDate>
      <link>https://dev.to/alfondodelciber/save-50-of-your-django-development-time-with-this-tool-2g8m</link>
      <guid>https://dev.to/alfondodelciber/save-50-of-your-django-development-time-with-this-tool-2g8m</guid>
      <description>&lt;p&gt;Starting a Django project can be the most exciting but also tiring thing to do. This is because everything is always the same thing. Setting up the database, creating a custom user model and authentication management.&lt;/p&gt;

&lt;p&gt;Always copying and pasting old code from other projects 😮‍💨. That becomes very boring and actually time consuming.&lt;/p&gt;

&lt;p&gt;This was until the creation of the site &lt;a href="https://djangoquickie.pages.dev/" rel="noopener noreferrer"&gt;DjangoQuickie &lt;/a&gt;. Thanks to this website you can quickly boot up a project by choosing the tech stack you will be using.&lt;/p&gt;

&lt;p&gt;The form presents choices like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database management system (PostgreSQL, MySQL, SQLite3, etc…)&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;li&gt;Google Social OAuth2&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Stripe Payment System&lt;/li&gt;
&lt;li&gt;Advanced health endpoint system&lt;/li&gt;
&lt;li&gt;User notification system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In exchange you will get a boilerplate Django project and a .env file to be placed in the root of the folder with the information you provided.&lt;/p&gt;

&lt;p&gt;Thanks to this boilerplate code, you will be able to skip the initial repetitive process and get on directly with the code you were excited to write and create.&lt;/p&gt;

&lt;p&gt;All this while saving half of your development time.&lt;/p&gt;

&lt;p&gt;❤️ Thanks for reading this article, please share it with others if you found it helpful.&lt;/p&gt;

</description>
      <category>django</category>
      <category>restapi</category>
      <category>programming</category>
      <category>api</category>
    </item>
  </channel>
</rss>
