Jadi rupanya karena penipuan baru-baru ini, alat pengembang dieksploitasi oleh orang-orang untuk mengirim spam dan bahkan digunakan untuk "meretas" akun. Facebook telah memblokir alat pengembang, dan saya bahkan tidak bisa menggunakan konsol.
Bagaimana mereka melakukan itu ?? Satu pos Stack Overflow mengklaim bahwa itu tidak mungkin , tetapi Facebook telah membuktikan mereka salah.
Cukup buka Facebook dan buka alat pengembang, ketik satu karakter ke konsol, dan peringatan ini muncul. Apa pun yang Anda masukkan, itu tidak akan dieksekusi.
Bagaimana ini mungkin?
Mereka bahkan memblokir pelengkapan otomatis di konsol:
javascript
facebook
google-chrome-devtools
Derek 朕 會 功夫
sumber
sumber
Jawaban:
Saya seorang insinyur keamanan di Facebook dan ini adalah kesalahan saya. Kami sedang menguji ini untuk beberapa pengguna untuk melihat apakah itu dapat memperlambat beberapa serangan di mana pengguna ditipu untuk menempelkan kode JavaScript (jahat) ke konsol browser.
Untuk lebih jelasnya: mencoba memblokir peretas sisi klien adalah ide yang buruk secara umum; ini untuk melindungi terhadap serangan rekayasa sosial tertentu .
Jika Anda berakhir di kelompok uji dan terganggu dengan ini, maaf. Saya mencoba membuat halaman opt-out lama (sekarang halaman bantuan ) sesederhana mungkin tetapi masih cukup menakutkan untuk menghentikan setidaknya beberapa korban.
Kode aktual sangat mirip dengan tautan @ joeldixon66 ; milik kami sedikit lebih rumit tanpa alasan.
Chrome membungkus semua kode konsol
... jadi situs tersebut mendefinisikan ulang
console._commandLineAPI
untuk membuang:Ini tidak cukup (coba saja!) , Tapi itulah trik utamanya.
Epilog: Tim Chrome memutuskan bahwa mengalahkan konsol dari sisi pengguna JS adalah bug dan memperbaiki masalah , menjadikan teknik ini tidak valid. Setelah itu, perlindungan tambahan ditambahkan untuk melindungi pengguna dari self-xss .
sumber
console.log
.Saya menemukan skrip buster konsol Facebook menggunakan alat pengembang Chrome. Berikut adalah skrip dengan perubahan kecil untuk keterbacaan. Saya telah menghapus bit yang tidak bisa saya mengerti:
Dengan ini, konsol-otomatis gagal secara diam-diam sementara pernyataan yang diketik di konsol akan gagal dijalankan (pengecualian akan dicatat).
Referensi:
sumber
Saya tidak dapat memicunya pada halaman mana pun. Versi yang lebih kuat dari ini akan melakukannya:
Untuk memberi gaya keluaran: Warna dalam konsol JavaScript
Edit Thinking @ joeldixon66 memiliki ide yang tepat: Nonaktifkan eksekusi JavaScript dari konsol «::: KSpace :::
sumber
window.console.log = function(){//empty}
dan menggunakan console.logSelain mendefinisikan ulang
console._commandLineAPI
, ada beberapa cara lain untuk membobol InjectedScriptHost di browser WebKit, untuk mencegah atau mengubah evaluasi ekspresi yang dimasukkan ke konsol pengembang.Edit:
Chrome telah memperbaikinya dalam rilis sebelumnya. - yang pasti sebelum Februari 2015, saat saya menciptakan intinya pada saat itu
Jadi, inilah kemungkinan lain. Kali ini kami menghubungkan, level di atas, langsung ke
InjectedScript
daripadaInjectedScriptHost
sebagai lawan dari versi sebelumnya.Yang agak menyenangkan, karena Anda bisa langsung menambal monyet
InjectedScript._evaluateAndWrap
daripada harus bergantungInjectedScriptHost.evaluate
karena itu memberi Anda kontrol lebih baik atas apa yang harus terjadi.Hal lain yang cukup menarik adalah, bahwa kita dapat mencegat hasil internal ketika ekspresi dievaluasi dan mengembalikannya kepada pengguna alih-alih perilaku normal.
Berikut adalah kode, yang melakukan hal itu, mengembalikan hasil internal ketika pengguna mengevaluasi sesuatu di konsol.
Ini agak bertele-tele, tapi saya pikir saya menaruh beberapa komentar di dalamnya
Jadi biasanya, jika pengguna, misalnya, mengevaluasi
[1,2,3,4]
Anda akan mengharapkan output berikut:Setelah monkeypatching
InjectedScript._evaluateAndWrap
mengevaluasi ekspresi yang sama, berikan output berikut:Seperti yang Anda lihat panah kiri-kecil, yang menunjukkan keluaran, masih ada di sana, tapi kali ini kita mendapatkan objek. Di mana hasil dari ekspresi, array
[1,2,3,4]
diwakili sebagai objek dengan semua propertinya dijelaskan.Saya sarankan mencoba untuk mengevaluasi ekspresi ini dan itu, termasuk yang menghasilkan kesalahan. Cukup menarik.
Selain itu, kita lihat di
is
-InjectedScriptHost
- objek. Ini memberikan beberapa metode untuk bermain dan mendapatkan sedikit wawasan tentang internal inspektur.Tentu saja, Anda dapat mencegat semua informasi itu dan tetap mengembalikan hasil asli kepada pengguna.
Cukup ganti pernyataan pengembalian di jalur lain dengan
console.log (res)
mengikuti areturn res
. Maka Anda akan berakhir dengan yang berikut ini.Akhir dari Edit
Ini adalah versi sebelumnya yang diperbaiki oleh Google. Karenanya bukan cara yang mungkin lagi.
Salah satunya adalah mengaitkan keFunction.prototype.call
Chrome mengevaluasi ekspresi yang dimasukkan dengancall
menggunakan fungsi eval-nya denganInjectedScriptHost
asthisArg
var result = evalFunction.call(object, expression);
Mengingat ini, Anda dapat mendengarkan untuk
thisArg
daricall
makhlukevaluate
dan mendapatkan referensi ke argumen pertama (InjectedScriptHost
)Anda dapat misalnya membuat kesalahan, bahwa evaluasi ditolak.
Berikut adalah contoh di mana ekspresi yang dimasukkan akan diteruskan ke kompiler CoffeeScript sebelum meneruskannya ke
evaluate
fungsi.sumber
Netflix juga mengimplementasikan fitur ini
Mereka hanya mengganti
console._commandLineAPI
untuk membuang kesalahan keamanan.sumber
Ini sebenarnya mungkin karena Facebook bisa melakukannya. Yah, bukan alat pengembang web yang sebenarnya tetapi eksekusi Javascript di konsol.
Lihat ini: Bagaimana cara Facebook menonaktifkan Alat Pengembang terintegrasi browser?
Ini benar-benar tidak akan berbuat banyak karena ada cara lain untuk memotong jenis keamanan sisi klien ini.
Ketika Anda mengatakan itu adalah sisi klien, itu terjadi di luar kendali server, jadi tidak banyak yang dapat Anda lakukan. Jika Anda bertanya mengapa Facebook masih melakukan ini, ini bukan untuk keamanan tetapi untuk melindungi pengguna normal yang tidak tahu javascript dari menjalankan kode (bahwa mereka tidak tahu cara membaca) ke konsol. Ini umum untuk situs yang menjanjikan layanan auto-liker atau bot fungsionalitas Facebook lainnya setelah Anda melakukan apa yang mereka minta Anda lakukan, di mana dalam kebanyakan kasus, mereka memberi Anda potongan javascript untuk dijalankan di konsol.
Jika Anda tidak memiliki pengguna sebanyak Facebook, maka saya rasa tidak perlu melakukan apa yang dilakukan Facebook.
Bahkan jika Anda menonaktifkan Javascript di konsol, menjalankan javascript melalui bilah alamat masih dimungkinkan.
dan jika browser menonaktifkan javascript di bilah alamat, (Saat Anda menempelkan kode ke bilah alamat di Google Chrome, itu menghapus frasa 'javascript:') menempelkan javascript ke salah satu tautan melalui elemen periksa masih dimungkinkan.
Periksa jangkar:
Tempel kode dalam href:
Intinya adalah validasi sisi server dan keamanan harus menjadi yang pertama, kemudian lakukan sisi klien.
sumber
Chrome banyak berubah sejak facebook dapat menonaktifkan konsol ...
Per Maret 2017 ini tidak berfungsi lagi.
Yang terbaik yang dapat Anda lakukan adalah menonaktifkan beberapa fungsi konsol, misalnya:
sumber
Cara sederhana saya, tetapi dapat membantu untuk variasi lebih lanjut tentang hal ini. Daftar semua metode dan ubah menjadi tidak berguna.
sumber
getCompletions
Devtools internal menyuntikkan IIFE yang dinamai ke dalam halaman, disebut ketika tombol ditekan di dalam konsol Devtools.Melihat sumber fungsi itu, ia menggunakan beberapa fungsi global yang dapat ditimpa.
Dengan menggunakan
Error
konstruktor dimungkinkan untuk mendapatkan tumpukan panggilan, yang akan termasukgetCompletions
ketika dipanggil oleh Devtools.Contoh:
sumber
solusi sederhana!
sumber
console.log()
?console.log()
tidak ada lagi masalah ketika konsol terus-menerus dibersihkan :)Saya akan mengikuti:
sumber
Ini bukan langkah keamanan agar kode lemah dibiarkan tanpa pengawasan. Selalu dapatkan solusi permanen untuk kode lemah dan amankan situs web Anda dengan benar sebelum menerapkan strategi ini
Alat terbaik sejauh ini menurut pengetahuan saya adalah menambahkan beberapa file javascript yang hanya mengubah integritas halaman kembali normal dengan menyegarkan atau mengganti konten. Menonaktifkan alat pengembang ini bukan ide terbaik karena mem-bypass selalu dipertanyakan karena kode merupakan bagian dari browser dan bukan rendering server, sehingga bisa di-crack.
Jika Anda telah
js file one
memeriksa<element>
perubahan pada elemen penting danjs file two
danjs file three
memeriksa apakah file ini ada per periode, Anda akan memiliki integritas penuh memulihkan pada halaman dalam periode tersebut.Mari kita ambil contoh dari 4 file dan menunjukkan kepada Anda apa yang saya maksud.
index.html
mainfile.js
ps.js
ks.js
style.css
Sekarang ini hanya untuk menunjukkan itu berfungsi pada semua file dan tag juga
Jika Anda meletakkan semua file ini bersama-sama dan membangun contoh Anda akan melihat fungsi dari ukuran ini. Ini akan mencegah beberapa suntikan yang tidak terduga jika Anda menerapkannya dengan benar pada semua elemen penting dalam file indeks Anda terutama ketika bekerja dengan PHP.
Mengapa saya memilih memuat ulang daripada mengubah kembali ke nilai normal per atribut adalah kenyataan bahwa beberapa penyerang dapat memiliki bagian lain dari situs web yang sudah dikonfigurasi dan siap dan mengurangi jumlah kode. Muat ulang akan menghapus semua kerja keras penyerang dan dia mungkin akan bermain di tempat yang lebih mudah.
Catatan lain: Ini bisa menjadi banyak kode jadi tetap bersih dan pastikan untuk menambahkan definisi di mana mereka membuat pengeditan menjadi mudah di masa depan. Juga atur detik ke jumlah pilihan Anda karena interval 1 detik pada halaman besar dapat memiliki efek drastis pada komputer lama yang mungkin digunakan pengunjung Anda
sumber