Frage Wie deaktiviert Facebook die integrierten Entwicklertools des Browsers?


Offensichtlich wegen der jüngsten Betrügereien werden die Entwicklertools von Leuten ausgenutzt, um Spam zu posten und sogar um "Konten" zu "hacken". Facebook hat die Entwickler-Tools blockiert, und ich kann nicht einmal die Konsole verwenden.

Enter image description here

Wie haben sie das gemacht? Ein Stack-Overflow-Post behauptet, dass dies nicht möglich ist, aber Facebook hat bewiesen, dass sie falsch liegen.

Gehen Sie einfach zu Facebook und öffnen Sie die Entwickler-Tools, geben Sie einen Buchstaben in die Konsole ein, und diese Warnung erscheint. Egal was du eingibst, es wird nicht ausgeführt.

Wie ist das möglich?

Sie blockierten sogar die automatische Vervollständigung in der Konsole:

Enter image description here


1560
2018-02-11 03:42


Ursprung


Antworten:


Ich bin ein Sicherheitsingenieur bei Facebook und das ist meine Schuld. Wir testen es für einige Benutzer, um zu sehen, ob es einige Angriffe verlangsamen kann, bei denen Benutzer dazu gebracht werden, (bösartigen) JavaScript-Code in die Browser-Konsole einzufügen.

Nur um es klar zu sagen: Der Versuch, Hacker Client-Seite zu blockieren, ist ein schlechte Idee Im Algemeinen; das ist gegen a zu schützen spezifischer 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, aber immer noch beängstigend genug, um wenigstens aufzuhören etwas der Opfer.

Der eigentliche Code ist ziemlich ähnlich zu @ joeldixon66s Link; Unseres ist etwas komplizierter, ohne guten Grund.

Chrome umschließt den gesamten Konsolencode

with ((console && console._commandLineAPI) || {}) {
  <code goes here>
}

... so definiert sich die Seite neu console._commandLineAPI werfen:

Object.defineProperty(console, '_commandLineAPI',
   { get : function() { throw 'Nooo!' } })

Das ist nicht genug genug (probier es aus!), aber das ist das Haupttrick.


Epilog: Das Chrome-Team entschied, dass das Besiegen der Konsole von der JS auf der Benutzeroberfläche ein Fehler war Das Problem wurde behobenDiese Technik wird ungültig. Danach wurde zusätzlicher Schutz hinzugefügt Schützen Sie Benutzer vor Self-Xss.


2281
2018-02-11 05:33



Ich habe das Console Buster-Skript von Facebook mithilfe von Chrome-Entwicklertools gefunden. Hier ist das Skript mit kleinen Änderungen für die Lesbarkeit. Ich habe die Teile entfernt, die ich nicht verstehen konnte:

Object.defineProperty(window, "console", {
    value: console,
    writable: false,
    configurable: false
});

var i = 0;
function showWarningAndThrow() {
    if (!i) {
        setTimeout(function () {
            console.log("%cWarning message", "font: 2em sans-serif; color: yellow; background-color: red;");
        }, 1);
        i = 1;
    }
    throw "Console is disabled";
}

var l, n = {
        set: function (o) {
            l = o;
        },
        get: function () {
            showWarningAndThrow();
            return l;
        }
    };
Object.defineProperty(console, "_commandLineAPI", n);
Object.defineProperty(console, "__commandLineAPI", n);

Dadurch schlägt die automatische Vervollständigung der Konsole automatisch fehl, während in der Konsole eingegebene Anweisungen nicht ausgeführt werden können (die Ausnahme wird protokolliert).

Verweise:


72
2018-02-15 08:16



Ich konnte es nicht auf jeder Seite auslösen. Eine robustere Version von diesem würde es tun:

window.console.log = function(){
    console.error('The developer console is temp...');
    window.console.log = function() {
        return false;
    }
}

console.log('test');

So formatieren Sie die Ausgabe: Farben in der JavaScript-Konsole

Bearbeiten Denken @ Joeldixon66 hat die richtige Idee: Deaktivieren Sie die JavaScript-Ausführung von der Konsole «::: KSpace :::


36
2018-02-11 04:02



Neben der Neudefinition console._commandLineAPI, Es gibt einige andere Möglichkeiten, um in InjectedScriptHost in WebKit-Browsern einzubrechen, 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 damals den Grundstein gelegt habe 

Also hier ist eine andere Möglichkeit. Diesmal springen wir ein Level höher, direkt hinein InjectedScript eher, als InjectedScriptHost im Gegensatz zur vorherigen Version.

Was ist nett, wie Sie direkt Affe Patch können InjectedScript._evaluateAndWrap anstatt sich darauf verlassen zu müssen InjectedScriptHost.evaluate Dadurch haben Sie eine feinere Kontrolle darüber, was passieren sollte.

Eine andere ziemlich interessante Sache ist, dass wir das interne Ergebnis abfangen können, wenn ein Ausdruck ausgewertet wird und gib das zurück für den Benutzer anstelle des normalen Verhaltens.

Hier ist der Code, der genau das tut, gibt das interne Ergebnis zurück, wenn ein Benutzer etwas in der Konsole auswertet.

var is;
Object.defineProperty(Object.prototype,"_lastResult",{
   get:function(){
       return this._lR;
   },
   set:function(v){
       if (typeof this._commandLineAPIImpl=="object") is=this;
       this._lR=v;
   }
});
setTimeout(function(){
   var ev=is._evaluateAndWrap;
   is._evaluateAndWrap=function(){
       var res=ev.apply(is,arguments);
       console.log();
       if (arguments[2]==="completion") {
           //This is the path you end up when a user types in the console and autocompletion get's evaluated

           //Chrome expects a wrapped result to be returned from evaluateAndWrap.
           //You can use `ev` to generate an object yourself.
           //In case of the autocompletion chrome exptects an wrapped object with the properties that can be autocompleted. e.g.;
           //{iGetAutoCompleted: true}
           //You would then go and return that object wrapped, like
           //return ev.call (is, '', '({test:true})', 'completion', true, false, true);
           //Would make `test` pop up for every autocompletion.
           //Note that syntax as well as every Object.prototype property get's added to that list later,
           //so you won't be able to exclude things like `while` from the autocompletion list,
           //unless you wou'd find a way to rewrite the getCompletions function.
           //
           return res; //Return the autocompletion result. If you want to break that, return nothing or an empty object
       } else {
           //This is the path where you end up when a user actually presses enter to evaluate an expression.
           //In order to return anything as normal evaluation output, you have to return a wrapped object.

           //In this case, we want to return the generated remote object. 
           //Since this is already a wrapped object it would be converted if we directly return it. Hence,
           //`return result` would actually replicate the very normal behaviour as the result is converted.
           //to output what's actually in the remote object, we have to stringify it and `evaluateAndWrap` that object again.`
           //This is quite interesting;
           return ev.call (is, null, '(' + JSON.stringify (res) + ')', "console", true, false, true)
       }
   };
},0);

Es ist ein wenig wortreich, aber ich dachte, ich hätte ein paar Kommentare dazu geschrieben

Also normalerweise, wenn ein Benutzer zum Beispiel auswertet [1,2,3,4] Sie würden die folgende Ausgabe erwarten:

enter image description here 

Nach dem Monkeypatching InjectedScript._evaluateAndWrap Auswerten des gleichen Ausdrucks gibt die folgende Ausgabe:

enter image description here

Wie Sie sehen, ist der kleine linke Pfeil, der die Ausgabe anzeigt, noch vorhanden, aber dieses Mal erhalten wir ein Objekt. Wo das Ergebnis des Ausdrucks, das Array [1,2,3,4] wird als ein Objekt mit all seinen beschriebenen Eigenschaften dargestellt.

Ich empfehle, diesen und jenen Ausdruck zu bewerten, einschließlich solcher, die Fehler erzeugen. Es ist ziemlich interessant.

Werfen Sie einen Blick auf die is  - InjectedScriptHost - Objekt. Es bietet einige Methoden zum Spielen und einen Einblick in die Interna des Inspektors.

Natürlich könnten Sie alle diese Informationen abfangen und trotzdem das ursprüngliche Ergebnis an den Benutzer zurückgeben.

Ersetzen Sie einfach die Rückgabeanweisung im Else-Pfad durch a console.log (res) nach einem return res. Dann würden Sie mit dem folgenden enden.

enter image description here 

Ende der Bearbeitung 


Dies ist die vorherige Version, die von Google behoben wurde. Daher kein möglicher Weg mehr.

Einer davon ist einhaken Function.prototype.call

Chrome wertet den eingegebenen Ausdruck nach aus callseine eval Funktion mit InjectedScriptHost wie thisArg


25
2018-02-19 14:49



Netflix implementiert diese Funktion auch

(function() {
    try {
        var $_console$$ = console;
        Object.defineProperty(window, "console", {
            get: function() {
                if ($_console$$._commandLineAPI)
                    throw "Sorry, for security reasons, the script console is deactivated on netflix.com";
                return $_console$$
            },
            set: function($val$$) {
                $_console$$ = $val$$
            }
        })
    } catch ($ignore$$) {
    }
})();

Sie überschreiben einfach console._commandLineAPI Sicherheitsfehler zu werfen.


19
2018-03-06 06:20



Dies ist tatsächlich möglich, da Facebook es geschafft hat. Nun, nicht die eigentlichen Web-Entwickler-Tools, sondern die Ausführung von Javascript in der Konsole.

Sieh dir das an: Wie deaktiviert Facebook die integrierten Entwicklertools des Browsers?

Dies wird jedoch nicht viel tun, da es andere Möglichkeiten gibt, diese Art von clientseitiger Sicherheit zu umgehen.

Wenn Sie sagen, dass es sich um eine Client-Seite handelt, geschieht dies außerhalb der Kontrolle des Servers. Sie können also nicht viel dagegen tun. Wenn Sie sich fragen, warum Facebook dies immer noch tut, dient dies nicht wirklich der Sicherheit, sondern dem Schutz normaler Benutzer, die JavaScript nicht von Code ausführen (den sie nicht zu lesen verstehen) in die Konsole. Dies ist üblich für Websites, die Auto-Likers-Service oder andere Facebook-Funktionalität Bots versprechen, nachdem Sie tun, was sie Sie tun, wo sie in den meisten Fällen eine Schnipse von Javascript, um in der Konsole ausgeführt werden.

Wenn Sie nicht so viele Nutzer haben wie Facebook, dann glaube ich nicht, dass Sie etwas tun müssen, was Facebook tut.

Selbst wenn Sie Javascript in der Konsole deaktivieren, ist das Ausführen von JavaScript über die Adressleiste weiterhin möglich.

enter image description here

enter image description here

und wenn der Browser JavaScript in der Adressleiste deaktiviert, (Wenn Sie Code in die Adressleiste in Google Chrome einfügen, löscht es den Ausdruck "javascript:") Einfügen von JavaScript in einen der Links über Inspect-Element ist immer noch möglich.

Überprüfen Sie den Anker:

enter image description here

Code in href einfügen:

enter image description here

enter image description here

enter image description here

Unterm Strich ist serverseitige Validierung und Sicherheit sollte zuerst sein, dann Client-Seite nach.


18
2017-11-05 00:57



Chrome hat sich seit den Zeiten, in denen Facebook die Konsole deaktivieren konnte, stark verändert ...

Ab März 2017 funktioniert das nicht mehr.

Am besten können Sie einige der Konsolenfunktionen deaktivieren, zum Beispiel:

if(!window.console) window.console = {};
var methods = ["log", "debug", "warn", "info", "dir", "dirxml", "trace", "profile"];
for(var i=0;i<methods.length;i++){
    console[methods[i]] = function(){};
}

5
2018-03-12 12:44



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.

  Object.getOwnPropertyNames(console).filter(function(property) {
     return typeof console[property] == 'function';
  }).forEach(function (verb) {
     console[verb] =function(){return 'Sorry, for security reasons...';};
  });

3
2017-11-18 22:29