<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Abhi Sharma on Medium]]></title>
        <description><![CDATA[Stories by Abhi Sharma on Medium]]></description>
        <link>https://medium.com/@a13h1?source=rss-502c7a93b835------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*sBSRPckiQ7rHLIsqREevhw.png</url>
            <title>Stories by Abhi Sharma on Medium</title>
            <link>https://medium.com/@a13h1?source=rss-502c7a93b835------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 21:02:24 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@a13h1/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[$1,100 Privilege Escalation: Group Leader Can Promote Anyone via Hidden Parameter]]></title>
            <link>https://medium.com/@a13h1/1-100-privilege-escalation-group-leader-can-promote-anyone-via-hidden-parameter-ae43cdae30a0?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/ae43cdae30a0</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[parameter-tampering]]></category>
            <category><![CDATA[hacking]]></category>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 01:31:01 GMT</pubDate>
            <atom:updated>2026-06-26T01:31:01.267Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! This one started as a simple permission check… but turned into a full <strong>role manipulation vulnerability</strong> inside a SaaS platform (let’s call it <strong>ExampleCenter</strong>).</p><p>What looked like a harmless feature — editing a member’s join date — ended up exposing a deeper issue where a <strong>Group Leader could control roles of other members</strong>. For this finding, I was awarded a <strong>$1,000 bounty + $100 retest bonus</strong>. Let’s break it down.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mgAU4he9-pYlnc6Xefr3Sw.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter has a Groups feature where users collaborate in smaller units. Each group has a clear role hierarchy:</p><ul><li><strong>Member</strong> → basic access</li><li><strong>Leader</strong> → manages group-level actions</li><li><strong>Manager/Admin</strong> → controls structure, permissions, and roles</li></ul><p>Importantly:</p><blockquote><em>Only Managers or Admins are supposed to change roles.</em></blockquote><p>The UI enforces this strictly.</p><p>As a <strong>Group Leader</strong>, you can:</p><ul><li>Edit member details (like join date)</li><li>Manage basic group activities</li></ul><p>But you <strong>cannot:</strong></p><ul><li>Promote someone to Leader</li><li>Demote other Leaders</li><li>Change role hierarchy</li></ul><p>At least… that’s what the UI says.</p><h3>The Flaw: Role Manipulation via Parameter Tampering</h3><p>While testing allowed actions for a Group Leader, I noticed something interesting. There was an endpoint used to <strong>edit member details</strong>, like the join date. A normal request looked like this:</p><pre>POST /groups/2915300/members/47858856 HTTP/2<br>Host: groups.examplecenteronline.com<br><br>_method=patch&amp;authenticity_token=okWay1Dq0tmWC6_Veno_tBg1dA74-LbtLIVXYR4wl304efBVL9R7MUwjhmRna910MmE5K_Q1IBgnDxK6wrgsKA&amp;page=1&amp;membership%5Bjoined_at%5D=2026-01-08T00%3A00%3A00</pre><p>Pretty standard. But here’s where things got interesting 👇</p><h4>What if we add one more parameter? which i saw in admin/manger role assigning request</h4><pre>membership[role]=leader</pre><ul><li>Example payload: _method=patch membership[joined_at]=2026-01-08T00:00:00 membership[role]=leader</li></ul><p>That’s it and send the request</p><p>No special endpoint, No admin permission, No extra authentication, Just <strong>one additional parameter</strong>.</p><h4>Result?</h4><ul><li>Request → <strong>200 OK</strong></li><li>Target user → <strong>Promoted to Leader</strong></li></ul><p>And it didn’t stop there…You could also:</p><ul><li>Demote existing leaders to members by changing membership[role]= member</li><li>Reassign leadership roles</li><li>Completely control group hierarchy</li></ul><p>All from a <strong>Group Leader account</strong></p><h3>What’s Actually Happening?</h3><p>This is a classic <strong>parameter tampering + broken authorization</strong> issue.</p><p>The backend:</p><ul><li>Validates that the request is valid because leader is allowed to send the request but doesnot have member role parameter✅</li><li>Validates membership exists because request is allowed but didn’t check is or which parameter is allowed with that request with that role permissions✅</li><li>But does <strong>not validate who is allowed to change roles</strong> ❌</li></ul><p>So when the server sees: membership[role]=leader it blindly trusts it.</p><p>Even though:</p><ul><li>The UI blocks this action</li><li>The role should be restricted</li><li>The user lacks permission</li></ul><h3>The Real Issue</h3><p>This is not just about a missing check.</p><p>This is about:</p><blockquote><em>Backend trusting client-controlled parameter and input for a security-critical action.</em></blockquote><p>The UI tried to protect it. But the API didn’t. And as always:</p><blockquote><strong><em>If it’s only protected in the UI, it’s not protected.</em></strong></blockquote><h3>Impact</h3><p>This vulnerability allows a Group Leader to manipulate the role structure of a group without proper authorization. By exploiting this behavior, a user can promote arbitrary members to leadership roles or demote existing leaders, effectively taking control over how the group is managed.</p><p>In real-world scenarios, this breaks the intended permission boundaries within collaborative environments. Group roles often define trust, responsibility, and access levels, so allowing unauthorized role changes can lead to misuse, confusion, or even intentional disruption.</p><p>An attacker could assign leadership privileges to themselves or others, override existing leadership, and alter the internal structure of the group without visibility or approval from administrators. This undermines the principle of least privilege and weakens trust in the platform’s permission model.</p><h3>Bounty &amp; Program Response</h3><p>Reported: January 22, 2026</p><p>Triaged: January 23, 2026</p><p>Bounty Awarded: $1,000 + $100 retest bonus</p><p>During retesting:</p><ul><li>The request still returned <strong>200 OK</strong></li><li>But role changes were properly blocked ✅</li></ul><p>Fix confirmed.</p><h3>Key Takeaways</h3><ul><li>Never trust client-controlled parameters for authorization decisions</li><li>UI restrictions are not security controls</li><li>Always test “allowed actions” for hidden parameters</li><li>Small inputs can lead to <strong>big privilege escalations</strong></li><li>Parameter tampering is still one of the most underrated attack vectors</li></ul><h3>Conclusion</h3><p>This bug perfectly shows how a <strong>normal feature + one hidden parameter = full control</strong>.</p><p>No complex exploit, No brute force, No advanced techniques,Just understanding:</p><ul><li>What the system allows</li><li>What it hides</li><li>And what it forgets to validate</li></ul><p>That’s where the real bugs are.</p><p>Until next time, happy hacking!</p><h3>Connect and Engage</h3><p>💬 What’s your experience with race condition bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ae43cdae30a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$900 Session Flaw: Deprovisioned Users Retain Access After Permission Removal]]></title>
            <link>https://medium.com/@a13h1/900-session-flaw-deprovisioned-users-retain-access-after-permission-removal-f775a3f81bc9?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/f775a3f81bc9</guid>
            <category><![CDATA[information-security]]></category>
            <category><![CDATA[session-flaw]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 01:31:01 GMT</pubDate>
            <atom:updated>2026-06-19T01:31:01.102Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! Recently, while testing a SaaS platform (let’s call it <strong>ExampleCenter</strong>), I came across a very interesting access control issue that doesn’t look dangerous at first glance but in real-world scenarios, it can be quite impactful.</p><p>This bug was about <strong>what happens after access is revoked</strong>, not while it exists. For this finding, I was awarded an <strong>$800 bounty + $100 retest bonus</strong>. Let’s break it down.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TpZKZ0Q-24U4pEdGxj9xmw.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter is a multi-product SaaS platform where organizations manage different workflows like people, scheduling, calender, groups and home dashboard internal collaboration. If the user have any permission for any product of platform that user can access home dashboard where task and resources shared in organization</p><p>Each user is assigned product-level permissions, and once those permissions are removed, the expectation is simple:</p><blockquote><em>The user should lose access immediately even home dashboard access too.</em></blockquote><p>From a security perspective, <strong>deprovisioning = complete access revocation</strong>.</p><p>That includes:</p><ul><li>Logging in</li><li>Accessing dashboards</li><li>Viewing shared resources</li><li>Performing any action</li></ul><p>But this assumption is where things started to break.</p><h3>The Flaw: Session Remains Valid After Deprovisioning</h3><p>While testing permission models, I noticed something interesting:</p><ul><li>If a user is <strong>fully deprovisioned</strong>, they cannot log in again ✅</li><li>But… if they already have an <strong>active session</strong>, it still works ❌</li></ul><p>This means:</p><blockquote><em>The system blocks </em>new authentication<em> but does not invalidate </em>existing sessions<em>.</em></blockquote><p>So even after:</p><ul><li>Removing all product access which remove all access even home dashboard access too</li><li>Making the account effectively “inactive”</li></ul><p>The user could still:</p><ul><li>Access the <strong>Home dashboard not other products access like people, schedulings and etc</strong></li><li>View previously shared resources</li><li>Interact with existing data</li></ul><p>All through the <strong>same session cookie</strong>.</p><h3>What’s Actually Happening?</h3><p>This is a classic <strong>session invalidation issue</strong>.</p><p>The backend:</p><ul><li>Checks permissions during login ✅</li><li>But does <strong>not revalidate session authorization state</strong> ❌</li></ul><p>So once a session is issued, it remains trusted — even if:</p><ul><li>The user’s role changes</li><li>Permissions are revoked</li><li>Access is completely removed</li></ul><p>In simple terms:</p><blockquote><em>The system trusts the session more than the current user state.</em></blockquote><h3>Steps To Reproduce:</h3><h4>Setup</h4><ol><li>Create a user in an organization</li><li>Grant access to any product (e.g., People, Services, Calendar)</li><li>Log in as the user in examplecenter or home and keep the session active by not log-in out</li></ol><h4>Step 1: Remove All Product Access</h4><ol><li>Log in as an admin</li><li>Remove all product permissions from the user</li><li>Save changes and you will see the home access of that user go to (no access)</li></ol><h4>Step 2: Verify Login Is Blocked</h4><ol><li>Log to the user account in different or new browser</li><li>Observe: • Login fails with “Email or phone not found”</li></ol><h4>Step 3: Reuse Existing Session</h4><ol><li>Use the same session from Setup step 3 , the orignal session is still active</li><li>Continue browsing using the existing cookies/session</li><li>Observe: • User still accesses Home • User can view shared resources • Authorization checks succeed despite full deprovisioning</li></ol><h3>Why This Matters (Real-World Scenario)</h3><p>Imagine this:</p><p>An employee leaves a company.</p><p>Admin removes all access immediately.</p><p>But…</p><ul><li>The employee still has a browser open</li><li>Their session is still active</li><li>They can still access internal dashboards, tasks, or shared data</li></ul><p>Even if limited, this creates</p><ul><li>A <strong>security gap during offboarding</strong></li><li>A <strong>window for data exposure</strong></li><li>A <strong>false sense of access revocation</strong></li></ul><p>This is especially risky in:</p><ul><li>Insider threat scenarios</li><li>Sensitive environments</li><li>Compliance-driven systems</li></ul><h3>Impact</h3><p>This vulnerability allows a fully deprovisioned user to retain access through an already established session, even though the system considers the account inactive.</p><p>While new logins are correctly blocked, the existing session continues to function without revalidation. This creates a gap where a user who should have zero access can still interact with parts of the system such as the Home dashboard and previously shared resources.</p><p>In real-world environments, this weakens the reliability of access revocation processes. Organizations rely on immediate access removal during role changes or employee offboarding, but this behavior introduces a delay where access still exists unintentionally.</p><p>Even if the accessible data is limited, the issue breaks the fundamental security expectation that <strong>permission removal equals immediate access termination</strong>, which can lead to trust and compliance concerns.</p><h3>Bounty &amp; Program Response</h3><p>Reported: January 17, 2026</p><p>Triaged: January 22, 2026</p><p>Severity: Medium</p><p>Bounty Awarded: $800 + $100 retest bonus</p><p>During retesting, the fix ensured:</p><ul><li>Sessions are properly invalidated</li><li>Access is revoked consistently</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6tt1OyOkQeNssGTyZJLJ_w.png" /></figure><h3>Key Takeaways</h3><ul><li>Session invalidation is just as important as authentication</li><li>Permission checks must be enforced continuously, not just at login</li><li>Deprovisioning should immediately terminate all active sessions</li><li>Always test <strong>post-auth scenarios</strong>, not just access control entry points</li><li>Many real bugs exist in <strong>state transitions</strong>, not just endpoints</li></ul><h3>Conclusion</h3><p>This bug is a perfect example of how <strong>security is not just about granting access — but also about removing it properly</strong>.</p><p>Everything looked correct from the UI:</p><ul><li>User removed ✅</li><li>Login blocked ✅</li></ul><p>But internally:</p><ul><li>Session still alive ❌</li></ul><p>That small gap is where real vulnerabilities exist.</p><p>As bug hunters, these edge cases — <strong>what happens after access changes</strong> — often lead to the most interesting findings.</p><p>Until next time, happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 What’s your experience with race condition bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f775a3f81bc9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$750 Authorization Bypass: Enumerating Calendar Forms via Group Type ID]]></title>
            <link>https://medium.com/@a13h1/750-authorization-bypass-enumerating-calendar-forms-via-group-type-id-c3c18d3f7230?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/c3c18d3f7230</guid>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[infosec]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[hacking]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 12 Jun 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-06-12T13:31:00.822Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! Sometimes the most interesting bugs are not about direct access… but about <strong>connecting two features that were never meant to trust each other</strong>.</p><p>In this case, I discovered a <strong>cross-product authorization issue</strong> where any authenticated user — even without Calendar or Groups access — could retrieve internal Calendar form configurations using a simple API query.</p><p>For this finding, I was awarded a <strong>$750 bounty</strong>. Let’s break it down.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dDtH0k2hJBt2JLVvCdCtoA.png" /></figure><h3>Understanding the Target</h3><p>The platform provides multiple interconnected products like:</p><ul><li><strong>Calendar</strong> → manages events and forms</li><li><strong>Groups</strong> → manages user group structures</li><li><strong>People / Services</strong> → manage people and services</li></ul><p>One important feature is <strong>Calendar Forms</strong>, which can be configured to:</p><ul><li>Be accessible only to specific <strong>group types so they can create events on specific dates</strong></li><li>Restrict who can submit event requests for calender dates</li><li>Define internal workflows like: Approval groups, event owners and custom confirmation emails for events created in calendar</li></ul><p>👉 Logically, only:</p><ul><li>Users in those groups</li><li>Or users with Calendar permissions</li></ul><p>should be able to access this data.</p><h3>Where It Got Interesting</h3><p>While testing role-based access, I noticed something subtle:</p><ul><li>A low-privileged user couldn’t access Calendar UI</li><li>Couldn’t view forms</li><li>Had no group membership</li></ul><p>But I started wondering:</p><blockquote><em>“What if the API only checks the </em>group_type_id<em>, not the user?”</em></blockquote><p>That’s where everything opened up.</p><h3>The Flaw: Cross-Product Authorization Bypass</h3><p>The vulnerable endpoint:</p><pre>GET /calendar/v2/forms/?where[form_group_types][group_type_id]=&lt;group_type_id&gt;</pre><p>The issue:</p><ul><li>The API <strong>accepts any valid group_type_id</strong></li><li>But does NOT verify: If the user belongs to that group, if the user has Calendar access or if the user has <em>any</em> permission to view forms</li></ul><p>👉 It only trusts the relationship between objects, not the user.</p><h3>Steps to Reproduce</h3><h4>Step 1: Use a Low-Privilege Account</h4><p>Example roles:</p><ul><li>Services → Scheduler (Viewer)</li><li>People → Workflow-only</li></ul><p>Confirm:</p><ul><li>No Calendar access</li><li>No Groups access</li><li>No group membership</li></ul><h4>Step 2: Capture Session</h4><p>Login and grab the authenticated session cookie.</p><h4>Step 3: Send API Request</h4><pre>GET /calendar/v2/forms/?include=form_group_types<br>&amp;where[form_group_types][group_type_id]=502324<br>&amp;where[status]=open</pre><h4>Step 4: Observe Response</h4><p>✅ Server returns <strong>200 OK</strong></p><p>And exposes:</p><ul><li>Form name &amp; description</li><li>Custom confirmation email content</li><li>Event owner (person ID)</li><li>Approval group IDs</li><li>Default calendar</li><li>Tags &amp; group associations</li></ul><p>👉 All of this <strong>without any Calendar or Group permissions</strong></p><h3>Why This Matters</h3><p>At first glance, this may look like “just metadata”…</p><p>But in real-world systems, this data is <strong>highly valuable</strong>.</p><p>This vulnerability allows any authenticated user to enumerate internal Calendar forms across the organization and gain visibility into how workflows are structured. It exposes operational details such as approval chains, responsible personnel, and internal communication templates like custom confirmation emails.</p><p>Even though no direct modification is possible, this level of access breaks the intended separation between products. It allows users with completely unrelated roles to map internal processes, identify key users, and understand how event approvals and workflows operate behind the scenes.</p><p>Over time, this kind of information disclosure can be used to support further attacks, social engineering, or privilege escalation attempts.</p><h3>Root Cause</h3><p>The issue comes down to a classic mistake</p><ul><li>❌ Backend validates <strong>object relationship (group_type_id)</strong></li><li>❌ Does NOT validate <strong>user entitlement</strong></li><li>❌ No cross-product permission enforcement</li></ul><p>👉 Trusting object references instead of user permissions</p><h3>Bounty &amp; Program Response</h3><ul><li>Reported: Jan 24, 2026</li><li>Triaged: Valid</li><li>Severity: Medium (4.3)</li><li>Bounty: $750</li><li>Status: Resolved</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YQ6lIuyvoEGHTy7UxNSbxQ.png" /></figure><h3>Key Takeaways</h3><ul><li>Never trust object filters (group_type_id) as authorization</li><li>Always validate <strong>user → object relationship</strong></li><li>Cross-product integrations are high-risk areas</li><li>Metadata exposure ≠ low impact (it builds attack surface)</li><li>Think beyond UI: “What happens if I call this directly?”</li></ul><h3>Conclusion</h3><p>This bug is a great example of how <strong>authorization can silently fail across product boundaries</strong>. Everything looked secure in isolation:</p><ul><li>Calendar was restricted</li><li>Groups were restricted</li></ul><p>But when combined through the API… The trust model broke completely and that’s where the bug lived.</p><h3>Connect and Engage</h3><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c3c18d3f7230" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$600 BOLA: Breaking Event Boundaries Using Cross-Selection Injection]]></title>
            <link>https://medium.com/@a13h1/600-bola-breaking-event-boundaries-using-cross-selection-injection-d0f1a9d287a2?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/d0f1a9d287a2</guid>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[infosec]]></category>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[backend]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 05 Jun 2026 13:31:01 GMT</pubDate>
            <atom:updated>2026-06-05T13:31:01.107Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! Sometimes bugs don’t look dangerous at first… until you understand what they <em>break behind the scenes</em>.</p><p>In this case, I found a <strong>business logic + BOLA (Broken Object Level Authorization)</strong> issue in an event registration system where I was able to mix data across <strong>different selections and even different events</strong> — something the platform strictly tries to prevent.</p><p>For this finding, I was awarded <strong>$500 bounty + $100 retest bonus</strong>. Let’s break it down.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IEV2VcrOvVfAbT9Ud-FMNg.png" /></figure><h3>Understanding the Target (Where the Idea Came From)</h3><p>The platform works like a typical <strong>event registration system</strong>:</p><ul><li>Each <strong>event</strong> has multiple <strong>selections</strong> (e.g., Standard, VIP, Test)</li><li>Each selection has:</li><li>Its own <strong>add-ons</strong></li><li>Its own <strong>attendee questions</strong></li><li>These are supposed to be tightly scoped:</li><li>Selection → controls what you can choose</li><li>Event → controls what data belongs</li></ul><p>So logically:</p><blockquote><em>If you choose </em>Selection A<em>, you should only be able to use </em><strong><em>its</em></strong><em> add-ons and questions.</em></blockquote><h3>Where it got interesting 👇</h3><p>While testing registrations, I wasn’t trying to break auth directly.</p><p>I was thinking:</p><blockquote><em>“What if the backend is trusting IDs instead of validating relationships?”</em></blockquote><p>That’s where everything changed.</p><h3>The Flaw: Trusting Client-Supplied Object IDs</h3><p>The API accepts a request like:</p><pre>PATCH /registrations/v2/events/{event_id}/reservations/{reservation_id}<br>Host:<br><br>{&quot;data&quot;:{&quot;attributes&quot;:{&quot;add_on_elections_changed&quot;:true}},&quot;included&quot;:[{&quot;type&quot;:&quot;AddOnSelection&quot;,&quot;attributes&quot;:{&quot;attendee_id&quot;:140709947,&quot;add_onable_type&quot;:&quot;AddOn&quot;,&quot;add_onable_id&quot;:&quot;878858&quot;,&quot;quantity&quot;:1,&quot;_destroy&quot;:false}},{&quot;type&quot;:&quot;Answer&quot;,&quot;attributes&quot;:{&quot;attendee_id&quot;:140709947,&quot;answers&quot;:[&quot;cs&quot;],&quot;question_id&quot;:4832223}}]}</pre><p>Inside the request, you can send:</p><ul><li>add_onable_id</li><li>question_id</li></ul><p>Now here’s the problem:</p><p>👉 The backend <strong>does NOT verify</strong>:</p><ul><li>If the add-on belongs to the selected option</li><li>If the question belongs to the same event</li><li>If both belong to the same scope at all</li></ul><p>It simply trusts whatever IDs you send.</p><h3>How I Actually Found It (Real Thought Process)</h3><p>At first, everything looked fine in the UI perfectly restricted.</p><p>But I asked:</p><blockquote><em>“UI is restricting… but is API enforcing?”</em></blockquote><p>So I intercepted the request and tested something simple:</p><ul><li>Take <strong>add-on from another selection</strong></li><li>Inject it into current request</li></ul><p>Boom… it worked.</p><p>Then I pushed further:</p><blockquote><em>“What if I go cross-event?”</em></blockquote><p>And yeah… it still worked.</p><p>That’s when I knew:</p><p>👉 This is not just logic issue — this is <strong>BOLA + broken validation</strong></p><h3>Steps to Reproduce</h3><h4>Scenario 1: Cross-Selection Injection</h4><ol><li>Create an event with:</li></ol><ul><li>Selection A (Standard)</li><li>Selection B (Test)</li></ul><ol><li>Start registration with <strong>Selection A</strong></li><li>Intercept request and modify:</li></ol><pre>{<br>  &quot;included&quot;: [<br>    {<br>      &quot;type&quot;: &quot;AddOnSelection&quot;,<br>      &quot;attributes&quot;: {<br>        &quot;add_onable_id&quot;: &quot;ADDON_FROM_SELECTION_B&quot;<br>      }<br>    },<br>    {<br>      &quot;type&quot;: &quot;Answer&quot;,<br>      &quot;attributes&quot;: {<br>        &quot;question_id&quot;: &quot;QUESTION_FROM_SELECTION_B&quot;<br>      }<br>    }<br>  ]<br>}</pre><p>Send request</p><p>✅ Result: Registration succeeds with invalid mapping</p><h4>Scenario 2: Cross-Event Injection (More Interesting)</h4><ol><li>Create:</li></ol><ul><li>Event A</li><li>Event B</li></ul><ol><li>Start registration for <strong>Event A</strong></li><li>Inject:</li></ol><pre>{<br>  &quot;included&quot;: [<br>    {<br>      &quot;type&quot;: &quot;AddOnSelection&quot;,<br>      &quot;attributes&quot;: {<br>        &quot;add_onable_id&quot;: &quot;ADDON_FROM_EVENT_B&quot;<br>      }<br>    },<br>    {<br>      &quot;type&quot;: &quot;Answer&quot;,<br>      &quot;attributes&quot;: {<br>        &quot;question_id&quot;: &quot;QUESTION_FROM_EVENT_B&quot;<br>      }<br>    }<br>  ]</pre><p>Complete registration</p><p>✅ Result:</p><ul><li>Event A registration</li><li>Data from Event B</li></ul><h3>Why This is Actually Dangerous (Not Just “Weird Behavior”)</h3><p>At first glance, this feels like:</p><blockquote><em>“Okay, just data mismatch…”</em></blockquote><p>But it’s deeper.</p><p>This breaks <strong>core assumptions of the system</strong>:</p><ul><li>Events are supposed to be isolated</li><li>Selections define constraints</li><li>Add-ons control pricing &amp; eligibility</li></ul><p>Now all of that can be bypassed.</p><h3>Impact (Real World Thinking)</h3><p>This vulnerability allows attackers to create registrations that do not respect the boundaries defined by event organizers. Instead of selecting valid options, they can inject add-ons and questions from completely unrelated contexts.</p><p>This leads to inconsistent and corrupted registration data where an event contains configurations that were never intended for it. If add-ons are tied to pricing, access levels, or eligibility rules, this could allow users to bypass restrictions or manipulate event behavior in unintended ways.</p><p>From an operational perspective, this creates confusion for event managers reviewing registrations, as the data no longer reflects the actual event setup. It also breaks trust in the system’s integrity, since the backend accepts relationships that should never exist.</p><h3>Root Cause</h3><p>Simple but dangerous:</p><ul><li>❌ Backend does NOT validate object relationships</li><li>❌ Trusts client-supplied IDs</li><li>❌ UI is the only layer enforcing restrictions</li></ul><p>Classic case of:</p><blockquote><em>“Frontend secure ≠ Backend secure”</em></blockquote><h3>Bounty &amp; Program Response</h3><ul><li>Reported: Jan 3, 2026</li><li>Triaged: Accepted</li><li>Severity: Low</li><li>Bounty: $500 + $100 retest</li><li>Fix: Backend validation added</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZWi9M0OwyC23OJ4IHvrqNg.png" /></figure><h3>Key Takeaways</h3><ul><li>Always test <strong>object relationships</strong>, not just access</li><li>IDs are dangerous if not scoped properly</li><li>UI restrictions mean nothing without backend validation</li><li>BOLA bugs are often hidden inside “valid flows”</li><li>Think like: “Can I mix things that shouldn’t mix?”</li></ul><h3>Conclusion</h3><p>This bug wasn’t about accessing something unauthorized directly.</p><p>It was about <strong>breaking the logic of how things are supposed to work together</strong>. And honestly, these are my favorite types of bugs because they don’t scream vulnerability…</p><p>👉 You have to <em>think your way into them</em></p><h3>Connect and Engage</h3><p>💬 What’s your experience with race condition bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0f1a9d287a2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$575 CSRF: Triggering Payment Receipt Emails Without User Consent]]></title>
            <link>https://medium.com/@a13h1/575-csrf-triggering-payment-receipt-emails-without-user-consent-6014dd5a17b0?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/6014dd5a17b0</guid>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[information-security]]></category>
            <category><![CDATA[csrf]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 29 May 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-05-29T13:31:00.952Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! This write is about a <strong>Cross-Site Request Forgery (CSRF)</strong> vulnerability in the payment flow that allowed an attacker to trigger <strong>payment receipt emails without user consent which i found in SAAS</strong></p><p>For this finding, I was awarded a <strong>$500 bounty + $75 retest bonus</strong>. 🚀</p><p>At first glance, this might look like a low-impact issue, but when you think about how it can be abused in real-world scenarios, it becomes much more interesting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LmYRYpS-atcyeeUHDUKx5w.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter has a <strong>Registrations + Payment system</strong> where users can:</p><ul><li>Make payments</li><li>View receipts</li><li>Send receipt emails</li></ul><p>There is a feature where users can <strong>send payment receipts to specific people</strong>, which is expected to be a <strong>user-initiated action</strong>.</p><p>This means:</p><ul><li>The action should be intentional</li><li>It should be protected against unauthorized triggers</li></ul><h3>The Thought Process</h3><p>While exploring the payment flow, I noticed something important:</p><p>The request to send a receipt was a simple POST request</p><p>It was authenticated via cookies</p><p>But I didn’t see any CSRF protection</p><p>That immediately raised a red flag:</p><blockquote><em>“What if this request can be triggered from another website?”</em></blockquote><h3>The Flaw: Missing CSRF Protection</h3><p>The endpoint responsible for sending receipts:</p><pre>POST /payments/{payment_id}/send_receipt</pre><ul><li>No CSRF token required</li><li>Accepts authenticated requests</li><li>Relies only on session cookies</li></ul><h3>Proof of Concept</h3><p>I created a simple HTML page:</p><pre>&lt;html&gt;<br>  &lt;body&gt;<br>    &lt;form action=&quot;https://examplecenter.com/payments/20457373/send_receipt&quot;&gt;<br>      &lt;input type=&quot;hidden&quot; name=&quot;payment[person_ids_to_notify]&quot; value=&quot;43547544&quot; /&gt;<br>    &lt;/form&gt;<br><br>    &lt;script&gt;<br>      document.forms[0].submit();<br>    &lt;/script&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><h4>What Happens</h4><p>If a logged-in user visits this page:</p><p>👉 The request is automatically sent</p><p>👉 The server accepts it</p><p>👉 Receipt emails are triggered</p><p>No:</p><ul><li>User interaction</li><li>Confirmation</li><li>Warning</li></ul><h3>Root Cause</h3><p>The issue exists because:</p><ul><li>The endpoint relies only on <strong>cookie-based authentication</strong></li><li>No CSRF token validation is implemented</li><li>Backend assumes every request is intentional</li></ul><p>👉 Classic CSRF vulnerability</p><h3>Impact</h3><p>This vulnerability allows attackers to abuse authenticated users to send payment receipt emails without authorization.</p><p>Practical impact includes:</p><ul><li>Receipt email spam sent to unintended recipients.</li><li>Confusion or social engineering opportunities (users receiving unexpected receipts).</li><li>Loss of trust in transactional email accuracy.</li><li>Potential misuse by attackers to harass or mislead recipients.</li></ul><p>While this issue does not expose sensitive payment data or modify financial records, it enables unauthorized execution of a user-initiated action and constitutes a valid CSRF vulnerability.</p><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Jan 3, 2026</li><li><strong>Triaged:</strong> Jan 6, 2026</li><li><strong>Bounty:</strong> $500 + $75 bonus</li><li><strong>Retest:</strong> Fix confirmed</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XjD4SZ8nmmcGYIWe9UXaTQ.png" /></figure><h3>Key Takeaways</h3><ul><li>Always check for <strong>CSRF on state-changing actions</strong></li><li>If request works with:Only cookies , No token It’s likely vulnerable</li><li>Even “non-critical” actions can be abused</li><li>Never trust browser-origin requests blindly</li></ul><h3>Personal Insight</h3><p>This bug came from a very simple habit:</p><blockquote><em>“Whenever I see a POST request… I try to replay it without a CSRF token.”</em></blockquote><p>That one habit alone can lead to a lot of findings.</p><h3>Conclusion</h3><p>This vulnerability highlights how missing CSRF protection can allow attackers to silently trigger actions on behalf of users.</p><p>Even though the action here was “just sending emails,” it still breaks user trust and system integrity — which is exactly what security controls are meant to protect.</p><p>Always remember:</p><blockquote><em>If a request changes something… it must verify that the user actually intended it.</em></blockquote><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 What’s your experience with race condition bugs?</p><p>Follow me on Twitter: @a13h1_</p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6014dd5a17b0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$850 Authorization Bypass: Viewer Accessing Automations & Webhook Data via API]]></title>
            <link>https://medium.com/@a13h1/850-authorization-bypass-viewer-accessing-automations-webhook-data-via-api-a697a6c14262?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/a697a6c14262</guid>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[broken-access-control]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[information-security]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 22 May 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-05-22T13:31:00.924Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! While testing a SaaS platform (<strong>ExampleCenter</strong>), I discovered an <strong>authorization bypass vulnerability</strong> that allowed a low-privileged user (Calendar Viewer) to access <strong>automation configurations, execution history, and webhook payloads </strong>data that should only be available to admins.</p><p>For this finding, I was awarded a <strong>$750 bounty + $100 retest bonus</strong>. This bug is a great example of how <strong>token-based access without proper validation</strong> can completely break a permission model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XFOvmjGQI0F45WzYkU9VTg.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter provides a <strong>Calendar + Forms system</strong> with <strong>Automations</strong>.</p><p>These automations:</p><ul><li>Trigger workflows</li><li>Execute actions (e.g., create notes, send data)</li><li>Store execution history</li><li>Include webhook payloads</li></ul><p>👉 This is <strong>sensitive operational data</strong>, not meant for low-privileged users</p><h3>Permission Model (Expected)</h3><ul><li>Admin → Full access to automations</li><li>Editor -&gt; Can edit events, resources and automations</li><li>Viewer → No access to automations can view events and resources</li></ul><p>From the UI:</p><p>❌ Calendar Viewer cannot see:</p><ul><li>Automations</li><li>Automation configs</li><li>Execution history</li></ul><p>So everything looked secure… on the surface.</p><h3>The Thought That Led to the Bug</h3><p>While exploring APIs, I noticed something interesting:</p><p>There was an endpoint generating an <strong>encrypted parameter (_e)</strong>.</p><p>That made me think:</p><blockquote><em>“What if this token is reusable… and not tied to permissions?”</em></blockquote><p>Because i say the automation access api’s require _e token if it is the same _e token which is generating to access automations</p><h3>Step 1: Generating the Token</h3><p>Even as a <strong>Calendar Viewer</strong>, I could request:</p><pre>GET /api/calendar/v2/forms/{form_id}/encrypted_param HTTP/2<br>Host: api.examplecenter.com</pre><h4>Response:</h4><pre>{<br>  &quot;data&quot;: {<br>    &quot;attributes&quot;: {<br>      &quot;trigger_resource&quot;: &quot;ENCRYPTED_TOKEN_HERE&quot;<br>    }<br>  }<br>}</pre><p>👉 I now had a valid _e token</p><h3>Step 2: Accessing Automations</h3><p>Using the same Viewer session + _e token:</p><pre>GET /api/webhooks/v2/automation_subscriptions?_e=ENCRYPTED_TOKEN HTTP/2<br>Host: api.examplecenter.com</pre><h4>Result</h4><p>👉 <strong>200 OK — Data returned successfully</strong></p><p>I was able to access:</p><ul><li>Automation names</li><li>Trigger configurations</li><li>Operation definitions</li><li>Admin identities (who created automation)</li><li>Internal workflow logic</li></ul><h3>Step 3: Accessing Execution History</h3><p>Then I pushed further 👇</p><pre>GET /api/webhooks/v2/automation_subscriptions/{id}/events?_e=ENCRYPTED_TOKEN HTTP/2</pre><h4>Result</h4><p>Full automation execution history exposed</p><p>Including:</p><ul><li>Event payloads</li><li>Webhook data</li><li>User IDs</li><li>Timestamps</li><li>Delivery responses</li></ul><h3>Root Cause</h3><ul><li>Backend APIs do not enforce role-based authorization checks</li><li>Permission enforcement is performed at the UI layer only</li><li>Encrypted _e tokens can be generated and reused by unauthorized roles</li><li>Automation and webhook endpoints trust possession of _e token without verifying user permissions</li></ul><h3>Why This Is Dangerous</h3><p>This isn’t just “data leakage” — it exposes <strong>internal system logic</strong></p><h4>Sensitive Exposure</h4><ul><li>Automation workflows</li><li>Admin activity</li><li>System behavior</li></ul><h4>Intelligence Leak</h4><ul><li>How system triggers events</li><li>Internal structure of workflows</li><li>Business logic insights</li></ul><h4>Webhook Payload Exposure</h4><ul><li>Raw event data</li><li>User references</li><li>Internal identifiers</li></ul><h3>Impact</h3><h4>Confidentiality</h4><ul><li>Exposure of internal automation data</li></ul><h4>Privacy</h4><ul><li>User-related data inside payloads</li></ul><h4>Security Model Break</h4><ul><li>Viewer → Admin-level visibility</li></ul><p>👉 Complete breakdown of privilege separation</p><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Jan 17, 2026</li><li><strong>Triaged:</strong> Jan 20, 2026</li><li><strong>Severity:</strong> Medium</li><li><strong>Bounty:</strong> $750 + $100 bonus</li><li><strong>Retest:</strong> Fix confirmed</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zDesiTyTY8BdHV-i_HLJAQ.png" /></figure><h3>Key Takeaways</h3><ul><li>Never trust <strong>tokens alone</strong> for authorization</li><li>Always validate: User role, Resource ownership</li><li>Test: Hidden endpoints, Token generation APIs</li><li>UI restrictions ≠ backend security</li><li>If you see <strong>reusable tokens → test everywhere</strong></li></ul><h3>Personal Insight</h3><p>This bug came from a simple curiosity:</p><blockquote><em>“If I can generate this token… where else can I use it?”</em></blockquote><p>That single question exposed an entire <strong>internal automation system</strong>.</p><h3>Conclusion</h3><p>This vulnerability shows how dangerous it is when <strong>backend systems rely on tokens without validating user permissions</strong>.</p><p>Even though the UI correctly restricted access, the API allowed a low-privileged user to access <strong>admin-level operational data</strong> — breaking the entire security model.</p><p>Always remember:</p><blockquote><em>Access control should never depend only on “having a token” — it must verify “who is using it.”</em></blockquote><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 Comment your experience with business logic condition bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a697a6c14262" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$900 IDOR: Unauthorized Access to Form Attachments via Direct API]]></title>
            <link>https://medium.com/@a13h1/900-idor-unauthorized-access-to-form-attachments-via-direct-api-2eb6fed81030?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/2eb6fed81030</guid>
            <category><![CDATA[infosec]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[idor]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 15 May 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-05-15T13:31:00.502Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! While testing a SaaS platform (<strong>ExampleCenter</strong>), I discovered an <strong>authorization bypass vulnerability</strong> that allowed a low-privileged user to download file attachments from forms they had no access to.</p><p>For this finding, I was awarded a <strong>$800 bounty + $100 retest bonus</strong>. At first, this looked like a simple endpoint issue but once I explored it deeper, it turned into a classic <strong>IDOR with enumeration potential</strong>. Let’s break it down.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oco6nclkkKE7JEZprnr7AA.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter provides a <strong>People/Form system</strong> where organizations collect data through forms.</p><p>These forms often contain:</p><ul><li>Personal documents</li><li>IDs</li><li>Consent forms</li><li>Sensitive user information</li></ul><p>Access control is supposed to ensure that:</p><ul><li>Only authorized users can view form submissions</li><li>Attachments are restricted to users with proper permissions</li></ul><p>I tested using a <strong>Viewer-level account</strong>, which:</p><ul><li>❌ Cannot access target forms</li><li>❌ Cannot view submissions</li><li>❌ Cannot download attachments via UI</li></ul><p>So from the UI perspective — everything looked secure.</p><h3>The Thought That Triggered the Bug</h3><p>While inspecting network traffic, I noticed that file downloads were happening via a direct endpoint.</p><p>That made me think:</p><blockquote><em>“What if the backend only checks the attachment ID… and not the actual permissions?”</em></blockquote><p>So I decided to test it manually.</p><h3>The Flaw: Direct Access to Attachments</h3><p>I crafted a request using a valid session of a <strong>Viewer user</strong>:</p><pre>GET /form_submission_value/{attachment_id}/attachments?attachment_name={attachment_name} HTTP/2<br>Host: api.examplecenter.com<br>Cookie: session=&lt;viewer_session&gt;</pre><h3>What I Expected vs What Happened</h3><p>I expected to get 403 Forbidden or Access denied error but Actual i get <strong>200 OK — File Downloaded Successfully</strong></p><p>Even though:</p><ul><li>I had no access to the form</li><li>I couldn’t see the submission in UI</li></ul><p>👉 I could still download the attachment</p><h3>The Missing Piece: Enumeration</h3><p>The analyst asked an important question:</p><blockquote><em>“How do you get the attachment name?”</em></blockquote><p>And this is where the bug becomes more interesting 👇</p><h3>Enumeration Possibility</h3><ul><li>attachment_id → sequential</li><li>attachment_name → guessable / enumerable</li><li>No rate limiting on endpoint</li></ul><p>👉 This allows brute-force / enumeration attacks</p><p>An attacker can:</p><ul><li>Iterate IDs</li><li>Try common file names</li><li>Extract valid attachments</li></ul><h3>Why This Matters</h3><p>Even if enumeration requires effort, the impact is serious because:</p><p>👉 Once valid parameters are found → <strong>full file access</strong></p><h3>Root Cause</h3><p>This was a classic IDOR:</p><blockquote><em>Backend authorization relies only on object reference (attachment_id and attachment_name)</em></blockquote><p>Missing checks;</p><ul><li>Does user have access to form?</li><li>Does user have access to submission?</li><li>Is this attachment allowed for this user?</li></ul><p>👉 No authorization validation</p><h3>Impact</h3><p>This vulnerability leads to:</p><h4>Confidentiality Impact</h4><ul><li>Access to sensitive documents and images</li><li>Exposure of personal user data</li></ul><h4>Data Exposure</h4><ul><li>IDs</li><li>Medical forms</li><li>Private submissions</li></ul><h4>Privacy Risk</h4><ul><li>Violation of user trust</li><li>Unauthorized data disclosure</li></ul><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Jan 6, 2026</li><li><strong>Clarification:</strong> Enumeration explained</li><li><strong>Triaged:</strong> Jan 13, 2026</li><li><strong>Severity:</strong> Medium (CVSS-based)</li><li><strong>Bounty:</strong> $800 + $100 bonus</li><li><strong>Retest:</strong> Fix confirmed</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6rkiqh1AA_VLvoDYPCOXRg.png" /></figure><h3>Key Takeaways</h3><ul><li>Always test <strong>direct download endpoints</strong></li><li>IDORs often hide behind: File downloads, Media access &amp; Attachments</li><li>Don’t stop at “need one parameter” — test enumeration</li><li>Lack of rate limiting can turn low bugs into real exploits</li><li>Even partial control over parameters = potential data exposure</li></ul><h3>Personal Insight</h3><p>This bug came from a very simple mindset:</p><blockquote><em>“If I can’t access it in UI… can I still fetch it directly?”</em></blockquote><p>That question alone leads to many real-world bugs.</p><h3>Conclusion</h3><p>This vulnerability highlights how dangerous it is to rely only on <strong>object identifiers without proper authorization checks</strong>.</p><p>Even though the UI correctly restricted access, the backend allowed direct retrieval of sensitive files completely bypassing access controls.</p><p>These types of bugs are very common, especially in systems handling uploads and documents.</p><p>Always remember:</p><blockquote><em>If an endpoint returns a file… it MUST verify who is asking for it if not u got the bounty.</em></blockquote><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 Comment your best experience with IDOR bugs!</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2eb6fed81030" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$1,150 Logic Bug: Orphaning Workflow Cards via Invalid User Assignment]]></title>
            <link>https://medium.com/@a13h1/1-150-logic-bug-orphaning-workflow-cards-via-invalid-user-assignment-8feae18b44eb?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/8feae18b44eb</guid>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[critical-thinking]]></category>
            <category><![CDATA[information-security]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[vulnerability]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 08 May 2026 13:31:00 GMT</pubDate>
            <atom:updated>2026-05-08T13:31:00.716Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! While testing a SaaS platform (<strong>ExampleCenter</strong>), I found a very interesting bug that at first looked like a normal workflow action… but turned out to be a <strong>logic-level denial of service + workflow integrity issue</strong>.</p><p>The issue allowed me to assign workflow cards to <strong>any user ID — including non-existent users or users from another organization</strong> using a direct API request.</p><p>For this finding, I was awarded a <strong>$1,000 bounty + $150 retest bonus</strong>. This is one of those bugs that doesn’t look “critical” at first glance, but once you understand the behavior — it becomes really dangerous.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WrKR7nJhnsC9-TvmWMDRhQ.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter has a <strong>workflow system</strong> where tasks (cards) are assigned to users.</p><p>Each card:</p><ul><li>Belongs to a workflow</li><li>Has an assigned user</li><li>Is visible based on assignment</li></ul><p>From the UI, everything is strictly controlled:</p><p>👉 You can only assign cards to:</p><ul><li>Users in the same organization</li><li>Users who have access to the workflow</li></ul><p>So naturally, I assumed this was properly enforced everywhere.</p><h3>The Small Observation</h3><p>While working with workflows, I noticed something:</p><p>When assigning a card, the UI only shows a <strong>filtered list of valid users who have access to workflow</strong>.</p><p>That made me think:</p><blockquote><em>“Is this restriction enforced in the backend… or just in the UI?”</em></blockquote><p>This is a very common place where bugs hide.</p><h3>The Flaw: Assigning Cards to Arbitrary User IDs</h3><p>I intercepted the request responsible for reassigning a workflow card and modified the assignee_id.</p><h4>Request</h4><pre>PATCH /api/people/v2/workflows/{workflow_id}/cards/{card_id} HTTP/2<br>Host: api.examplecenter.com<br>Authorization: Bearer &lt;user_token&gt;<br>Content-Type: application/json<br><br>{<br>  &quot;data&quot;: {<br>    &quot;attributes&quot;: {<br>      &quot;assignee_id&quot;: &quot;random_or_external_user_id&quot;<br>    }<br>  }<br>}</pre><h3>What I Expected vs What Happened</h3><h4>Expected</h4><p>❌ Validation error (400/403)</p><p>❌ Only valid users allowed</p><h4>Actual</h4><p>👉 <strong>200 OK — Assignment Successful</strong></p><h3>Now Here’s Where It Gets Interesting 👇</h3><p>Depending on what ID I used, different strange behaviors happened:</p><h4>Case 1: Non-Existent User ID</h4><ul><li>Card assigned successfully</li><li>UI shows: <strong>“Assigned to: Loading…”</strong></li><li>Card disappears from normal views</li></ul><p>👉 The card still exists… but no one can access it</p><h4>Case 2: User from Another Organization</h4><ul><li>Assignment accepted</li><li>Card not visible to anyone in the current org</li></ul><p>👉 Cross-tenant reference created</p><h4>Case 3: Valid User (Same Org but No Access)</h4><ul><li>Assignment succeeds</li><li>User cannot see the card</li><li>Other users lose visibility</li></ul><p>👉 Card becomes effectively hidden</p><h3>The Real Problem (Why This Is Dangerous)</h3><p>At first glance, the program asked:</p><blockquote><em>“Isn’t this just like deleting the card?”</em></blockquote><p>And honestly, that’s a fair question.</p><p>But here’s the key difference 👇</p><h4>Deletion</h4><ul><li>Visible action</li><li>Logged</li><li>Recoverable</li><li>Easy to detect</li></ul><h4>This Bug (Orphaning)</h4><ul><li>Silent</li><li>Not obvious</li><li>Hard to trace</li><li>Breaks system logic and assign to another organization user which is outside the feature boundary</li></ul><h4>What Actually Happens</h4><ul><li>Card still exists in database</li><li>Workflow counts still include it</li><li>UI cannot resolve assignee</li><li>Users lose access</li></ul><p>👉 Result: <strong>Orphaned card</strong></p><h3>Root Cause</h3><p>This was a classic <strong>trust-of-client issue</strong>:</p><blockquote><em>Backend did NOT validate assignee_id</em></blockquote><p>Missing checks:</p><ul><li>Does user exist?</li><li>Is user in same org?</li><li>Does user have workflow access?</li></ul><p>👉 API blindly trusted input</p><h3>Impact</h3><p>This bug leads to multiple serious issues:</p><h4>Security Impact</h4><ul><li>Unauthorized workflow manipulation</li><li>Cross-tenant reference injection assigning cards to cross organization user</li></ul><h4>Operational Impact</h4><ul><li>Cards disappear silently</li><li>Workflow becomes inconsistent</li><li>Admins cannot track issues</li></ul><h4>Integrity Impact</h4><ul><li>Workflow state corruption</li><li>Reporting becomes inaccurate</li><li>System assumptions break</li></ul><h4>Logic-Level DoS</h4><ul><li>Cards become inaccessible</li><li>Workflows partially “freeze”</li></ul><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Jan 8, 2026</li><li><strong>Discussion:</strong> Clarified impact with analyst</li><li><strong>Triaged:</strong> Jan 13, 2026</li><li><strong>Bounty:</strong> $1,000 + $150 bonus</li><li><strong>Retest:</strong> Fix confirmed (API now returns validation error 422)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6YxPrfZkN8YShTjZch5dPw.png" /></figure><h3>Key Takeaways</h3><ul><li>Always test <strong>ID-based parameters</strong> (like assignee_id)</li><li>Don’t assume UI restrictions = backend validation</li><li>Test for: Non-existent IDs , Cross-tenant IDs , Unauthorized users</li><li>Logic bugs can be as dangerous as traditional vulnerabilities</li><li>Silent failures are often more dangerous than visible ones</li></ul><h3>Personal Insight</h3><p>This bug came from a very simple thought:</p><blockquote><em>“What happens if I assign this to something that shouldn’t exist?”</em></blockquote><p>That curiosity turned a normal feature into a <strong>workflow-breaking vulnerability</strong>.</p><h3>Conclusion</h3><p>This vulnerability shows how dangerous it is to trust client-side filtering for security decisions.</p><p>Even though the UI enforced strict rules, the backend allowed invalid assignments — leading to <strong>orphaned workflow states, hidden data, and operational disruption</strong>.</p><p>Sometimes the most impactful bugs are not about hacking systems…</p><p>but about breaking their <strong>logic assumptions</strong>.</p><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 Share your experience with logic level DOS bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8feae18b44eb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$2,150 Critical Authorization Bypass: Viewer to Admin Privilege Escalation via API]]></title>
            <link>https://medium.com/@a13h1/2-150-critical-authorization-bypass-viewer-to-admin-privilege-escalation-via-api-c2ef8974a1a5?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/c2ef8974a1a5</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[privilege-escalation]]></category>
            <category><![CDATA[infosec]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Fri, 01 May 2026 12:59:00 GMT</pubDate>
            <atom:updated>2026-05-01T12:59:00.414Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! While testing a SaaS platform (let’s call it <strong>ExampleCenter</strong>), I discovered a <strong>critical Broken Access Control vulnerability</strong> that allowed a low-privileged user to escalate from a <strong>Calendar Viewer → Calendar Administrator</strong> using a simple API request.</p><p>For this finding, I was awarded a <strong>$2,000 bounty + $150 retest bonus</strong>.</p><p>This is one of those bugs where everything looks perfectly secure from the UI… but completely breaks at the backend. Let’s walk through how I found it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TV9d8X9NQ7jcgKrhBZ9qNg.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter provides a <strong>calendar management system</strong> where organizations manage:</p><ul><li>Events</li><li>Rooms &amp; resources</li><li>People scheduling</li><li>Conflict resolution</li></ul><p>The permission model is clearly defined:</p><ul><li><strong>Viewer</strong> → Read-only access</li><li>Editor -&gt; Limited edit and manage resources permissions</li><li><strong>Administrator</strong> → Full control over calendar</li></ul><p>From a Viewer account, I verified:</p><ul><li>❌ Cannot edit rooms</li><li>❌ Cannot manage resources</li><li>❌ Cannot access permission settings</li></ul><p>So far, everything looked correctly restricted.</p><h3>The Thought That Changed Everything</h3><p>While testing, I noticed something important:</p><p>👉 The UI completely hides permission management for non-admin users</p><p>But from experience, I’ve learned:</p><blockquote><em>If the UI hides something… it doesn’t mean the API is protected</em></blockquote><p>So I asked myself:</p><p>👉 <em>What if I directly hit the permission API?</em></p><h3>The Flaw: Full Privilege Escalation via API</h3><p>I intercepted a request related to permissions from admin account and modified it while logged in as a <strong>Viewer and use it</strong>.</p><h4>Crafted Request</h4><pre>PATCH /api/calendar/v2/permissions/{my_user_id} HTTP/2<br>Host: api.examplecenter.com<br>Authorization: Bearer &lt;viewer_token&gt;<br>Content-Type: application/json<br><br>{<br>  &quot;data&quot;: {<br>    &quot;type&quot;: &quot;PersonPermissions&quot;,<br>    &quot;attributes&quot;: {<br>      &quot;permissions_level&quot;: &quot;Administrator&quot;,<br>      &quot;product_permissions&quot;: {<br>        &quot;editRooms&quot;: true,<br>        &quot;editResources&quot;: true,<br>        &quot;editPeople&quot;: true,<br>        &quot;resolvesConflicts&quot;: true<br>      }<br>    }<br>  }<br>}</pre><h3>What I Expected vs What Happened</h3><h4>Expected</h4><p>❌ 403 Forbidden</p><p>❌ Unauthorized action</p><h4>Actual</h4><p>👉 <strong>200 OK</strong></p><p>And after refreshing the UI…</p><p>👉 I was now a <strong>Calendar Administrator</strong></p><h3>What Access Did I Get?</h3><p>After escalation, I gained full control over the calender system:</p><ul><li>✅ Manage rooms</li><li>✅ Manage resources</li><li>✅ Edit people permissions</li><li>✅ Resolve conflicts</li><li>✅ Modify calendar settings</li></ul><p>This wasn’t partial access —</p><p>👉 <strong>This was full administrative takeover of the calendar system</strong></p><h3>Root Cause</h3><p>This vulnerability existed because:</p><blockquote><strong><em>Authorization checks were implemented only in the UI, not in the backend API</em></strong></blockquote><p>The endpoint: /api/calendar/v2/permissions/{id}</p><p>Did NOT validate:</p><ul><li>User role</li><li>Permission boundaries</li><li>Authorization to modify permissions</li></ul><p>👉 Any authenticated user could modify their own permission object</p><h3>Impact</h3><p>This is a textbook <strong>critical privilege escalation</strong>:</p><h4>Security Impact</h4><ul><li>Viewer → Administrator escalation</li><li>Full control over calendar system</li><li>Ability to modify permissions of others</li></ul><h4>Operational Impact</h4><ul><li>Manipulate or delete events</li><li>Disrupt scheduling workflows</li><li>Abuse conflict resolution</li></ul><h4>Business Risk</h4><ul><li>Complete breakdown of permission model</li><li>Unauthorized administrative control</li><li>Potential internal misuse or disruption</li></ul><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Jan 16, 2026</li><li><strong>Triaged:</strong> Jan 20, 2026</li><li><strong>Severity:</strong> Critical → High (final CVSS classification)</li><li><strong>Bounty:</strong> $2,000 + $150 retest bonus</li><li><strong>Retest:</strong> Fix confirmed (API now properly returns 403)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G22-HjF5Du9PsPtagpCcVA.png" /></figure><h3>Key Takeaways</h3><ul><li>Never trust UI-based restrictions — always test backend APIs</li><li>Permission endpoints are <strong>high-value targets</strong></li><li>Always test: Role upgrades, Self-permission changes, Hidden admin endpoints</li><li>If you can modify your own permission object → <strong>it’s game over</strong></li><li>Always compare: What UI allows and What API allows</li></ul><h3>Personal Insight</h3><p>This bug came from a very simple question:</p><blockquote><em>“Can I modify my own permissions directly?”</em></blockquote><p>Sometimes the most critical bugs don’t come from complex techniques —</p><p>they come from testing <strong>basic assumptions properly</strong>.</p><h3>Conclusion</h3><p>This vulnerability highlights a critical flaw in many SaaS applications:</p><p>👉 <strong>Mismatch between frontend restrictions and backend authorization</strong></p><p>Even though the UI correctly restricted access, the backend API allowed full privilege escalation — completely breaking the security model.</p><p>As a hunter, always remember:</p><blockquote><em>The UI is just a suggestion — the API is the truth.</em></blockquote><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 What’s your experience with Privilege escalation bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c2ef8974a1a5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$800 Bounty: Privilege Escalation via API — From Scheduler to Team Admin]]></title>
            <link>https://infosecwriteups.com/800-bounty-privilege-escalation-via-api-from-scheduler-to-team-admin-810bb8401a0f?source=rss-502c7a93b835------2</link>
            <guid isPermaLink="false">https://medium.com/p/810bb8401a0f</guid>
            <category><![CDATA[privilege-escalation]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[infosec]]></category>
            <category><![CDATA[broken-access-control]]></category>
            <dc:creator><![CDATA[Abhi Sharma]]></dc:creator>
            <pubDate>Thu, 23 Apr 2026 06:03:14 GMT</pubDate>
            <atom:updated>2026-04-23T07:05:09.105Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi Everyone! I recently discovered a <strong>Broken Access Control / Privilege Escalation vulnerability</strong> in a SaaS platform (ExampleCenter) that allowed a low-privileged user (Scheduler role) to perform <strong>editor-level administrative actions</strong> via direct API calls.</p><p>For this discovery, I was awarded a <strong>$700 bounty along with a $100 bonus for retesting</strong>. Let’s explore how this bug worked, how I exploited it, and why it was important.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cbYz3K-TO6DoOCJ7TI1jIA.png" /></figure><h3>Understanding the Target</h3><p>ExampleCenter is a SaaS platform used for managing teams, scheduling, and workflows within organizations. It follows a role-based access control model:</p><ul><li><strong>Editors/Admins</strong> → Can manage teams, structure, and permissions</li><li><strong>Schedulers</strong> → Can only assign people to existing teams</li></ul><p>To maintain proper security boundaries, only <strong>Editors and Admin </strong>should be able to:</p><ul><li>Create teams</li><li>Copy teams</li><li>Assign team leaders</li><li>Modify team configurations</li></ul><p>The UI correctly enforces this restriction by displaying:</p><blockquote><em>“Only editors can create teams.”</em></blockquote><p>At this point, everything looked correct.</p><p>But from experience, I’ve learned one important thing:</p><blockquote><em>If something is blocked in the UI… it doesn’t mean it’s blocked in the backend.</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/608/1*cOsPe3LpG6I9Cs6gKvA5ZA.png" /></figure><h3>The Moment of Curiosity</h3><p>Instead of stopping there, I opened Burp and started looking at how the application was communicating with the backend.</p><p>I noticed that when switching tabs or loading team-related data, the app was calling certain API endpoints. That gave me an idea:</p><p><em>What if the team creation functionality still exists in the API, but is just hidden in the UI?</em></p><p>So I decided to test it manually by accessing the team creation api from higher level user account and use via scheduler user.</p><h3>The Flaw: Backend Didn’t Enforce Authorization</h3><p>I crafted a request to the team creation endpoint using my <strong>Scheduler account token</strong>:</p><pre>POST /api/services/v2/service_types/{id}/teams HTTP/2<br>Host: api.examplecenter.com<br>Authorization: Bearer &lt;scheduler_token&gt;<br>Content-Type: application/json<br><br>{<br>  &quot;data&quot;: {<br>    &quot;type&quot;: &quot;team&quot;,<br>    &quot;attributes&quot;: {<br>      &quot;name&quot;: &quot;SchedulerTeam&quot;,<br>      &quot;copy_team_members&quot;: true,<br>      &quot;secure_team&quot;: true,<br>      &quot;team_leader_ids&quot;: [attacker_id]<br>    }<br>  }<br>}</pre><p>I honestly expected a <strong>403 Forbidden</strong>.</p><p>But instead…</p><p>👉 <strong>200 OK — Team Created Successfully</strong></p><p>Not only that:</p><ul><li>The team was created</li><li>I was assigned as <strong>Team Leader</strong></li></ul><p>At that moment, it was clear:</p><blockquote><em>This wasn’t just a UI issue — this was a full authorization bypass.</em></blockquote><h3>Going Deeper: How Far Can This Go?</h3><p>Once I confirmed the initial bug, I started exploring how much control I actually had.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*IK7ykme5TcloKxNJ_IXJxQ.png" /></figure><h3>1. Copy Existing Teams</h3><p>I noticed a parameter:</p><pre>&quot;copy_from&quot;: &quot;&lt;team_id&gt;&quot;</pre><p>So I tried cloning an existing team.</p><p>👉 Result:</p><ul><li>Full team structure copied</li><li>Members and configurations inherited</li><li>I could assign myself as leader</li></ul><p>This turned the bug from <strong>simple bypass → structured privilege escalation</strong></p><h3>2. Assigning Leadership</h3><p>By modifying:</p><pre>&quot;team_leader_ids&quot;: [my_user_id]</pre><p>I could:</p><ul><li>Assign myself as leader</li><li>Assign other users as leaders</li></ul><p>👉 Basically controlling hierarchy inside the system</p><h3>3. Mass Team Creation</h3><p>Then I tested limits…</p><ul><li>No rate limiting</li><li>No restrictions</li></ul><p>👉 I could create <strong>hundreds of teams quickly</strong></p><p>This could:</p><ul><li>Flood the system</li><li>Break workflows</li><li>Create administrative chaos</li></ul><h3>4. Duplicate Team Names</h3><p>Another small but interesting issue:</p><ul><li>Same team name allowed multiple times</li><li>No uniqueness validation</li></ul><p>👉 Leads to confusion + potential misuse</p><h3>Root Cause</h3><p>This bug came down to one classic mistake:</p><blockquote><strong><em>Authorization was enforced only in the UI, not in the backend API</em></strong></blockquote><ul><li>UI → correctly restricts Scheduler</li><li>API → blindly accepts request</li></ul><p>This mismatch is exactly where most <strong>BAC (Broken Access Control)</strong> bugs live.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/632/1*kkbKjniQRm8dTL5spd1-Wg.png" /></figure><h3>Impact</h3><p>This wasn’t just theoretical it had real-world implications:</p><h4>Security Impact</h4><ul><li>Privilege escalation (Scheduler → Admin-like control)</li><li>Unauthorized structural changes</li><li>Self-assigned leadership roles</li></ul><h4>Operational Impact</h4><ul><li>Mass team creation → workflow disruption</li><li>Duplicate teams → confusion</li><li>Increased cleanup overhead</li></ul><h4>Business Risk</h4><ul><li>Breaks trust in role-based permissions</li><li>Violates least privilege principle</li><li>Could enable misuse or internal abuse</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/614/1*3QSRqg0yv5_lEJG60rYfCA.png" /></figure><h3>Bounty &amp; Program Response</h3><ul><li><strong>Reported:</strong> Dec 20, 2025</li><li><strong>Triaged:</strong> Jan 5, 2026</li><li><strong>Severity:</strong> High → Medium</li><li><strong>Bounty:</strong> $700 + $100 bonus</li><li><strong>Retest:</strong> Fix confirmed (API now returns 403)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yZZJOErxipdwHS1z17XUOA.png" /></figure><h3>Key Takeaways</h3><ul><li>Never trust UI restrictions always test the API</li><li>Backend authorization is the <strong>real security layer</strong></li><li>Privilege escalation often hides in: Create , Copy ND Assign operations</li><li>Missing rate limits can amplify impact</li><li>Observing API calls / JS endpoints can reveal hidden attack surfaces</li></ul><h3>Conclusion</h3><p>This bug is a perfect example of how <strong>frontend restrictions can create a false sense of security</strong>.</p><p>From the UI, everything looked secure.</p><p>But under the hood, the API allowed a low-privileged user to perform <strong>admin-level actions</strong>.</p><p>These kinds of vulnerabilities are extremely common in modern SaaS platforms — especially where complex role systems exist.</p><p>As a hunter, always ask:</p><p>👉 <em>“What if the backend doesn’t care?”</em></p><p>Until next time — happy hacking! 🚀</p><h3>Connect and Engage</h3><p>💬 What’s your experience with PE bugs?</p><p>Follow me on Twitter: <a href="https://x.com/a13h1_">@a13h1_</a></p><p>Keep clapping, commenting, and sharing your thoughts — your support motivates me to share more real bug bounty stories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=810bb8401a0f" width="1" height="1" alt=""><hr><p><a href="https://infosecwriteups.com/800-bounty-privilege-escalation-via-api-from-scheduler-to-team-admin-810bb8401a0f">$800 Bounty: Privilege Escalation via API — From Scheduler to Team Admin</a> was originally published in <a href="https://infosecwriteups.com/">InfoSec Write-ups</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>