CSRF Token
대표적으로 사용하는 CSRF방어 기법이다. CSRF Token은 같은 오리진에서만 접근이 가능한 형태로 특정 Token을 저장하고 HTTP요청을 전송할 때 함께 전송한다. 웹서버는 전송된 Token으로 제 삼자가 아닌 이용자에게 요청이 왔다는 걸 인증할 수 있다.
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 사용 시 주의해야 할 점
1.CSRF Token의 길이가 외부자가 예측할 수 없을 만큼 길어야 한다.
2.공격자가 예측할 수 없는 Token을 생성하거나, 충분히 안정성이 보장된 난수 생성기를 사용해야 한다.
3.CSRF Token이 제공하는 보안은 공격자가 Token을 모르는 것을 전제로 하기에 유출되면 안된다.
4.유효시간이 짧아야 한다.
Q1. CSRF Token 을 생성하기 위한 수단으로 적절한 것은?
A. CSPRNG(Cryptographically-secure pseudorandom number generator)
A. 무차별 대입 공격 (Brute-force attack)으로 Token을 획득할 수 있음
CORS Vulnerability
postMessage 취약점
Window.postMessage API
targetWindow.postMessage(message, targetOrigin, [transfer])
변수 | 설명 |
targetWindows | 메세지를 보낼 대상 window |
message | 메세지 객체(함수, DOM 객체 등은 보낼 수 없음) |
targetOrigin | 메세지 송신 시점에 targetWindows의 Origin이 targetOrigin과 일치하여야함, targetOrigin에 "*"을 지정하면 Origin검사 x |
transfer | 선택사항이다 |
MessageEvent
고유속성 | 설명 |
origin | 메세지를 송신한 Orgin반환 |
source | 메세지를 송신한 Window 객체 반환 |
date | 복사된 메세지 객체 또는 값 반환 |
Origin 전환 경합 조건
메세지를 보내는 대상이 웹 문서가 아닌 창(윈도우)라는 걸 기억해야 한다.
웹 문서:일반적으로 출처가 고정됨
창:사용자가 하이퍼링크를 방문하거나 스크립트가 다른 문서로 리다이렉트시켜 Origin이 변경될 수 있다. ->이 상태에서 메세지를 보낼 시 보안 문제 발생 가능성 있음
postMessage의 두 번째 매개변수인 targetOrigin에 대상 Origin 문자열을 명시하면 문제 해결 가능
"*"를 지정하는 것은 targetWindow의 Origin이 무엇이든 상관없이 메세지가 보내지므로 권장x
공격 시나리오는 다음과 같다
JSONP 취약점
JSONP
JSON with Padding의 준말이다.
Origin 검사 부재로 인한 CSRF
CSRF 공격에 노출되어 정보가 유출될 수 있다. 이를 방지하기 위해 JSONP 요청을 처리할 때 요청자의 Origin을 검사하거나, CSRF Token을 사용할 수 있다.
콜백 함수명 검증 부재로 인한 제공자 XSS
JSONP API 대다수는 사용자가 콜백 함수명을 직접 지정할 수 있도록 한다. 콜백명에 HTML코드 등을 삽입하면 브라우저는 이를 HTML로 인식할 수 있으며, XSS취약점이 발생하게 된다. 이런 공격을 방지하기 위해서는 콜백명에 필터를 적용하는 게 좋다.
JSONP API 침해 사고 발생 시 이용자 XSS
JSONP는 API제공자의 코드를 그대로 사용자의 웹 문서에서 실행한다. 만약 JSONP는 API 가 침해사고를 당해서 악의적인 응답이 돌아온다면, 이를 이용하는 모든 사이트가 XSS공격에 노출된다. 그렇기에 CORS정책 헤더를 대신 사용한다.
A. 진현: myFunc으로 주어지는 함수가 악의적인 행동을 하지 못하게 서버에서 체크하는 것도 좋은 방법이겠군!, 민교: origin을 검사하기 때문에 크게 문제 될 일은 없군!
Q2.CORS는 무엇의 약자인가?
A.Cross-origin Resource Sharing
'웹해킹' 카테고리의 다른 글
2025년 1학기 6주차 웹해킹(드림핵) (2) | 2025.05.10 |
---|---|
2025년 1학기 6주차 웹해킹(natas) (0) | 2025.05.09 |
2025년 1학기 5주차 웹해킹(natas) (1) | 2025.05.01 |
2025년 1학기 웹해킹 4주차(드림핵) (0) | 2025.04.06 |
2025 1학기 4주차 웹해킹(natas) (1) | 2025.04.06 |