서론
Cross Site Request Forgery (CSRF)는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점이다. CSRF 공격의 피해자는 자신의 의지와는 무관하게 의도한 행위를 특정 웹 사이트에 요청하게 된다.
일반적으로 CSRF 취약점을 방어하기 위해 CSRF Token을 사용한다.
CSRF Token
CSRF Token은 같은 오리진에서만 접근 가능한 형태로 특정 Token을 저장해두고, HTTP 요청을 전송할 때 함께 전송한다. 웹 서버는 전송된 Token을 이용하여 제삼자가 아닌 이용자로부터 요청이 왔다는 것을 인증할 수 있으며, 보통 HTML form 태그의 hidden 속성에 입력되거나, 동적 요청에서도 사용될 수 있다.
<?php
if (!isset($_SESSION["csrftoken"])) {
$csrftoken = bin2hex(random_bytes(32));
$_SESSION["csrftoken"] = $csrftoken;
} else {
$csrftoken = $_SESSION["csrftoken"];
}
$method = $_SERVER["HTTP_METHOD"];
if ($method !== "GET" && $method !== "HEAD") {
if (!isset($_POST["csrftoken"]) ||
!hash_equals($csrftoken, $_POST["csrftoken"]) {
header("HTTP/1.1 403 Forbidden");
die("CSRF detected");
}
echo "Input value: ";
echo htmlentities($_POST["query"], ENT_QUOTES|ENT_HTML5, 'utf-8');
}
?>
<form action="" method="POST">
<input name="csrftoken" type="hidden" value="<?=htmlentities($csrftoken, ENT_QUOTES|ENT_HTML5, 'utf-8'); ?>">
<input name="query" type="text" />
<input type="submit" />
</form>
위의 코드는 세션에 CSRF Token을 저장하고, HTTP 요청을 통해 전송된 CSRF Token과 세션에 저장된 Token이 같은지 확인하여 CSRF 공격을 탐지한다.
CSRF Token 방식은 캡챠나 암호화 방식과 달리 추가적인 사용자 상호작용이 불필요하다는 장점을 가지고 있다. 반면에 XMLHttpRequest나 Fetch API 등을 통해 Authorization과 같은 이용자 인증 헤더를 설정하여 통신하는 것에 비해 여러 가지 보안 문제의 원인이 되곤 한다.
CSRF Token 사용 시 주의해야 할 점
짧은 CSRF Token
CSRF Token 은 외부자가 예측할 수 없도록 설계해야 하므로, 공격자가 무차별 대입 공격(Brute-force attack)으로 Token을 획득할 수 없도록 Token의 길이가 충분히 길어야 한다.
예측 가능한 CSRF Token (PRNG 등)
Token의 길이가 충분하여도 공격자가 추측 가능한 데이터 (예: 현재 시간 등)를 기반으로 Token을 생성하거나, 암호학적으로 안전하지 않은 의사 난수 생성기를 사용해 Token을 생성해서는 안됨.
이를 방어하기 위해 공격자가 예측할 수 없는 값을 이용해 Token을 생성하거나, 충분히 안전성이 보장된 난수 생성기를 사용하여야 예측 공격을 방지할 수 있다.
CSRF Token 유출
CSRF Token이 제공하는 보안은 공격자가 Token을 알지 못함을 전제로 하기 때문에, Token이 기타 다른 경로로 제삼자에게 노출되지 않도록 주의하여야 한다.
긴 유효시간을 가진 CSRF Token
CSRF Token이 오래 유효한 경우, 사용자가 로그아웃을 하고 난 뒤 새로운 세션이 생성되어도 토큰을 계속해서 사용할 수 있기 때문에 공격자는 이를 이용해 악의적인 요청을 보낼 수 있다.
'웹해킹 > 개념' 카테고리의 다른 글
| [Dreamhack-web] Exploit Tech: CSS Injection (1) | 2024.12.11 |
|---|---|
| [Dreamhack-web] Exploit Tech: Client Side Template Injection (1) | 2024.12.11 |
| [Dreamhack-web] Exploit Tech: CORS vulnerability (1) | 2024.12.10 |
| [Dreamhack-web] Cookie & Session (5) | 2024.12.09 |
| [Dreamhack-Web] Background - Web (4) | 2024.12.09 |