Specific Criticism of CVSS4
Marc Ruef
Die Identifikation eines Webbrowsers ist bei browserspezifischen Angriffen professioneller Natur unerlässlich. Traditioneller Weise wird dabei die als User-Agent mitgeschickte Header-Zeile des Clients ausgelesen. Da sich diese jedoch manipulieren lässt (z.B. bei Mozilla Firefox durch das Addon User Agent Switcher), wird auch hier ein akkurates Application Fingerprinting unerlässlich.
Das browserrecon project versucht dies passiv und serverseitig anhand der Anfragestruktur des Browsers umzusetzen. Und mit dem GET Queue Fingerprinting haben wir eine weitere experimentelle Methode dieser Art entwickelt, die die Reihenfolge der Download-Anfragen zu berücksichtigen versucht.
Jedoch ist es nicht immer möglich oder gewollt, die Erkennung durch ein dynamisches Skript auf dem Webserver umzusetzen. Zum Beispiel dann, wenn das Exploiting im Rahmen einer simplen Cross Site Scripting-Attacke durchgesetzt werden will. Um die Identifikation des Browser auf dieser Ebene und damit clientseitig umzusetzen, kann versucht werden die Eigenarten der Javascript-Implementierung – in unserem Fall wollen wir uns auf Ajax konzentrieren – zu erkennen.
Pedro Laguna von I64 Labs entwickelte eine einfache Implementierung, die den Browser durch xmlHttpRequest versucht auf die Seite about:blank
zugreifen zu lassen:
x.open("GET", "about:blank", false);
Durch das Abfangen des Fehlers wird es nun möglich, durch die unterschiedlichen Error-Codes den jeweiligen Browsertyp zu erkennen:
In this case we use an AJAX object to get the about:blank page. This launch an exception in every browser and checking the error code and treatment we can determine the version of the browser.
Nachfolgende Tabelle zeigt auf, welche Eigenschaften das Error-Objekt bei den jeweiligen Browsern mitbringt. Die Property description existiert beispielsweise nur beim Internet Explorer ab Version 5.0 und lineNumber wird nur bei den Browsern von Mozilla und Netscape ausgegeben.
Property | Explorer | Mozilla | Netscape | Opera | Safari |
---|---|---|---|---|---|
constructor | 5.0+ | 1.0+ | 6.0+ | 7.0+ | 1.0+ |
description | 5.0+ | – | – | – | – |
fileName | – | 1.0+ | 6.0+ | – | – |
lineNumber | – | 1.0+ | 6.0+ | – | – |
message | 5.5+ | 1.0+ | 6.0+ | 7.0+ | 1.0+ |
number | 5.0+ | – | – | – | – |
prototype | 5.5+ | 1.0+ | 6.0+ | 7.0+ | 1.0+ |
stack | 5.0+ | 1.0+ | 6.0+ | – | – |
Werden Eigenschaften von mehreren Browser-Familien genutzt, kann versucht werden anhand der Struktur der Rückgabewerte die einzelnen Browser und deren Versionen zu unterscheiden. Beispielsweise gibt Mozilla Firefox 3 für die Eigenschaft name die Zeichenkette NS_ERROR_DOM_BAD_URI
zurück, wohingegen der Internet Explorer 8 die Zeichenkette TypeError
verwendet. Durch Pattern-Matching und/oder reguläre Ausdrücke lassen sich derlei Unterschiede erkennen.
Wir stellen einen Proof-of-Concept bereit, der eine solche Auswertung zu automatisieren in der Lage ist. Dieser stellt eine Optimierung und Erweiterung der ursprünglichen Implementierung von Pedro Laguna dar. Die jeweiligen Fingerprints stehen zudem als Excel-Sheet zum Download bereit.
Our experts will get in contact with you!
Marc Ruef
Marc Ruef
Marc Ruef
Marc Ruef
Our experts will get in contact with you!