Cross-site request forgery (CSRF)
π What is CSRF?
CSRFλ μμ μ΄μ©μμ κΆνμΌλ‘ μμ μ£Όμμ HTTP μμ²μ λ³΄λΌ μ μλ μ·¨μ½μ μ
λλ€.
CSRF 곡격μ νΌν΄μλ μμ μ μμ§μλ 무κ΄νκ² κ³΅κ²©μκ° μλν νμλ₯Ό νΉμ μΉ μ¬μ΄νΈμ μμ²νκ² λ©λλ€. CSRF 곡격μ νΌν΄μλ μλμΉ μμ μμ²μ ν΅ν΄ μμ λΉλ°λ²νΈ λ³κ²½, κ²μκΈ λ±λ‘ λ° μμ , μμ λ©μμ§ μ μ‘ λ± HTTP μμ²μΌλ‘ μ΄λ£¨μ΄μ§λ νμμ λν΄ μΈμ§νμ§ λͺ»ν μ± νΌν΄λ₯Ό λΉν μ μμ΅λλ€.
μΌλ°μ μΌλ‘ CSRF μ·¨μ½μ μ λ°©μ΄νκΈ° μν΄ CSRF Token μ μ¬μ©ν©λλ€.
CSRF Tokenμ κ°μ μ€λ¦¬μ§μμλ§ μ κ·Ό κ°λ₯ν ννλ‘ νΉμ Tokenμ μ μ₯ν΄λκ³ , HTTP μμ²μ μ μ‘ν λ ν¨κ» μ μ‘ν©λλ€.
μΉ μλ²λ μ μ‘λ Tokenμ μ΄μ©νμ¬ μ 3μκ° μλ μ΄μ©μλ‘λΆν° μμ²μ΄ μλ€λ κ²μ νμΈν μ μμ΅λλ€.
CSRF Tokenκ°μ λ³΄ν΅ HTML form νκ·Έμ hidden μμ±μ μ
λ ₯λκ±°λ, λμ μμ²μμλ μ¬μ©λ μ μμ΅λλ€.
CSRF κ³΅κ²©μ΄ κ°λ₯νλ €λ©΄ 3κ°μ§ μ£Όμ μ‘°κ±΄μ΄ μΆ©μ‘±λμ΄μΌν©λλ€.
1. A relevant action : 곡격μκ° μ¬μ©μλ₯Ό μ λν μ μλ μμ²μ΄ μμ΄ν©λλ€(μ¬μ©μ κΆνμμ , μμ μ ν¨μ€μλ λ³κ²½ λ±)
2. Cookie-based session handling : μ ν리μΌμ΄μ
μ μΈμ
μΏ ν€μλ§ μμ‘΄νμ¬ μμ²ν μ¬μ©μλ₯Ό μλ³νμ¬μΌ ν©λλ€.
3. No unpredictable request parameters : μμ
μ μννλ μμ² νλΌλ―Έν°μμ 곡격μκ° μΆμΈ‘ν μ μλ κ°μ κ°μ§ λ§€κ°λ³μκ° ν¬ν¨λμ§ μμμΌ ν©λλ€. (ν¨μ€μλ λ³κ²½ μ κΈ°μ‘΄μ μνΈκ°μ μμμΌ ν κ²½μ° μ·¨μ½νμ§ μμ)
μ΄λ©μΌ μ£Όμ λ³κ²½ μ μ·¨μ½ν HTTP μμ²μ λλ€.
POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE
email=wiener@normal-user.com
ν΄λΉ μμ²μ κ³΅κ²©μ΄ κ°λ₯ν CSRF POC μ½λμ λλ€.(SameSite μΏ ν€κ° μ¬μ©λμ§ μλλ€κ³ κ°μ )
<html>
<body>
<form action="https://vulnerable-website.com/email/change" method="POST">
<input type="hidden" name="email" value="pwned@evil-user.net" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
CSRF vulnerability with no defenses
μ΄λ©μΌ λ³κ²½ μ CSRFμ λν μλ¬΄λ° λμμ΄ μμ΄ κ³΅κ²©μ΄ κ°λ₯ν μ·¨μ½μ μ λλ€.
μ΄λ©μΌ λ³κ²½ μμ²μμ Generate CSRF POCλ₯Ό μ¬μ©νμ¬ κ³΅κ²©μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
μ¬μ©μκ° κ³΅κ²©μ½λκ° μ½μ λ νμ΄μ§ μ μμ μλμΌλ‘ μ μΆμ ν μ μλ μ½λλ₯Ό κ°μ΄ μμ±νμ¬ μ€λλ€
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://acd71ffa1ece7aa8c0b41bfe0040007f.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="test@gmail.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
HTML μ½μ μ΄ κ°λ₯ν νμ΄μ§μ ν΄λΉ 곡격μ½λλ₯Ό μ½μ ν μ¬μ©μκ° μ μ μ μλμΌλ‘ 곡격μκ° μ λ ₯ν μ΄λ©μΌλ‘ λ³κ²½μ΄ λ©λλ€
CSRF where token validation depends on request method
CSRF Tokenμ μ¬μ©ν΄ CSRFλ₯Ό λμνκ³ μμ§λ§ GET λ©μλμμλ λμνμ§ μμ μ°νκ°λ₯ν μ·¨μ½μ μ λλ€.
μμμ CSRF Token κ°μ λ³κ²½νμ¬ μμ² μ CSRFν ν°μ΄ λ§μ§ μλ€λ μλ¬λ©μμ§κ° λ ΈμΆλ©λλ€.
λ©μλλ₯Ό POSTμμ GEtμΌλ‘ λ³κ²½νμ¬ λμΌν λ΄μ©μ μ μ‘ μ μλ CSRF ν ν°μ μΈμ¦νμ§ μκ³ μμ²μ΄ μ μ‘λ©λλ€.
GET λ°©μμ μμ²μμ POC μ½λλ₯Ό μμ±νμ¬ κ³΅κ²© μ μ°νκ° λλ μ·¨μ½μ μ λλ€.
CSRF where token validation depends on token being present
CSRF ν ν°μΌλ‘ λμνκ³ μμ§λ§ νλΌλ―Έν° μ μ‘ μ CSRFν ν°μ μμ νμ¬ μ°ννλ μ·¨μ½μ μ λλ€.
νλΌλ―Έν° μ μ‘ μ csrf ν ν°μ μμ νκ³ μ μ‘ μ μΈμ¦μ κ±°μΉμ§ μκ³ μ°ν κ°λ₯
ν΄λΉ μμ²μ POCμ½λ μμ±
CSRF where token is not tied to user session
μν¬λ¦Ώμ°½μ μ¬μ©νμ¬ λ€λ₯Έκ³μ μμ CSRFν ν°μ λ°κΈ ν 곡격 μ λ€λ₯Έκ³μ μμ λ°κΈλ°μ CSRFν ν°μ μ¬μ©νμ¬ μ°νκ° κ°λ₯ν μ·¨μ½μ μ λλ€.
wiener κ³μ μμ μ΄λ©μΌ λ³κ²½ μμ²μ νμ¬ CSRF ν ν°μ λ°κΈλ°μ ν DROPμΌλ‘ ν¨ν·μ μ μ‘νμ§ μκ³ λλμμΌ μ€λλ€
κ·Έ ν carlos κ³μ μμ μ΄λ©μΌ λ³κ²½ μ λ°κΈλ°μ CSRFν ν°μ΄ μλ wiener κ³μ μμ λ°κΈλ°μ CSRF ν ν°μΌλ‘ λ³κ²½ ν κ°μ μ μ‘ μ μΈμ¦μ κ±°μΉμ§ μκ³ ν΄λΉ CSRFν ν°μ΄ μ¬μ©λ©λλ€
μμ λμΌν λ°©μμΌλ‘ CSRF곡격μ½λ μμ±μ΄ κ°λ₯ν©λλ€