<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by b4dk4rm4sec on Medium]]></title>
        <description><![CDATA[Stories by b4dk4rm4sec on Medium]]></description>
        <link>https://medium.com/@b4dk4rm4sec?source=rss-ba49b1c15e92------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*j48qF911b-7gmhDYy8HvZw.png</url>
            <title>Stories by b4dk4rm4sec on Medium</title>
            <link>https://medium.com/@b4dk4rm4sec?source=rss-ba49b1c15e92------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 19 May 2026 12:49:30 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@b4dk4rm4sec/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[PortSwigger Lab #1 — Username Enumeration via Different Responses]]></title>
            <link>https://medium.com/@b4dk4rm4sec/portswigger-lab-1-username-enumeration-via-different-responses-360040edbf30?source=rss-ba49b1c15e92------2</link>
            <guid isPermaLink="false">https://medium.com/p/360040edbf30</guid>
            <category><![CDATA[penetration-testing]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[b4dk4rm4sec]]></dc:creator>
            <pubDate>Mon, 18 May 2026 23:32:24 GMT</pubDate>
            <atom:updated>2026-05-18T23:32:24.618Z</atom:updated>
            <content:encoded><![CDATA[<p>First real walkthrough. Burp Intruder, two wordlists, and one telltale response length.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uYLj9IW6LMC_IlvgtIIxtA.jpeg" /></figure><p>This is the first actual lab walkthrough in the series. The lab is from PortSwigger’s Authentication category , the first one on the list and it’s a clean introduction to two things you’ll run into constantly: username enumeration and password brute-forcing.</p><p><strong><em>The setup</em></strong><br>The lab gives you a login form and two wordlists , one for usernames, one for passwords. The goal is simple on paper:</p><ol><li>Find a valid username</li><li>Brute-force its password</li><li>Log in</li></ol><p>What makes it solvable is that the app responds differently depending on whether the username exists. That’s the whole bug. A login form should never tell you which half of &quot;username + password&quot; was wrong , it should give one generic error and move on. This one doesn’t.</p><p><strong><em>How to spot username enumeration in general</em></strong><br>Before jumping into the steps, this is worth saying because it applies to every lab in this category (and to real targets too). When you’re trying to figure out if a login form leaks valid usernames, these are the signals to watch:</p><ul><li><strong>Status code differences</strong> — most attempts return the same status. If one returns something different (200 vs 302, for example), that’s a strong signal the username is valid.</li><li><strong>Error message differences</strong> — &quot;wrong username&quot; vs &quot;wrong password&quot; instead of a single generic &quot;invalid credentials&quot; message. Sometimes it’s subtle: a missing period, a different word order.</li><li><strong>Response time differences</strong> — if valid usernames trigger a password check and invalid ones return immediately, you can detect it by timing. Trick: submit a deliberately long password so the password check takes measurable time.</li><li><strong>Response length differences</strong> — even when the message looks the same in the browser, the raw response body can differ by a few bytes. Burp Intruder’s Length column makes this obvious.</li></ul><p>That last one is what cracks this specific lab.</p><p><strong><em>Walkthrough</em></strong><br><strong>Step 1 — Probe the login form manually</strong>.<br>First thing I always do: try admin:admin. Not because I expect it to work, but because I want to see what the app says when something is wrong. It returned &quot;Invalid username&quot; , which is already the bug. The app just told me that admin is not a valid user. If it had said &quot;Invalid credentials,&quot; I’d have no idea whether the username or password was the problem.</p><p><strong>Step 2 — Send to Intruder</strong>.<br>Turned on Burp’s proxy, submitted the login again, intercepted the request, right-clicked → Send to Intruder.</p><p><strong>Step 3 — Configure the username attack</strong>.<br>In Intruder, I cleared the auto-set payload positions and marked only the username parameter. Attack type: Sniper (single payload set, single position , is exactly what we want here). Loaded the provided usernames wordlist as the payload, hit Start attack.</p><p><strong>Step 4 — Find the valid username</strong>.<br>Once the attack finished, I sorted results by Length. Almost every response had the same length, the standard &quot;Invalid username&quot; page. One row stood out with a different length. The response body for that one said &quot;Incorrect password&quot; instead of &quot;Invalid username.&quot; That’s the giveaway: the app got far enough to check the password, which means the username is valid.<br>Valid username: hack it ;).<br><strong>Quick note</strong> : in this lab the response length was the cleanest signal, but I always check the response body too. The length alone tells you something is different; the body tells you what.</p><p><strong>Step 5 — Configure the password attack</strong>.<br>Sent a new login request to Intruder, this time with valid username and any password. Cleared the positions, marked only the password parameter. Loaded the passwords wordlist. Sniper attack again, Start.</p><p><strong>Step 6 — Find the valid password</strong>.<br>This time I sorted by Status code. Most responses came back as 200 , the login page re-rendering with an error. One came back as 302 , a redirect, which is what a successful login does (redirect you to your account page).<br>Valid password: hack it ;)</p><p><strong>Step 7 — Log in</strong>.<br>Took username:password back to the login form, submitted. Logged in. Lab solved.</p><p><strong><em>What a dev should do about this</em></strong><br>The fix isn’t complicated, but it’s easy to get wrong because the bad behavior often comes from someone trying to be helpful. Specific error messages feel user-friendly. They’re not, they’re an information leak.<br>Things to actually do:</p><ul><li><strong>Generic error message</strong>. One message for all auth failures: &quot;Invalid username or password.&quot; No variations. No &quot;user not found&quot; anywhere in the auth flow.</li><li><strong>Consistent response timing</strong>. If the password check is what makes valid-username responses slower, run the password hash check even when the username doesn’t exist (against a dummy hash). Equal work = equal time.</li><li><strong>Consistent response shape</strong>. Same status code, same body length where reasonable, same redirect behavior. Don’t let a 302 leak success.</li><li><strong>Rate limiting and lockout</strong>. Even if everything above is done right, you don’t want someone hammering your login at 1000 req/s. IP-based throttling, account lockout with backoff, CAPTCHA after N failures.</li><li>Watch the registration and &quot;forgot password&quot; flows too. Same enumeration trick works there if you tell the user &quot;this email is already registered&quot; or &quot;no account with that email.&quot;</li></ul><p>Coming from a QA and dev background, this is the kind of bug I’d want to catch in a code review: any branch in auth logic that produces a user-visible difference is a leak. The mental check is : &quot;if I swap a valid input for an invalid one, can an outside observer tell the difference?&quot; If yes, you have enumeration.</p><p><strong><em>Closing</em></strong><br>That’s lab #1 done. Next one in this series will be Username enumeration via subtly different responses, same category, but the leak is hidden in a way that breaks the naive &quot;sort by length&quot; approach. Spoiler: grep matching becomes your friend.</p><p>If this helped, or if you’d have done something differently, let me know.<br>~ b4dk4rm4sec</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=360040edbf30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Back to the Labs ~ Quick Update Before the Real Content Drops]]></title>
            <link>https://medium.com/@b4dk4rm4sec/back-to-the-labs-quick-update-before-the-real-content-drops-653e19b87405?source=rss-ba49b1c15e92------2</link>
            <guid isPermaLink="false">https://medium.com/p/653e19b87405</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[penetration-testing]]></category>
            <category><![CDATA[pentest]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[b4dk4rm4sec]]></dc:creator>
            <pubDate>Mon, 18 May 2026 22:07:24 GMT</pubDate>
            <atom:updated>2026-05-18T22:07:24.299Z</atom:updated>
            <content:encoded><![CDATA[<h3>Back to the Labs ~ Quick Update Before the Real Content Drops</h3><p>Where I’ve been, where I’m going, and a small correction.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*FUGRCWmG06MgXrHtzjrxYg.jpeg" /></figure><p>It’s been about six months since my first post on this account. No fake &quot;I’m back, bigger and better&quot; energy here , just an honest update on where I’ve been and what’s coming.</p><p><strong><em>A small correction first</em></strong><br>In my intro post I described myself as coming from a QA / automation background. That’s not wrong, but it’s also not the full picture, and I want to set it straight before we go further.<br>My main background is automation QA , that’s where I have the most years and the deepest experience. More recently, over the last several months, I’ve been working as a developer on both backend and frontend, which has rounded out my perspective a lot.<br>I’m calling this out because it matters for what comes next. When I look at a web app vulnerability, I’m thinking like a tester and like a dev &quot;how would I have caught this in QA, and how did this end up in the code in the first place?&quot; That dual lens is going to show up in the walkthroughs.</p><p><strong><em>Where I’ve been</em></strong><br>The posts from November weren’t the start of a long silence , they were the start of a different kind of work.<br>After that first post, I went heads-down on actually building the foundation instead of posting surface-level content. Here’s what the last few months looked like:<br><strong>PortSwigger Web Security Academy:</strong> solved multiple labs across web vulns and a few other categories. I haven’t been on PortSwigger for the last 3–4 months, but I plan to come back to it.<br><strong>HTB CPTS (Certified Penetration Testing Specialist) path on HackTheBox Academy:</strong> currently grinding through it, targeting the exam in fall/winter.<br><strong>Obsidian vault for pentest methodology:</strong> playbooks, knowledge base, lab notes. The kind of system I wish someone had handed me on day one.<br><strong>Real lab time:</strong> broken Metasploit installs, exploits that wouldn’t fire, targets that didn’t behave like the writeup said they would. The unglamorous part nobody posts about.<br>None of that makes for flashy content. But it’s the work, and it’s the reason I finally have something worth sharing.</p><p><strong><em>What’s coming</em></strong><br>Two parallel tracks, no fixed schedule. I’ll post when I have something worth posting.<br>Track 1 : PortSwigger walkthroughs. Picking up where the first post left off. I’ll be working through the multiple labs I’ve already solved, one at a time: what the vuln is, how I found it, what worked, what didn’t, and how a dev should fix it. When I eventually return to PortSwigger for new labs, those will land here too.<br>Track 2 : CPTS notes and lessons. Less walkthrough, more &quot;here’s what I learned and how I’d explain it to past-me.&quot; HTB Academy modules, methodology pieces, things that clicked after the third re-read.</p><p><strong><em>Why I’m doing this</em></strong><br>Not to look smart. Not to build a &quot;personal brand.&quot;<br>I’m doing it because when I started, I had every resource in the world in front of me and zero idea what to do with them. I lurked, I bounced between tutorials, I followed paths that led nowhere. What changed things for me was finally getting some direction and I want to leave a trail for the next person who’s where I was.<br>If any of this helps one person stop lurking and start doing, that’s enough.<br>~ b4dk4rm4sec</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=653e19b87405" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My PortSwigger Journey — Learning Web Security One Lab at a Time]]></title>
            <link>https://medium.com/@b4dk4rm4sec/my-portswigger-journey-learning-web-security-one-lab-at-a-time-474823ceabf0?source=rss-ba49b1c15e92------2</link>
            <guid isPermaLink="false">https://medium.com/p/474823ceabf0</guid>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[websecurity-testing]]></category>
            <category><![CDATA[portswigger]]></category>
            <category><![CDATA[owasp]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[b4dk4rm4sec]]></dc:creator>
            <pubDate>Wed, 12 Nov 2025 17:11:49 GMT</pubDate>
            <atom:updated>2025-11-12T17:11:49.582Z</atom:updated>
            <content:encoded><![CDATA[<h3>My PortSwigger Journey — Learning Web Security One Lab at a Time</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FFncFrqaOxhXP0HUiccpPw.png" /><figcaption>I started doing PortSwigger labs because I wanted hands-on practice — not to flex, but to learn. I’m writing these posts as I go: honest notes, real mistakes, and the small steps that actually move you forward.</figcaption></figure><h3>About me</h3><p>My name is <strong>b4dk4rm4sec</strong>. I come from a QA / automation background and lately I’ve been shifting toward web security and pentesting. I’ve spent years as a tester — building automation frameworks, debugging tricky flows, and thinking like a user — and those skills naturally led me to security: understanding how apps break, why they fail, and how to validate fixes.</p><p>I wasn’t born with pentest knowledge. For a long time I had resources and write-ups in front of me, but I lacked a clear <em>learning path</em> — I didn’t know which labs to do first, which concepts to lock in, or how to chain exercises so they actually taught me something practical. A long-waited mentor eventually gave me the direction I needed, and that changed everything. Now I want to pay it forward by sharing the path I wish I’d had.</p><h3>What this series is about</h3><p>No theory dumps. No one-line exploits with no context. Each post is a real walkthrough of a lab I solved: how I found the issue, what I tried (including the stuff that didn’t work), the payloads that did work, and how a dev should fix it. Everything is done on sanctioned training platforms (starting with <a href="https://portswigger.net/web-security">PortSwigger</a>).</p><h3>Why I start with PortSwigger (and where I’ll go)</h3><p>PortSwigger Academy was my starting point: small, focused labs that map neatly to core web vulnerabilities. I’ll begin there, but this series is not limited to PortSwigger — expect TryHackMe, HackTheBox, and real-world exercises later on. The idea is to build a living roadmap: start simple, get confident, then chain things up.</p><h3>Ethics &amp; Intent</h3><p>Everything here is educational. I’m sharing solutions for sanctioned, public labs only. I will not publish exploit instructions for live production systems without explicit authorization. The focus is on learning and remediation — how to find problems and how to fix them.</p><h3>Closing — invitation &amp; CTA</h3><p>I’m not an expert — I’m learning out loud. If this helps even one beginner find a clearer path into web security, it’s worth it. Follow along, give feedback, suggest labs you want prioritized, or point out better mitigations when you see them. Let’s learn together.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=474823ceabf0" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>