[Dream Hack - Web] csrf-1
CSRFλ?
CSRFλ, Cross Site Request Forgeryμ μ½μλ‘, μ¬μ΄νΈκ° μμ² μμ‘°λ₯Ό λ»ν©λλ€. CSRFλ μ¬μ©μκ° μμ μ μμμλ 무κ΄νκ² κ³΅κ²©μκ° μλν νμ(λ°μ΄ν° μμ , μμ , λ±λ‘ λ±)μ νΉμ μΉμ¬μ΄νΈμ μμ²νλ 곡격μ λλ€.
μλ₯Ό λ€μ΄, νΌν΄μμ μ μ λ©μΌ μ£Όμλ₯Ό λ³κ²½νκ±°λ μνΈλ₯Ό λ³κ²½νκ±°λ μκΈμ΄μ²΄λ₯Ό νλ λ±μ λμμ μννκ² ν μ μμ΅λλ€. λ, νΉμ±μ λ°λΌ 곡격μλ μ¬μ©μμ κ³μ μ λν μμ ν μ μ΄κΆμ μ»μ μλ μμ΅λλ€.
- μλ²λ λ‘κ·ΈμΈ μ μΈμ¦λ μ¬μ©μμ μ 보λ₯Ό μΈμ (session)μ μ μ₯νκ³ μ΄μ 맀μΉλλ μΈμ μμ΄λ(session ID)μ λ§λ λ€.
- μλ²λ μ μ₯λ μΈμ μ 보λ₯Ό ν΄λΌμ΄μΈνΈ(λΈλΌμ°μ )κ° μ¬μ©ν μ μλλ‘ μΈμ μμ΄λλ₯Ό Set-Cookie ν€λμ λ΄μμ μ λ¬νλ€.
- ν΄λΌμ΄μΈνΈ(λΈλΌμ°μ )λ μ λ¬λ μΈμ μμ΄λλ₯Ό μΏ ν€μ μ μ₯νλ€.
- ν΄λΌμ΄μΈνΈ(λΈλΌμ°μ )λ ν΄λΉ λλ©μΈμ κ°μ§ μλ²λ‘ μμ² μ μΏ ν€μ μ μ₯λ μΈμ μμ΄λλ₯Ό μλμΌλ‘ μ λ¬νλ€.
- μλ²λ μΏ ν€μ λ΄κΈ΄ μΈμ μμ΄λλ₯Ό ν΅ν΄ μΈμ¦λ μ¬μ©μμΈμ§ μ¬λΆλ₯Ό νμΈνλ€.
λ¬Έμ ν΄μ
/vuln νμ΄μ§
xss_filterμ ν¬ν¨λ λ¨μ΄λ “*”λ‘ λ체λκ³ μμ΄μ, <script>alert(1)</script> λλ <svg/onload=alert(1)/> κ³Ό κ°μ μ½λκ° μ€νλμ§ λͺ»νλ€.
@app.route("/vuln")
def vuln():
param = request.args.get("param", "").lower()
xss_filter = ["frame", "script", "on"]
for _ in xss_filter:
param = param.replace(_, "*")
return param
/admin/notice_flag
@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\\n"
return "Ok"
/admin/notice_flag λ₯Ό 1. λ‘컬 νΈμ€νΈ νκ²½μμ 2.userid=admin νλΌλ―Έν°λ‘ μμ²μ νλ©΄ memoμ flag κ°μ΄ μΆλ ₯λλ κ²μ νμΈν μ μλ€.
λ¬Έμ νμ΄
/flag νμ΄μ§μμ param κ°λ§ μ‘°μν μ μμΌλ―λ‘ /admin/notice_flag νμ΄μ§ μ μμΌλ‘ μ λν΄μΌ νλ€. λ¨μ μΉ νμ΄μ§μ μ μνλ μ½λλ§ μ€νμν€λ €λ©΄ img νκ·Έλ₯Ό μ¬μ©ν μ μλ€. img νκ·Έλ src λ§ν¬μ μ΄λ―Έμ§λ₯Ό λΆλ¬μ€λ €λ μλλ₯Ό νκΈ° λλ¬Έμ /admin/notice_flag?userid=admin νμ΄μ§λ‘ μ μνκ² λλ€.
<img src="/admin/notice_flag?userid=admin">
μ°Έκ³