arock 2024. 8. 7. 05:00
λ°˜μ‘ν˜•

CSRFλž€?

CSRFλž€, Cross Site Request Forgery의 μ•½μžλ‘œ, μ‚¬μ΄νŠΈκ°„ μš”μ²­ μœ„μ‘°λ₯Ό λœ»ν•©λ‹ˆλ‹€. CSRFλŠ” μ‚¬μš©μžκ°€ μžμ‹ μ˜ μ˜μžμ™€λŠ” λ¬΄κ΄€ν•˜κ²Œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ ν–‰μœ„(데이터 μˆ˜μ •, μ‚­μ œ, 등둝 λ“±)을 νŠΉμ • μ›Ήμ‚¬μ΄νŠΈμ— μš”μ²­ν•˜λŠ” κ³΅κ²©μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, ν”Όν•΄μžμ˜ μ „μž 메일 μ£Όμ†Œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μ•”ν˜Έλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ 자금이체λ₯Ό ν•˜λŠ” λ“±μ˜ λ™μž‘μ„ μˆ˜ν–‰ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 또, νŠΉμ„±μ— 따라 κ³΅κ²©μžλŠ” μ‚¬μš©μžμ˜ 계정에 λŒ€ν•œ μ™„μ „ν•œ μ œμ–΄κΆŒμ„ 얻을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

  1. μ„œλ²„λŠ” 둜그인 μ‹œ 인증된 μ‚¬μš©μžμ˜ 정보λ₯Ό μ„Έμ…˜(session)에 μ €μž₯ν•˜κ³  이에 λ§€μΉ­λ˜λŠ” μ„Έμ…˜ 아이디(session ID)을 λ§Œλ“ λ‹€.
  2. μ„œλ²„λŠ” μ €μž₯된 μ„Έμ…˜ 정보λ₯Ό ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)κ°€ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„Έμ…˜ 아이디λ₯Ό Set-Cookie ν—€λ”에 λ‹΄μ•„μ„œ μ „λ‹¬ν•œλ‹€.
  3. ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)λŠ” μ „λ‹¬λœ μ„Έμ…˜ 아이디λ₯Ό 쿠킀에 μ €μž₯ν•œλ‹€.
  4. ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)λŠ” ν•΄λ‹Ή 도메인을 가진 μ„œλ²„λ‘œ μš”μ²­ μ‹œ 쿠킀에 μ €μž₯된 μ„Έμ…˜ 아이디λ₯Ό μžλ™μœΌλ‘œ μ „λ‹¬ν•œλ‹€.
  5. μ„œλ²„λŠ” 쿠킀에 λ‹΄κΈ΄ μ„Έμ…˜ 아이디λ₯Ό 톡해 인증된 μ‚¬μš©μžμΈμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•œλ‹€.

좜처 : https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

 

문제 해석

 

/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">

 

μ°Έκ³ 

 

Cross Site Request Forgery (CSRF) | OWASP Foundation

λ°˜μ‘ν˜•