<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Authentication on an's security blog</title><link>https://panman4040.github.io/training/portswigger/authentication/</link><description>Recent content in Authentication on an's security blog</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 15 Jul 2026 08:36:00 +0700</lastBuildDate><atom:link href="https://panman4040.github.io/training/portswigger/authentication/index.xml" rel="self" type="application/rss+xml"/><item><title>Broken brute-force protection, IP block | &lt;span style="color:#3498db">Practitioner&lt;/span></title><link>https://panman4040.github.io/training/portswigger/authentication/auth-password-3/</link><pubDate>Mon, 08 Jun 2026 15:31:16 +0800</pubDate><guid>https://panman4040.github.io/training/portswigger/authentication/auth-password-3/</guid><description>&lt;p>The key to this lab is to occasionally insert our valid credentials inbetween the enumerations, so that &lt;em>maybe&lt;/em> the rate limit imposed on our IP is reset to zero. This is never guaranteed for every web app.&lt;/p>
&lt;p>To solve this, we can either use the Turbo Intruder extension or macros. But for the sake of simplicity, we need only edit the username and password payloads so that our valid credential and our brute-forcing attempts alternate. The password wordlist can be done through a simple Python script as follow:&lt;/p></description></item><item><title>Username enumeration via response timing | &lt;span style="color:#3498db">Practitioner&lt;/span></title><link>https://panman4040.github.io/training/portswigger/authentication/auth-password-2/</link><pubDate>Mon, 08 Jun 2026 14:15:16 +0800</pubDate><guid>https://panman4040.github.io/training/portswigger/authentication/auth-password-2/</guid><description>&lt;p>First I thought this is a straightforward lab: just pump into Intruder and compare response received times. But the lab also implements some sort of IP-based brute-force protection, where if you guess too many incorrect attempts, it will lock you out.&lt;/p>
&lt;p>To solve this, we shall use the &lt;code>X-Forwarded-For&lt;/code> header, which is used to identify the source IP address connecting through a proxy or load balancer. This is good for redirecting traffic but opens up to spoofing. If we are locked out, we just need to tweak the IP address every now and then, and include our valid credentials occasionally in our payload to avoid being locked out.&lt;/p></description></item><item><title>Username enumeration via subtly different responses | &lt;span style="color:#3498db">Practitioner&lt;/span></title><link>https://panman4040.github.io/training/portswigger/authentication/auth-password-1/</link><pubDate>Mon, 08 Jun 2026 13:34:16 +0800</pubDate><guid>https://panman4040.github.io/training/portswigger/authentication/auth-password-1/</guid><description>&lt;p>Before going into the solution, I just want to say I wasted time eyeballing for the slightest odd-one-out response received time and response length (rip). Turns out there is a nifty feature in Intruder called Grep-Extract. This feature will extract any useful info of our choosings from responses into the attack table.&lt;/p>
&lt;p>Firstly, we shall use Grep-Extract to harvest pieces of data from our responses, including cookies, tokens, error messages and so on. This time we will highlight the &lt;code>Username or password invalid&lt;/code> text
&lt;img src="https://panman4040.github.io/images/617b190e-f145-4c74-a7b5-28cee70b9c77.jpg" alt="">
Notice that there is &lt;em>one less dot&lt;/em> from &lt;code>akamai&lt;/code>, turns out that&amp;rsquo;s our valid username. After that, we just proceed with password brute-forcing normally. Very nifty.&lt;/p></description></item><item><title>2FA simple bypass | &lt;span style="color:#2ecc71">Apprentice&lt;/span></title><link>https://panman4040.github.io/training/portswigger/authentication/2fa-simple-bypass/</link><pubDate>Tue, 02 Jun 2026 16:14:16 +0800</pubDate><guid>https://panman4040.github.io/training/portswigger/authentication/2fa-simple-bypass/</guid><description>&lt;p>This excerpt from PortSwigger sums this up pretty nicely:&lt;/p>
&lt;p>&amp;ldquo;At times, the implementation of two-factor authentication is flawed to the point where it can be bypassed entirely.&lt;/p>
&lt;p>If the user is first prompted to enter a password, and then prompted to enter a verification code on a separate page, the user is effectively in a &amp;ldquo;logged in&amp;rdquo; state before they have entered the verification code. In this case, it is worth testing to see if you can directly skip to &amp;ldquo;logged-in only&amp;rdquo; pages after completing the first authentication step. Occasionally, you will find that a website doesn&amp;rsquo;t actually check whether or not you completed the second step before loading the page.&amp;rdquo;&lt;/p></description></item><item><title>Username enumeration via different responses | &lt;span style="color:#2ecc71">Apprentice&lt;/span></title><link>https://panman4040.github.io/training/portswigger/authentication/username-enumeration-via-different-responses/</link><pubDate>Tue, 02 Jun 2026 15:23:16 +0800</pubDate><guid>https://panman4040.github.io/training/portswigger/authentication/username-enumeration-via-different-responses/</guid><description>&lt;p>Using the provided username and password wordlists, my initial solution is to simply run a cluster bomb attack in Intruder to test all permutations possible. But on the Community version this took an excruciatingly long time because of the rate limit.&lt;/p>
&lt;p>Another way to do this is to perform a sniper attack to enumerate only the valid usernames first, and from there we have a much shorter list of usernames to check their passwords.&lt;/p></description></item></channel></rss>