Najwyraźniej z powodu ostatnich oszustw ludzie używają narzędzi programistycznych do wysyłania spamu, a nawet do „hakowania” kont. Facebook zablokował narzędzia programistyczne i nie mogę nawet korzystać z konsoli.
Jak oni to zrobili? Jeden post przepełnienia stosu stwierdził, że nie jest to możliwe , ale Facebook udowodnił, że się mylą.
Wystarczy wejść na Facebooka i otworzyć narzędzia programistyczne, wpisać w konsoli jeden znak, a pojawi się to ostrzeżenie. Bez względu na to, co włożysz, nie zostanie wykonane.
Jak to jest możliwe?
Nawet zablokowali automatyczne uzupełnianie w konsoli:
javascript
facebook
google-chrome-devtools
Derek 朕 會 功夫
źródło
źródło
Odpowiedzi:
Jestem inżynierem bezpieczeństwa na Facebooku i to moja wina. Testujemy to, aby niektórzy użytkownicy sprawdzili, czy może spowolnić niektóre ataki, w których użytkownicy są nakłaniani do wklejenia (złośliwego) kodu JavaScript do konsoli przeglądarki.
Żeby było jasne: próba zablokowania hakerów po stronie klienta jest ogólnie złym pomysłem ; ma to na celu ochronę przed konkretnym atakiem inżynierii społecznej .
Jeśli znalazłeś się w grupie testowej i cię to denerwuje, przepraszam. Starałem się, aby stara strona rezygnacji (teraz strona pomocy ) była tak prosta, jak to możliwe, a jednocześnie była wystarczająco przerażająca, aby powstrzymać przynajmniej niektóre ofiary.
Rzeczywisty kod jest podobny do linku @ joeldixon66 ; nasz jest nieco bardziej skomplikowany bez powodu.
Chrome otacza cały kod konsoli
... więc strona redefiniuje
console._commandLineAPI
rzut:To nie wystarczy (spróbuj!) , Ale to główna sztuczka.
Epilog: zespół Chrome zdecydował, że pokonanie konsoli przez JS po stronie użytkownika było błędem i naprawił problem , powodując, że ta technika była nieprawidłowa. Następnie dodano dodatkową ochronę, aby chronić użytkowników przed self-xss .
źródło
console.log
.Zlokalizowałem skrypt kasowania na Facebooku za pomocą narzędzi programistycznych Chrome. Oto skrypt z niewielkimi zmianami w zakresie czytelności. Usunąłem bity, których nie mogłem zrozumieć:
Dzięki temu automatyczne uzupełnianie konsoli nie powiedzie się po cichu, a instrukcje wpisane w konsoli nie zostaną wykonane (wyjątek zostanie zarejestrowany).
Bibliografia:
źródło
Nie mogłem tego uruchomić na żadnej stronie. Bardziej niezawodna wersja tego by to zrobiła:
Aby nadać styl wynikowi: Kolory w konsoli JavaScript
Edytuj Myślenie @ joeldixon66 ma właściwy pomysł: Wyłącz wykonywanie JavaScript w konsoli «::: KSpace :::
źródło
window.console.log = function(){//empty}
i użyj console.logOprócz redefiniowania
console._commandLineAPI
, istnieją inne sposoby włamania się do InjectedScriptHost w przeglądarkach WebKit, aby zapobiec lub zmienić ocenę wyrażeń wprowadzonych do konsoli programisty.Edytować:
Chrome naprawił to w poprzedniej wersji. - które musiały być przed lutym 2015 r., ponieważ wtedy stworzyłem sedno
Oto kolejna możliwość. Tym razem w hak, poziom wyżej, bezpośrednio
InjectedScript
zamiastInjectedScriptHost
w przeciwieństwie do wcześniejszej wersji.Co jest całkiem miłe, ponieważ możesz bezpośrednio małpować łatkę
InjectedScript._evaluateAndWrap
zamiast polegać na niej,InjectedScriptHost.evaluate
ponieważ daje to bardziej szczegółową kontrolę nad tym, co powinno się stać.Inną dość interesującą rzeczą jest to, że możemy przechwycić wynik wewnętrzny podczas oceny wyrażenia i zwrócić go użytkownikowi zamiast normalnego zachowania.
Oto kod, który właśnie to robi, zwraca wynik wewnętrzny, gdy użytkownik ocenia coś w konsoli.
To trochę gadatliwe, ale pomyślałem, że dodałem do niego kilka komentarzy
Więc normalnie, jeśli użytkownik, na przykład, ocenia,
[1,2,3,4]
można oczekiwać następujących danych wyjściowych:Po monkeypatchingu
InjectedScript._evaluateAndWrap
oceniającym to samo wyrażenie, daje następujące dane wyjściowe:Jak widzisz mała strzałka w lewo wskazująca wyjście, nadal tam jest, ale tym razem otrzymujemy obiekt. W przypadku wyniku wyrażenia tablica
[1,2,3,4]
jest reprezentowana jako obiekt ze wszystkimi opisanymi właściwościami.Polecam spróbować ocenić to i to wyrażenie, w tym te, które generują błędy. To dość interesujące.
Dodatkowo spójrz na obiekt
is
-InjectedScriptHost
- . Zapewnia kilka metod zabawy i pozwala uzyskać wgląd w wewnętrzne elementy kontrolera.Oczywiście możesz przechwycić wszystkie te informacje i nadal zwrócić oryginalny wynik użytkownikowi.
Wystarczy zastąpić instrukcję return w ścieżce else
console.log (res)
następującą literą areturn res
. Wtedy skończysz z następującymi.Koniec edycji
To jest poprzednia wersja, która została naprawiona przez Google. Dlatego nie jest już możliwy sposób.
Jeden z nich się zaczepiaFunction.prototype.call
Chrome ocenia wprowadzone wyrażenie, wprowadzająccall
funkcję eval przy pomocyInjectedScriptHost
asthisArg
var result = evalFunction.call(object, expression);
Biorąc to pod uwagę, można nasłuchiwać
thisArg
odcall
istotyevaluate
i uzyskać odniesienie do pierwszego argumentu (InjectedScriptHost
)Możesz np. Zgłosić błąd, że ocena została odrzucona.
Oto przykład, w którym wprowadzone wyrażenie jest przekazywane do kompilatora CoffeeScript przed przekazaniem go do
evaluate
funkcji.źródło
Netflix również implementuje tę funkcję
Po prostu zastępują,
console._commandLineAPI
aby zgłosić błąd bezpieczeństwa.źródło
Jest to faktycznie możliwe, ponieważ Facebook był w stanie to zrobić. Cóż, nie rzeczywiste narzędzia programistyczne, ale wykonanie Javascript w konsoli.
Zobacz: Jak Facebook wyłącza zintegrowane narzędzia programistyczne przeglądarki?
To naprawdę nie zrobi wiele, ponieważ istnieją inne sposoby obejścia tego rodzaju zabezpieczeń po stronie klienta.
Kiedy mówisz, że jest to po stronie klienta, dzieje się to poza kontrolą serwera, więc niewiele możesz z tym zrobić. Jeśli pytasz, dlaczego Facebook nadal to robi, to nie jest tak naprawdę dla bezpieczeństwa, ale dla ochrony zwykłych użytkowników, którzy nie znają javascript przed uruchomieniem kodu (który nie umie czytać) do konsoli. Jest to powszechne w witrynach, które obiecują usługę automatycznego polubienia lub inne boty z funkcjonalnością Facebooka po zrobieniu tego, o co cię proszą, w większości przypadków dają ci wycinek javascript do uruchomienia w konsoli.
Jeśli nie masz tylu użytkowników, co Facebook, nie sądzę, że trzeba robić to, co robi Facebook.
Nawet jeśli wyłączysz Javascript w konsoli, nadal możesz uruchomić JavaScript w pasku adresu.
a jeśli przeglądarka wyłącza javascript na pasku adresu, (po wklejeniu kodu do paska adresu w Google Chrome usuwa frazę „javascript:”) wklejanie javascript do jednego z linków poprzez element inspekcji jest nadal możliwe.
Sprawdź kotwicę:
Wklej kod w href:
Najważniejsze jest sprawdzenie po stronie serwera i bezpieczeństwo powinno być najpierw, a potem po stronie klienta.
źródło
Chrome bardzo się zmienił, odkąd Facebook mógł wyłączyć konsolę ...
Według stanu na marzec 2017 r. To już nie działa.
Najlepsze, co możesz zrobić, to wyłączyć niektóre funkcje konsoli, na przykład:
źródło
Mój prosty sposób, ale może pomóc w dalszych zmianach na ten temat. Wymień wszystkie metody i zmień je na bezużyteczne.
źródło
Devtools wewnętrznie wstrzykują IIFE o nazwie
getCompletions
na stronę, wywoływaną po naciśnięciu klawisza w konsoli Devtools.Patrząc na źródło tej funkcji , wykorzystuje kilka globalnych funkcji, które można zastąpić.
Za pomocą
Error
konstruktora można uzyskać stos wywołań, który będzie obejmowałgetCompletions
wywołanie przez Devtools.Przykład:
źródło
proste rozwiązanie!
źródło
console.log()
?console.log()
nie ma już znaczenia, kiedy konsola jest stale czyszczona :)Postąpiłbym tak:
źródło
Nie jest to środek bezpieczeństwa w przypadku pozostawienia słabego kodu bez nadzoru. Zawsze uzyskuj trwałe rozwiązanie słabego kodu i odpowiednio zabezpiecz swoje witryny przed wdrożeniem tej strategii
Według mojej wiedzy najlepszym narzędziem byłoby dodanie wielu plików javascript, które po prostu zmieniają integralność strony z powrotem na normalną, odświeżając lub zastępując zawartość. Wyłączenie tego narzędzia programistycznego nie byłoby najlepszym pomysłem, ponieważ pomijanie jest zawsze kwestionowane, ponieważ kod jest częścią przeglądarki, a nie renderowaniem serwera, dlatego może zostać złamany.
Nie powinno być
js file one
sprawdzanie<element>
zmian na ważnych elementach ijs file two
orazjs file three
sprawdzenie, czy istnieje ten plik za okres trzeba będzie pełna integralność przywrócić na stronie w terminie.Weźmy przykład 4 plików i pokażemy ci, co mam na myśli.
index.html
mainfile.js
ps.js
ks.js
style.css
Teraz ma to tylko pokazać, że działa również na wszystkich plikach i znacznikach
Jeśli połączysz wszystkie te pliki i zbudujesz przykład, zobaczysz funkcję tego środka. Zapobiegnie to niektórym nieprzewidzianym wstrzyknięciom, jeśli poprawnie zaimplementujesz je we wszystkich ważnych elementach pliku indeksu, szczególnie podczas pracy z PHP.
Dlaczego zdecydowałem się na przeładowanie zamiast powrotu do normalnej wartości dla atrybutu, to fakt, że niektórzy atakujący mogą mieć skonfigurowaną i gotową inną część strony internetowej, co zmniejsza ilość kodu. Przeładowanie usunie całą ciężką pracę atakującego i prawdopodobnie pójdzie grać gdzieś łatwiej.
Kolejna uwaga: może to być dużo kodu, więc utrzymuj go w czystości i pamiętaj, aby dodać definicje do ich miejsca, aby ułatwić edycję w przyszłości. Ustaw także preferowaną liczbę sekund, ponieważ 1-sekundowe odstępy na dużych stronach mogą mieć drastyczne efekty na starszych komputerach, z których mogą korzystać użytkownicy
źródło