본문 바로가기

웹해킹

CSRF/CORS Bypass

CSRF는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점이다.

CSRF 취약점을 방어하기 위해 CSRF Token을 사용한다.

웹 서버는 전송된 Token을 이용해 이용자로부터 요청이 온 것인지 확인할 수 있다.

<?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 토큰을 통해 공격을 방어하는 예시 코드이다.

html 소스에서는 hidden속성을 가진 태그로 토큰이 전달된다.

 

<CSRF 토큰 사용 시 주의할 점>

1. 짧은 CSRF Token

무차별 대입 공격으로 토큰을 얻을 수 없도록 길이가 충분히 길어야 한다.

2. 예측 가능한 CSRF Token

현재 시간 등을 기반으로 토큰을 생성하거나 암호학적으로 안전하기 않은 의사 난수 생성기를 이용하면 안된다.

3. CSRF Token 유출

토큰이 url의 파라미터로 넘어간다거나 하는 방식으로 유출이 되면 이를 이용당할 수 있다.

4. 긴 유효시간을 가진 CSRF Token

로그아웃을 하고 새로운 세션이 생성되도 토큰을 계속해서 사용할 수 있기 때문에

이를 이용해 악긔적인 요청을 보낼 수 있다.

 

CORS는 SOP를 우회하여 Cross Origin간 자원을 공유하기 위한 방법이다.

 

메시지를 전송할 때 대상 윈도우의 postMessage 메소드를 호출하고,

수신하는 윈도우는 message 전역 이벤트를 청취하여 메시지를 받을 수 있다.

// 메시지 송신
targetWindow.postMessage(message, targetOrigin);
// 메시지 수신
window.onmessage = function (e) {
    if (e.origin === 'https://dreamhack.io') {
        console.log(e.data);
        e.source.postMessage('Hello, world!', e.origin);
    }
}

메시지 송수신의 예시이다.

 

origin이 같은지 검사하지 않으면 공격에 이용될 수 있다.

<실제 공격 시나리오>

1. Parent Window에서 Child Window 생성

2. Child Window가 Parent Window한테 postMessage로 메시지 및 비밀 값 전송

3. Parent Window가 공격자의 다른 췝 사이트로 리다이렉트

4. Child Window는 여전히 Parent Window에게 메시지 및 비밀 값 전송

5. 리다이렉트된 공격자의 사이트에서 Child Window가 보내주는 메시지 수신

 

 

JSONP는 JSON with Padding의 줄임말이다.

응답 데이터를 특정 콜백 함수로 감싸고 요청 시 스크립트로 포함시켜 동작한다.

JSONP 요청을 처리할 때 요청자의 Origin을 검사하거나 CSRF Token을 사용해야 한다.

 

JSONP에서 콜백 함수명을 이용자가 지정할 수 있도록 하기 때문에 콜백명에 HTML 코드 등을 삽입할 수도 있다.

이를 막기 위해서는 콜백명에 필터를 적용해야 한다.

'웹해킹' 카테고리의 다른 글

Client Side Injection  (0) 2023.11.26
드림핵 CSRF Advanced 롸업  (0) 2023.11.26
드림핵 CSP Bypass Advanced 롸업  (0) 2023.11.25
드림핵 CSP Bypass 롸업  (0) 2023.11.25
Content Security Policy & CSP Bypass  (0) 2023.11.24