βοΈ Web Hacking/Dreamhack
[Dreamhack] Session λλ¦Όν΅ μκ²μ λ¬Έμ νμ΄
A Lim Han
2023. 8. 12. 12:04
ποΈ Session λλ¦Όν΅ μκ²μ λ¬Έμ νμ΄
1. λ¬Έμ μ λν μ€λͺ μ μ½μ ν λ¬Έμ νμΌ λ€μ΄λ‘λ
2. λ€μ΄λ°μ app.py νμΌ μ€ν ν μ½λ λΆμ
#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
app = Flask(__name__)
try:
FLAG = open('./flag.txt', 'r').read()
except:
FLAG = '[**FLAG**]'
μ½λ | μ€λͺ |
from flask import Flask, request, render_template, make_response, redirect, url_for |
μΉ μλ² μμ±, μμ² μ²λ¦¬, ν
νλ¦Ώ λ λλ§ λ±μ νμν λͺ¨λ κ°μ Έμ€κΈ° |
app = Flask(__name__) | Flask μ ν리μΌμ΄μ μμ± |
FLAG = open('./flag.txt', 'r').read() | νμΌμ μ΄μ΄ FLAG κ° μ½μ΄μ€κΈ° |
except | νμΌμ μ°Ύμ§ λͺ»ν κ²½μ° κΈ°λ³Έκ°μΈ FLAG μ¬μ© |
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
session_storage = {
}
μ½λ | μ€λͺ |
users = {...} | μ¬μ©μλͺ κ³Ό ν¨μ€μλ μ 보λ₯Ό λμ λλ¦¬λ‘ μ μ₯ |
session_storage = {...} | μ¬μ©μ μΈμ
μ 보λ₯Ό λμ
λλ¦¬λ‘ μ μ₯νκ³ , μΈμ
IDμ μ¬μ©μλͺ μ 맀ννμ¬ λ‘κ·ΈμΈλ μ¬μ©μ μΆμ |
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html')
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
μ½λ | μ€λͺ |
@app.route('/') | μΉ μ΄ν리μΌμ΄μ μ Root κ²½λ‘μ λν νΈλ€λ¬ μ μ |
index() | μΈλ±μ€ νμ΄μ§ λ°ν ν¨μ (λ‘κ·ΈμΈλ μ¬μ©μκ° κ΄λ¦¬μμΈ κ²½μ° FLAG νμ) |
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
try:
pw = users[username]
except:
return '<script>alert("not found user");history.go(-1);</script>'
if pw == password:
resp = make_response(redirect(url_for('index')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
return '<script>alert("wrong password");history.go(-1);</script>'
μ½λ | μ€λͺ |
@app.route('/login', methods=['GET', 'POST']) | λ‘κ·ΈμΈ κ²½λ‘μ λν νΈλ€λ¬ μ μ A) GET λ°©μ μμ² --> Login νμ΄μ§ λ λλ§ B) POST λ°©μ μμ² --> μ¬μ©μ μΈμ¦ μ²λ¦¬ |
login() | λ‘κ·ΈμΈ μ²λ¦¬λ₯Ό μννλ ν¨μ (λ‘κ·ΈμΈ μ±κ³΅ μ μΈμ μμ± λ° index νμ΄μ§λ‘ μ¬μ°κ²°) |
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
μ½λ | μ€λͺ |
if __name__ == '__main__': | μ€ν¬λ¦½νΈκ° μ§μ μ€νλλ κ²½μ°, νλ¨μ μ½λ μ€ν |
session_storage[os.urandom(1).hex()] = 'admin' | μ΄κΈ° κ΄λ¦¬μ μΈμ
μ€μ μ μν΄ Session μ μ₯μμ admin μ¬μ©μ μΆκ° |
app.run(host='0.0.0.0', port=8000) | μΉ μλ² μ€ν |
3. λ€μ λ¬Έμ νμ΄μ§λ‘ λμμ μλ² μμ±
4. λ²ν μ€μνΈ(Burp Suite)λ₯Ό μ€νν ν, μμ±λ λ§ν¬λ₯Ό λΈλΌμ°μ λ‘ μ΄κΈ°
++ Burp Suite λΈλΌμ°μ λ₯Ό ν΅ν μΉ νμ΄μ§ μ μ
--> https://alim11.tistory.com/203
[Burp Suite] λ²νμ€μνΈμμ νλ‘μ μλ² μ°μ§ μκ³ μΉ νμ΄μ§ μ¬λ λ²
# λ²ν μ€μνΈμμ νλ‘μ μλ²λ₯Ό μ‘°μνμ§ μκ³ μΉ νμ΄μ§μ μ μνλ λ² 1. λ²ν μ€μνΈλ₯Ό μ€νμν¨λ€. 2. Proxy ν ν΄λ¦ ν OptionsλμΌλ‘ μ΄λ 3. Optionsλμμ μ΅μ μ€μ μ μλμ κ°μ΄ μ€μ νλ€. (
alim11.tistory.com
5. Login νμ΄μ§λ‘ μ΄λν ν, μλμ κ°μ΄ μ λ ₯νμ¬ guestλ‘ λ‘κ·ΈμΈ
6. λ€μ λ²ν μ€μνΈ(Burp Suite)λ‘ λμμ, μ΅μλ¨μ History ν΄λ¦
7. λ§μ°μ€ μ°μΈ‘ λ²νΌμ λλ₯΄κ³ , Send to Intruder ν΄λ¦
8. μλ¨μ Intruder νμΌλ‘ μ΄λ ν, Positions & Payloads λ₯Ό μλμ κ°μ΄ μ€μ
곡격 νμμ Sniper
곡격ν Target νμΈ
(νκΉμ μ΄μ μ μμ±ν λ§ν¬μ λμΌν΄μΌ ν¨)
Payload setλ 1, νμ μ Brute forcer
Character set μ a ~ e & 1 ~ 9
+
Min & Max lengthλ λͺ¨λ 2 λ‘ μ€μ
9. Start Attack ν΄λ¦ ν, κΈΈμ΄κ° λ€λ₯Έ ν¨ν·μ΄ λνλ λκΉμ§ λκΈ°
10. κΈΈμ΄κ° λ€λ₯Έ 97λ² ν¨ν·μ Sesson ID νμΈ
97λ² ν¨ν·μ Sesson IDλ a0
11. λ€μ μμ±ν λ§ν¬λ‘ λμμ κ°λ°μ λꡬ μ€ν
12. κ°λ°μ λꡬμ Applicaton νμΌλ‘ μ΄λ ν Sesson Storage ν΄λ¦
13. guest μ Session IDλ₯Ό 10λ²μμ μ°Ύμ IDλ‘ λ³κ²½
14. κ°λ°μ λꡬλ₯Ό λ«κ³ νμ΄μ§ μλ‘κ³ μΉ¨ --> FLAGκ° μΆλ ₯λ¨μ νμΈ