๐๏ธ Access
๋๋ฆผ์ด๋ ๊ฐค๋ฌ๋ฆฌ ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ธ๋ถ๋ก ์์ฒญํ๋ ๊ธฐ๋ฅ์ด ์์ ํ ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ํ๋ค์...
๊ฐค๋ฌ๋ฆฌ ์ฌ์ดํธ์์ ์ทจ์ฝ์ ์ ์ฐพ๊ณ flag๋ฅผ ํ๋ํ์ธ์!
flag๋ /flag.txt์ ์์ต๋๋ค.
๐พ Exploit Algorithm & Payload
> app.py
from flask import Flask, request, render_template, url_for, redirect
from urllib.request import urlopen
import base64, os
app = Flask(__name__)
app.secret_key = os.urandom(32)
mini_database = []
@app.route('/')
def index():
return redirect(url_for('view'))
@app.route('/request')
def url_request():
url = request.args.get('url', '').lower()
title = request.args.get('title', '')
if url == '' or url.startswith("file://") or "flag" in url or title == '':
return render_template('request.html')
try:
data = urlopen(url).read()
mini_database.append({title: base64.b64encode(data).decode('utf-8')})
return redirect(url_for('view'))
except:
return render_template("request.html")
@app.route('/view')
def view():
return render_template('view.html', img_list=mini_database)
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
f = request.files['file']
title = request.form.get('title', '')
if not f or title == '':
return render_template('upload.html')
en_data = base64.b64encode(f.read()).decode('utf-8')
mini_database.append({title: en_data})
return redirect(url_for('view'))
else:
return render_template('upload.html')
if __name__ == "__main__":
img_list = [
{'์ด๋ก์ ์ ๊ธ๋ผ์ค': "static/assetA#03.jpg"},
{'๋ถํ์ ์ ๊ธ๋ผ์ค': "static/assetB#03.jpg"},
{'๋ณด๋ผ์ ์ ๊ธ๋ผ์ค': "static/assetC#03.jpg"},
{'ํ๋์ ์ ๊ธ๋ผ์ค': "static/assetD#03.jpg"}
]
for img in img_list:
for k, v in img.items():
data = open(v, 'rb').read()
mini_database.append({k: base64.b64encode(data).decode('utf-8')})
app.run(host="0.0.0.0", port=80, debug=False)
#1
: '/' ํ์ด์ง๋ '/view' ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ์ ๋จ์ ํ์ธํ ์ ์๋ค.
: '/view' ํ์ด์ง์์๋ ์ฌ์ง์ด 4๊ฐ์ง ์์์ ํ์ธํ ์ ์๋ค.
: '/request' ํ์ด์ง๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ์๋ URL, ์ด๋ฏธ์ง ์ ๋ชฉ์ด๋ผ๋ ๊ฒ์ ํ์ฉํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์์ ์ ์ถํ ์ ์๋ค.
: ํด๋น ๊ฐ์ ์ ๋ ฅํ๋ฉด GETํํ๋ก /request?url=&title= ์ด๋ผ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋์ํจ์ ํ์ธํ ์ ์๋ค.
: ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์ดํ๋ค. ์ฌ์ฉ์๊ฐ URL์ ๋ด์ฉ์ ๊ฐ์ ธ์ base64๋ก ์ธ์ฝ๋ฉํ๊ณ mini_database์ ์ ์ฅํจ์ ์ ์ ์๋ค. ๋จ, URL์ด ๋น์ด์๊ฑฐ๋, "file://"๋ก ์์ํ๊ฑฐ๋, "flag"๋ผ๋ ๋ฌธ์์ด์ด ํฌํจ๋ ๊ฒฝ์ฐ๋ ์ฒ๋ฆฌํ์ง ์์์ ์ ์ ์๋ค.
: '/upload' ํ์ด์ง๋ ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ๋ก๋ํ๋ฉด ํด๋น ํ์ผ์ด ์ ๋ก๋๋จ์ ์ ์ถํ ์ ์๋ค.
: ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์ดํ๋ค. ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ๋ก๋ํ๋ฉด ํด๋น ํ์ผ์ ๋ด์ฉ์ base64๋ก ์ธ์ฝ๋ฉํ๊ณ mini_database์ ์ ์ฅํจ์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ '/view' ํ์ด์ง์์ ํ์ธํ ์ ์๋ค.
: '/request' ๊ฒฝ๋ก์์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ URL์ ์ด์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ด ์๋๋ฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์๋ฒ ๋ด๋ถ ๋คํธ์ํฌ์ URL์ ์ ๋ ฅํ๋ฉฐ, ์๋ฒ๊ฐ ๊ทธ URL๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋์ด์ ๋ด๋ถ ๋คํธ์ํฌ์ ์ ๊ทผํ๊ฒ ๋ ์ ์๋ค.
: ์ด๋ SSRF ์ทจ์ฝ์ ์ ์ ๋ฐํ ๊ฒ์ผ๋ก ์์๋๋ค.
: ์ถ๊ฐ๋ก ์ฝ๋์์ URL์ด "file://'๋ก ์์ํ๊ฑฐ๋ '/flag' ๋ฌธ์์ด์ด ์์ ๊ฒฝ์ฐ ๊ณต๋ฐฑ์ฒ๋ฆฌ ํ์ง๋ง ์ถฉ๋ถํ ์ฐํํ ์ ์์ ๊ฒ์ผ๋ก ํ๋จ๋๋ค.
#2
: ์ฐ์ ๊ฐค๋ฌ๋ฆฌ ๋ทฐ์ด์์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12)๋ก ํด๋น ์ฌ์ง ๋ด์ฉ์ ํ์ธํ์ ๋, base64๋ก ์ธ์ฝ๋ฉ๋์ด ์์์ ์ ์ ์๋ค.
: ์ค๋น๋์ด ์๋ cmd ํ์ผ์ ์ ๋ก๋ ํด๋ดค๋๋ ๊ฐค๋ฌ๋ฆฌ ๋ทฐ์ด์์ ํ์ผ ๋ด์ฉ์ด encoding๋ ๊ฐ์ผ๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.
: ์ด๋ฅผ ๋์ฝ๋ฉ ์์ผฐ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ผ ๋ด์ฉ์ด ๊ทธ๋๋ก ๋๋ฌ๋ฌ๋ค.
#3
: ์ ๊ฒฐ๊ณผ๋ค์ ์ข ํฉ์ ์ผ๋ก ๋ถ์ํ์๋, ์๋ฒ ๋ด๋ถ ๋คํธ์ํฌ์ URL์ ์ ๋ ฅํ๊ณ ์๋ฒ๊ฐ ๊ทธ URL๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋์ด์ ๋ด๋ถ์ ํ์ผ์ธ /flag.txt๋ฅผ ์์ฒญํ๊ณ base64์ธ์ฝ๋ฉ๋ ํ์ผ ๋ด์ฉ์ ๋์ฝ๋ฉํ๋ฉด FLAG๋ฅผ ํ๋ํ ์ ์์ ๊ฒ์ด๋ค.
file:// -> file:/// , file:///, ...
flag -> fl%2561g, fla%2567, ...
/request?url=file:/fla%2567.txt&title=flag1
...
: ๋ค์๊ณผ ๊ฐ์ด ์ฐํํด์ GET ๋ฐฉ์์ผ๋ก ์ ์กํด์ค๋ค.
๐Analysis and results for obtaining the Flag DH{…}
: ๊ฐค๋ฌ๋ฆฌ ๋ทฐ์ด์์ ์ธ์ฝ๋ฉ๋ ํ์ผ ๋ด์ฉ์ ํ์ธํ๊ณ ๋์ฝ๋ฉํ๋ฉด FLAG๋ฅผ ํ๋ํ ์ ์๋ค.
๐Summary
SSRF(Server-Side Rquest Forgery)๋ ๊ณต๊ฒฉ์๊ฐ ์๋ฒ๋ฅผ ์กฐ์ํ์ฌ ๋ด๋ถ ์์คํ ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ณต๊ฒฉ. ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ํตํด ๋ด๋ถ ์์คํ ์ ์ ๊ทผํ๊ฑฐ๋, ๋ด๋ถ ์์คํ ์ ์ ๋ณด๋ฅผ ๋ ธ์ถ์ํฌ ์ ์์.
-๋์๋ฐฉ์-
- ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ
- ์ถ๋ ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ๋ด๋ถ ๋คํธ์ํฌ์ ๋ํ ์์ฒญ ์ฐจ๋จ
- ์ต์ ๊ถํ ์์น ์ ์ฉ
...
'[Dreamhack]WebHacking > Wargame&CTF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level4: KeyCat (0) | 2024.02.23 |
---|---|
[Dreamhack] Level1:Beginner blue-whale (1) | 2024.02.07 |
[Dreamhack] Level2: filestorage (0) | 2024.02.02 |
[Dreamhack] Level1: Type c-j (2) | 2024.02.02 |
[Dreamhack] Level1: baby-union (2) | 2024.02.02 |