Anscheinend werden die Entwicklertools aufgrund der jüngsten Betrugsversuche von Leuten zum Posten von Spam ausgenutzt und sogar zum "Hacken" von Konten verwendet. Facebook hat die Entwicklertools blockiert und ich kann nicht einmal die Konsole verwenden.
Wie haben sie das gemacht? Ein Beitrag zum Stapelüberlauf behauptete, dass dies nicht möglich sei , aber Facebook hat bewiesen, dass sie falsch sind.
Gehen Sie einfach zu Facebook und öffnen Sie die Entwicklertools, geben Sie ein Zeichen in die Konsole ein, und diese Warnung wird angezeigt. Egal was Sie eingeben, es wird nicht ausgeführt.
Wie ist das möglich?
Sie haben sogar die automatische Vervollständigung in der Konsole blockiert:
javascript
facebook
google-chrome-devtools
Derek 朕 會 功夫
quelle
quelle
Antworten:
Ich bin Sicherheitsingenieur bei Facebook und das ist meine Schuld. Wir testen dies für einige Benutzer, um festzustellen, ob es einige Angriffe verlangsamen kann, bei denen Benutzer dazu verleitet werden, (böswilligen) JavaScript-Code in die Browserkonsole einzufügen.
Um ganz klar zu sein: Der Versuch, Hacker clientseitig zu blockieren, ist im Allgemeinen eine schlechte Idee . Dies dient dem Schutz vor einem bestimmten Social-Engineering-Angriff .
Wenn Sie in der Testgruppe gelandet sind und sich darüber ärgern, tut mir leid. Ich habe versucht, die alte Opt-out-Seite (jetzt Hilfeseite ) so einfach wie möglich zu gestalten, während ich immer noch beängstigend genug war, um zumindest einige der Opfer aufzuhalten .
Der eigentliche Code ist dem Link von @ joeldixon66 ziemlich ähnlich . Unsere ist ohne guten Grund etwas komplizierter.
Chrome schließt den gesamten Konsolencode ein
... also definiert die Seite neu
console._commandLineAPI
zu werfen:Das ist nicht genug (probieren Sie es aus!) , Aber das ist der Haupttrick.
Epilog: Das Chrome-Team entschied, dass das Besiegen der Konsole von benutzerseitigem JS ein Fehler war, und behebte das Problem , wodurch diese Technik ungültig wurde. Anschließend wurde ein zusätzlicher Schutz hinzugefügt, um Benutzer vor Self-XSS zu schützen .
quelle
console.log
.Ich habe das Console Buster-Skript von Facebook mithilfe der Chrome-Entwicklertools gefunden. Hier ist das Skript mit geringfügigen Änderungen zur besseren Lesbarkeit. Ich habe die Teile entfernt, die ich nicht verstehen konnte:
Damit schlägt die automatische Vervollständigung der Konsole stillschweigend fehl, während in die Konsole eingegebene Anweisungen nicht ausgeführt werden können (die Ausnahme wird protokolliert).
Verweise:
quelle
Ich konnte es auf keiner Seite dazu bringen, das auszulösen. Eine robustere Version davon würde es tun:
So gestalten Sie die Ausgabe: Farben in der JavaScript-Konsole
Edit Thinking @ joeldixon66 hat die richtige Idee: Deaktivieren Sie die JavaScript-Ausführung über die Konsole «::: KSpace :::
quelle
window.console.log = function(){//empty}
und benutze console.logNeben der Neudefinition
console._commandLineAPI
gibt es einige andere Möglichkeiten, in InjectedScriptHost in WebKit-Browsern einzudringen, um die Auswertung von in die Entwicklerkonsole eingegebenen Ausdrücken zu verhindern oder zu ändern.Bearbeiten:
Chrome hat dies in einer früheren Version behoben. - das muss vor Februar 2015 gewesen sein, als ich das Wesentliche zu dieser Zeit erstellt habe
Also hier ist eine andere Möglichkeit. Dieses Mal schließen wir uns ein Level höher direkt an
InjectedScript
und nichtInjectedScriptHost
im Gegensatz zur vorherigen Version.Das ist ein bisschen nett, da Sie Affen-Patches direkt ausführen können,
InjectedScript._evaluateAndWrap
anstatt sich darauf verlassen zu müssen,InjectedScriptHost.evaluate
da Sie dadurch eine genauere Kontrolle darüber haben, was passieren soll.Eine andere ziemlich interessante Sache ist, dass wir das interne Ergebnis abfangen können, wenn ein Ausdruck ausgewertet wird, und dieses anstelle des normalen Verhaltens an den Benutzer zurückgeben können.
Hier ist der Code, der genau das tut und das interne Ergebnis zurückgibt, wenn ein Benutzer etwas in der Konsole auswertet.
Es ist ein bisschen ausführlich, aber ich dachte, ich habe ein paar Kommentare hinzugefügt
Wenn ein Benutzer beispielsweise auswertet
[1,2,3,4]
, erwarten Sie normalerweise die folgende Ausgabe:Nach dem Monkeypatching
InjectedScript._evaluateAndWrap
, das denselben Ausdruck auswertet, wird die folgende Ausgabe ausgegeben:Wie Sie sehen, ist der kleine linke Pfeil, der die Ausgabe anzeigt, immer noch vorhanden, aber dieses Mal erhalten wir ein Objekt. Wenn das Ergebnis des Ausdrucks ist, wird das Array
[1,2,3,4]
als Objekt mit allen beschriebenen Eigenschaften dargestellt.Ich empfehle, diesen und jenen Ausdruck zu bewerten, einschließlich derer, die Fehler erzeugen. Es ist ziemlich interessant.
Schauen Sie sich außerdem das
is
-InjectedScriptHost
- Objekt an. Es bietet einige Methoden zum Spielen und um einen Einblick in die Interna des Inspektors zu erhalten.Natürlich können Sie all diese Informationen abfangen und trotzdem das ursprüngliche Ergebnis an den Benutzer zurückgeben.
Ersetzen Sie einfach die return-Anweisung im else-Pfad durch ein
console.log (res)
folgendes areturn res
. Dann würden Sie am Ende mit dem folgenden enden.Ende der Bearbeitung
Dies ist die vorherige Version, die von Google behoben wurde. Daher kein möglicher Weg mehr.
Eines davon hakt sich einFunction.prototype.call
Chrome wertet den eingegebenen Ausdruck aus, indem escall
seine Bewertungsfunktion mitInjectedScriptHost
as angibtthisArg
var result = evalFunction.call(object, expression);
Vor diesem Hintergrund können Sie für das hören
thisArg
voncall
Wesenevaluate
und einen Verweis auf das erste Argument bekommen (InjectedScriptHost
)Sie könnten zB einen Fehler auslösen, dass die Auswertung abgelehnt wurde.
Hier ist ein Beispiel, in dem der eingegebene Ausdruck an einen CoffeeScript-Compiler übergeben wird, bevor er an die
evaluate
Funktion übergeben wird.quelle
Netflix implementiert diese Funktion ebenfalls
Sie überschreiben nur, um
console._commandLineAPI
Sicherheitsfehler auszulösen.quelle
Dies ist tatsächlich möglich, da Facebook dies konnte. Nun, nicht die eigentlichen Webentwickler-Tools, sondern die Ausführung von Javascript in der Konsole.
Siehe dies: Wie deaktiviert Facebook die integrierten Entwicklertools des Browsers?
Dies wird jedoch nicht viel bewirken, da es andere Möglichkeiten gibt, diese Art der clientseitigen Sicherheit zu umgehen.
Wenn Sie sagen, dass es clientseitig ist, geschieht dies außerhalb der Kontrolle des Servers, sodass Sie nicht viel dagegen tun können. Wenn Sie sich fragen, warum Facebook dies immer noch tut, dient dies nicht der Sicherheit, sondern dem Schutz normaler Benutzer, die kein Javascript kennen, vor dem Ausführen von Code (den sie nicht lesen können) in die Konsole. Dies ist häufig bei Websites der Fall, die einen Auto-Liker-Service oder andere Facebook-Funktions-Bots versprechen, nachdem Sie das getan haben, was sie von Ihnen verlangen. In den meisten Fällen erhalten Sie einen Ausschnitt aus Javascript, der in der Konsole ausgeführt werden kann.
Wenn Sie nicht so viele Nutzer wie Facebook haben, müssen Sie meiner Meinung nach nicht das tun, was Facebook tut.
Selbst wenn Sie Javascript in der Konsole deaktivieren, ist das Ausführen von Javascript über die Adressleiste weiterhin möglich.
und wenn der Browser Javascript in der Adressleiste deaktiviert (wenn Sie Code in die Adressleiste in Google Chrome einfügen, wird der Ausdruck "Javascript:" gelöscht), ist das Einfügen von Javascript in einen der Links über das Inspect-Element weiterhin möglich.
Überprüfen Sie den Anker:
Code in href einfügen:
Unterm Strich ist die serverseitige Validierung und die Sicherheit sollte zuerst erfolgen, danach die clientseitige.
quelle
Chrome hat sich sehr verändert, seit Facebook die Konsole deaktivieren konnte ...
Ab März 2017 funktioniert das nicht mehr.
Am besten deaktivieren Sie einige der Konsolenfunktionen. Beispiel:
quelle
Mein einfacher Weg, aber es kann für weitere Variationen zu diesem Thema helfen. Listen Sie alle Methoden auf und ändern Sie sie in nutzlos.
quelle
Intern fügt devtools ein IIFE mit dem Namen
getCompletions
in die Seite ein, das aufgerufen wird, wenn eine Taste in der Devtools-Konsole gedrückt wird.Bei Betrachtung der Quelle dieser Funktion werden einige globale Funktionen verwendet, die überschrieben werden können.
Mit dem
Error
Konstruktor ist es möglich, den AufrufstapelgetCompletions
abzurufen , der beim Aufruf durch Devtools enthalten ist.Beispiel:
quelle
eine einfache Lösung!
quelle
console.log()
?console.log()
spielt keineIch würde den Weg gehen von:
quelle
Dies ist keine Sicherheitsmaßnahme dafür, dass schwacher Code unbeaufsichtigt bleibt. Holen Sie sich immer eine dauerhafte Lösung für schwachen Code und sichern Sie Ihre Websites ordnungsgemäß, bevor Sie diese Strategie implementieren
Meines Wissens nach wäre das mit Abstand beste Tool das Hinzufügen mehrerer Javascript-Dateien, die einfach die Integrität der Seite durch Aktualisieren oder Ersetzen von Inhalten wieder auf den Normalwert zurücksetzen. Das Deaktivieren dieses Entwicklertools wäre nicht die beste Idee, da das Umgehen immer in Frage kommt, da der Code Teil des Browsers und kein Server-Rendering ist und daher möglicherweise geknackt wird.
Wenn Sie
js file one
nach<element>
Änderungen an wichtigen Elementen suchenjs file two
undjs file three
überprüfen, ob diese Datei pro Zeitraum vorhanden ist, wird die vollständige Integrität der Seite innerhalb des Zeitraums wiederhergestellt.Nehmen wir ein Beispiel der 4 Dateien und zeigen Ihnen, was ich meine.
index.html
mainfile.js
ps.js
ks.js
style.css
Dies soll nur zeigen, dass es auch für alle Dateien und Tags funktioniert
Wenn Sie alle diese Dateien zusammenfügen und das Beispiel erstellen, sehen Sie die Funktion dieser Kennzahl. Dies verhindert einige unvorhergesehene Injektionen, wenn Sie sie auf allen wichtigen Elementen in Ihrer Indexdatei korrekt implementieren, insbesondere wenn Sie mit PHP arbeiten.
Warum ich mich für das Neuladen entschieden habe, anstatt zum normalen Wert pro Attribut zurückzukehren, ist die Tatsache, dass einige Angreifer möglicherweise einen anderen Teil der Website bereits konfiguriert und bereit haben und dadurch die Codemenge verringert wird. Durch das Nachladen wird die harte Arbeit des Angreifers beseitigt und er wird wahrscheinlich an einem leichteren Ort spielen.
Noch ein Hinweis: Dies könnte zu viel Code werden. Halten Sie ihn daher sauber und fügen Sie Definitionen hinzu, wo sie hingehören, um Änderungen in Zukunft zu vereinfachen. Stellen Sie die Sekunden auch auf den von Ihnen bevorzugten Wert ein, da 1-Sekunden-Intervalle auf großen Seiten drastische Auswirkungen auf ältere Computer haben können, die Ihre Besucher möglicherweise verwenden
quelle