1. 서론
Cross Site Request Forgery(CSRF)는
임의 사용자의 권한으로 임의 주소에
HTTP 요청을 보내는 취약점이다.
CSRF Token은
CSRF 취약점을 방어하기 위해 사용한다.
2. CSRF Token
같은 오리진에서만 접근 가능한 형태로
Token을 저장해두고,
HTTP 요청을 전송할 때
함께 전송한다.
웹 서버는 전송된 Token을 이용하여
제삼자가 아닌 이용자로부터
요청이 왔다는 것을 인증할 수 있다.
CSRF Token은 보통
HTML form 태그의
hidden 속성에 입력되거나,
동적 요청에서도
사용될 수 있다.
CSRF Token은
추가적인 사용자 상호작용이
불필요하다는 장점을 가지고 있다.
반면에
XMLHttpRequest나 Fetch API 등을 통해
Authorization과 같은 이용자 인증 헤더를 설정하여
통신하는 것에 비해 여러 가지 보안 문제의 원인이 되고는 한다.
Figure 1. CSRF 탐지 예시 코드
<?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 토큰을 저장하고,
HTTP 요청을 통해 전송된 CSRF Token과
세션에 저장된 Token이 같은지 확인하며
CSRF 공격을 탐지
2-1 짧은 CSRF Token
외부자가 예측할 수 없도록 설계해야 하기 때문에
무차별 대입 공격(Brute-force attack)으로
Token을 획득할 수 없도록
Token의 길이가 충분히 길어야 한다.
2-2 예측 가능한 CSRF Token (PRNG 등)
Token의 길이가 충분히 길어도
추측 가능한 데이터 (현재 시간 등)를 기반으로
Token을 생성하거나,
암호학적으로 안전하지 않은
의사 난수 생성기(Pseudorandom Number Generator, PRNG)를 사용해
Token을 생성해서는 안된다.
예측할 수 없는 값을 이용하거나
충분한 안전성이 보장된
난수 생성기(Cryptographically-secure pseudorandom number generator, CSPRNG)를
사용해서 Token을 생성해야 한다.
2-3 CSRF Token 유출
Token이 다른 기타 경로로
제삼자에게 노출되지 않도록 주의해야 한다.
예를 들어,
CSRF Token이
URL의 쿼리 파라미터로 넘겨지게 되면,
이후 다른 링크를 방문하였을 때
Referer 헤더에 Token이 그대로 노출되고,
이를 이용해 Token을 획득할 수 있다.
'드림핵 - WHA(Client Side)' 카테고리의 다른 글
Client Side Template Injection (0) | 2023.04.18 |
---|---|
CORS Vulnerability (0) | 2023.04.17 |
CSP Bypass (0) | 2023.04.13 |
Content Security Policy (0) | 2023.04.13 |
XSS Filtering Bypass - II (0) | 2023.03.27 |