Browser Fingerprinting mit Ajax

Browser Fingerprinting mit Ajax

Marc Ruef
by Marc Ruef
time to read: 7 minutes

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.

Browser Ajax Fingerprints

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.

About the Author

Marc Ruef

Marc Ruef has been working in information security since the late 1990s. He is well-known for his many publications and books. The last one called The Art of Penetration Testing is discussing security testing in detail. He is a lecturer at several faculties, like ETH, HWZ, HSLU and IKF. (ORCID 0000-0002-1328-6357)

Links

Are you interested in a Penetration Test?

Our experts will get in contact with you!

×
Specific Criticism of CVSS4

Specific Criticism of CVSS4

Marc Ruef

scip Cybersecurity Forecast

scip Cybersecurity Forecast

Marc Ruef

Voice Authentication

Voice Authentication

Marc Ruef

Bug Bounty

Bug Bounty

Marc Ruef

You want more?

Further articles available here

You need support in such a project?

Our experts will get in contact with you!

You want more?

Further articles available here