SQL injection
Banyak pengembang web tidak menyadari bagaimana query SQL dapat dirusak, dan menganggap bahwa query SQL adalah perintah Web. Ini berarti bahwa query SQL dapat menghindari kontrol akses, sehingga melewati standar otentikasi dan otorisasi cek, dan kadang-kadang query SQL bahkan memungkinkan akses ke tuan perintah tingkat sistem operasi.
Direct Injection SQL Command adalah teknik di mana seorang penyerang menciptakan atau alter ada perintah SQL untuk mengekspos data yang disembunyikan, atau untuk menimpa orang-orang yang berharga, atau bahkan untuk menjalankan perintah tingkat sistem berbahaya pada host basis data. Hal ini dilakukan oleh aplikasi mengambil input pengguna dan menggabungkan dengan parameter statis untuk membangun sebuah query SQL. Contoh-contoh berikut ini didasarkan pada kisah nyata, sayangnya.
Karena kurangnya validasi input dan menghubungkan ke database atas nama superuser atau orang yang dapat membuat pengguna, penyerang dapat menciptakan superuser dalam database Anda.
Contoh
1 Memisahkan hasil set ke halaman ... dan membuat superusers (PostgreSQL)
<? php
$ offset = $ argv [0]; / / hati-hati, tidak ada validasi input!
$ query = "SELECT id, nama FROM produk ORDER BY nama LIMIT 20 OFFSET $ offset;";
$ result = pg_query ($ conn, $ query);
>
Pengguna biasa klik 'next', 'prev' link di mana $ offset dikodekan ke dalam URL. Script mengharapkan bahwa $ masuk offset angka desimal. Namun, bagaimana jika seseorang mencoba untuk istirahat di dengan menambahkan sebuah urlencode () 'd bentuk berikut ini untuk URL
0;
masukkan ke pg_shadow (usename, usesysid, usesuper, usecatupd, passwd)
pilih 'retak', usesysid, 't', 't', 'retak'
dari pg_shadow mana usename = 'postgres';
-
Jika itu terjadi, maka script akan menyajikan akses superuser kepadanya. Perhatikan bahwa 0; adalah untuk menyediakan valid diimbangi dengan permintaan asli dan untuk mengakhiri itu.
Catatan:
Ini adalah teknik umum untuk memaksa SQL parser untuk mengabaikan sisa query ditulis oleh pengembang dengan - yang merupakan tanda komentar di SQL.
Jika itu terjadi , maka script akan menyajikan akses superuser kepadanya . Perhatikan bahwa 0; adalah untuk menyediakan valid diimbangi dengan permintaan asli dan untuk mengakhiri itu .
Catatan :
Ini adalah teknik umum untuk memaksa SQL parser untuk mengabaikan sisa
query ditulis oleh pengembang dengan - yang merupakan tanda komentar di
SQL .
Sebuah cara yang layak untuk mendapatkan password adalah untuk menghindari halaman hasil pencarian Anda . Satu-satunya
hal penyerang perlu lakukan adalah untuk melihat apakah ada variabel
yang disampaikan digunakan dalam pernyataan SQL yang tidak ditangani
dengan benar . Filter
ini dapat diatur umumnya dalam bentuk sebelumnya untuk menyesuaikan
MANA , ORDER BY , LIMIT dan OFFSET klausa dalam laporan SELECT . Jika
database Anda mendukung konstruksi UNION , penyerang dapat mencoba
untuk menambahkan seluruh query untuk satu asli untuk daftar password
dari tabel yang sewenang-wenang . Menggunakan medan password terenkripsi sangat didorong .
Contoh
2 Listing keluar artikel ... dan beberapa password ( database server )< ? php
$ query = " SELECT id , nama , dimasukkan , ukuran FROM produk
MANA size = ' $ size ' " ;$ result = odbc_exec ( $ conn , $ query ) ;
>Bagian statis dari query dapat dikombinasikan dengan pernyataan SELECT lain yang mengungkapkan semua password :
'union select '1 ' , concat ( uname | |' - '| | passwd ) sebagai nama , '1971 - 01-01 ' , '0 'dari usertable ;-
Jika pertanyaan ini ( bermain dengan ' dan - ) ditugaskan untuk salah
satu dari variabel yang digunakan dalam $ query , binatang permintaan
terbangun .
SQL UPDATE ini juga rentan terhadap serangan . Pertanyaan ini juga terancam dengan memotong dan menambahkan query sama sekali baru untuk itu . Tapi penyerang mungkin biola dengan klausa SET . Dalam hal ini beberapa informasi skema harus dimiliki untuk memanipulasi query berhasil . Hal ini dapat diperoleh dengan memeriksa nama-nama variabel bentuk , atau hanya cukup kasar memaksa . Ada tidak begitu banyak konvensi penamaan untuk bidang menyimpan password atau username .
Contoh
3 Dari reset password ... untuk mendapatkan lebih banyak hak istimewa ( database server )< ? php$ query = " UPDATE SET usertable pwd = ' $ pwd ' WHERE uid = ' $ uid ' ; " ;>Tapi
pengguna berbahaya sumbits nilai ' atau uid seperti ' % admin % menjadi
$ uid untuk mengubah password admin , atau hanya menetapkan $ pwd untuk
hehehe ' , dipercaya = 100 , admin = ' ya untuk mendapatkan lebih
banyak hak . Kemudian , pertanyaan akan diputar :< ? php
/ / $ Uid : ' atau uid seperti ' % admin %$ query = " UPDATE SET usertable pwd = ' ... ' MANA uid = '' atau uid seperti ' % admin % ' ; " ;
/ / $ Pwd : hehehe ' , dipercaya = 100 , admin = ' yes$ query = " UPDATE SET usertable pwd = ' hehehe ' , dipercaya = 100 , admin = ' yes ' WHERE... ; " ;
>
Sebuah contoh yang menakutkan bagaimana perintah tingkat sistem operasi dapat diakses di beberapa host basis data .
Contoh
4 Menyerang sistem operasi basis data host ( MSSQL Server )< ? php
$ query = " SELECT * FROM produk WHERE id LIKE ' % $ prod % ' " ;$ result = mssql_query ( $ query ) ;
>Jika penyerang mengajukan nilai a% ' exec master .. xp_cmdshell ' test
net user testpass / ADD ' - untuk $ prod , maka $ query akan :< ? php
$ query = " SELECT * FROM produk
WHERE id LIKE ' % a% '
exec master .. xp_cmdshell 'test net user testpass / ADD ' - % ' " ;$ result = mssql_query ( $ query ) ;
>MSSQL Server mengeksekusi pernyataan SQL dalam batch termasuk perintah untuk menambahkan user baru ke database account lokal . Jika aplikasi ini berjalan sebagai sa dan layanan MSSQLSERVER
berjalan dengan hak yang mencukupi , penyerang sekarang akan memiliki
account yang dapat digunakan untuk mengakses mesin ini .
Catatan :
Beberapa contoh di atas terkait dengan server database tertentu . Ini tidak berarti bahwa serangan serupa tidak mungkin terhadap produk lainnya . Database server Anda mungkin sama rentannya dengan cara lain .
Contoh bekerja isu mengenai SQL InjectionGambar milik » xkcdTeknik Penghindaran ¶
Meskipun
masih jelas bahwa penyerang harus memiliki setidaknya beberapa
pengetahuan tentang arsitektur database dalam rangka untuk melakukan
serangan yang sukses , memperoleh informasi ini seringkali sangat
sederhana . Sebagai
contoh, jika database adalah bagian dari open source atau paket
perangkat lunak publik lain yang tersedia dengan instalasi default,
informasi ini benar-benar terbuka dan tersedia . Informasi
ini juga dapat diungkapkan oleh kode sumber tertutup - bahkan jika itu
dikodekan , mengaburkan , atau disusun - dan bahkan oleh kode Anda
sendiri melalui tampilan pesan kesalahan . Metode lain termasuk pengguna tabel dan kolom nama umum . Sebagai contoh, sebuah form login yang menggunakan tabel ' user ' dengan nama kolom ' id ' , 'username' , dan 'password' .
Serangan ini terutama didasarkan pada pemanfaatan kode tidak ditulis dengan keamanan dalam pikiran . Jangan
pernah percaya apapun masukan , terutama yang berasal dari sisi klien ,
meskipun itu berasal dari kotak pilih , field input tersembunyi atau
cookie . Contoh pertama menunjukkan bahwa seperti permintaan bersalah dapat menyebabkan bencana .
Jangan menghubungkan ke database sebagai superuser atau sebagai pemilik database . Gunakan pengguna selalu disesuaikan dengan hak yang sangat terbatas .
Gunakan pernyataan siap dengan variabel terikat . Mereka disediakan oleh PDO , dengan MySQLi dan dengan perpustakaan lainnya .
Periksa apakah input yang diberikan memiliki tipe data yang diharapkan . PHP memiliki berbagai fungsi masukan memvalidasi , dari yang
paling sederhana yang ditemukan di Fungsi Variabel dan Jenis Karakter
Fungsi ( misalnya is_numeric ( ) , ctype_digit ( ) masing-masing) dan
seterusnya ke Perl kompatibel Regular Expressions dukungan .
Jika aplikasi menunggu input numerik , mempertimbangkan verifikasi
data dengan ctype_digit ( ) , atau diam-diam mengubah jenisnya
menggunakan settype ( ) , atau menggunakan representasi numerik dengan
sprintf ( ) .
Contoh #
5 Cara yang lebih aman untuk menulis query untuk paging
< ? php
settype ( $ offset, ' bilangan bulat ' ) ;
$ query = " SELECT id , nama FROM produk ORDER BY nama LIMIT 20 OFFSET $ offset; " ;
/ / Perlu diketahui % d dalam format string , menggunakan % s akan berarti
$ query = sprintf ( " SELECT id , nama FROM produk ORDER BY nama LIMIT 20 OFFSET % d ; " ,
$ offset) ;
>
Jika
lapisan database tidak mendukung variabel mengikat kemudian mengutip
setiap pengguna diberikan nilai non numerik yang dilewatkan ke database
dengan fungsi string escape - database tertentu ( misalnya
mysql_real_escape_string ( ) , sqlite_escape_string ( ) , dll ) . Fungsi generik seperti addslashes ( ) hanya berguna dalam
lingkungan yang sangat spesifik ( misalnya MySQL dalam karakter
single-byte set dengan NO_BACKSLASH_ESCAPES cacat) maka akan lebih baik
untuk menghindari mereka .
Jangan mencetak informasi database apapun yang spesifik , terutama tentang skema , dengan cara yang adil atau busuk . Lihat juga Kesalahan Pelaporan dan Penanganan Kesalahan dan Fungsi Logging .
Anda dapat menggunakan prosedur yang tersimpan dan kursor
didefinisikan sebelumnya untuk mengakses data abstrak sehingga pengguna
tidak langsung mengakses tabel atau dilihat, tetapi solusi ini memiliki
dampak lain .
Selain
itu, Anda mendapatkan keuntungan dari permintaan logging baik di dalam
script atau database itu sendiri , jika mendukung logging . Jelas,
penebangan tidak dapat mencegah setiap upaya berbahaya , tetapi bisa
membantu untuk melacak kembali aplikasi yang telah dielakkan . Log tidak berguna dengan sendirinya , tetapi melalui informasi yang dikandungnya . Lebih detail umumnya lebih baik daripada kurang .
sumber : php.net
koleksi ilmu hikmah, kisahsufi,tasawuf,fengshui,maulid,desain grafis,batu akik,batu obsidian, paypal pay,za,pendanaan,RENTAL MOBIL proyek,investor,funder,kredit kpr,pinjaman multi guna ,pialang,wali amanat,SEWA MOBIL CIREBONtaxi online cirebondan lain-lain
koleksi ilmu-ilmu hikmah,kisah 2 tokoh sufi.teknologi tips n trik dll
Senin, Februari 17, 2014
Langganan:
Posting Komentar (Atom)
Tidak ada komentar:
Posting Komentar
stroom09@gmail.com