본문 바로가기

웹해킹

2025년 1학기 5주차 웹해킹(드림핵)

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)

 

Q2. 길이가 짧은 CSRF Token을 사용하면 안되는 이유로 적절한 것은?

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