본문 바로가기

Security

[Webhacking] [client-side advanced] CSRF

반응형

잘못된 CSRF Token 생성

CSRF 방어 중 CSRF Token은 같은 Origin에서만 접근 가능한 형태로 특정 토큰을 저장해 제 3자가 아닌 사용자로부터 요청이 왔다는 것을 인증할 수 있는 방법.

CSFR Token 값은 보통 HTML Form의 hidden 필드로 입력되나, 동적 요청에서도 사용 가능.

<?php
if (!isset($_COOKIE["csrftoken"])) {
    $csrftoken = bin2hex(random_bytes(32));
    setcookie("csrftoken", $csrftoken);
} else {
    $csrftoken = $_COOKIE["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 방식은 CAPTCHA 또는 암호 방식과 달리 추가적인 사용자 상호작용이 불필요하다는 장점 존재.

    - CAPTCHA (HIP / Human Interaction Proof 기술 , 그림에서 버스 고르세요 하는거)

부가적인 설명을 하면 

로그인 후 form을 통한 정상적인 요청이 있어야 함. 

form을 통해 전송 시, session에 저장된 token 값이 같이 넘어감. 

하지만 이것을 건너뛰면 session 토큰 값과 , 요청에 넘어온 토큰값이 일치 할 수 없다.

 


하지만 XMLHttpRequest나 Fetch API 등으로 Authorization과 같은 헤더를 설정하여 통신하는 것에 비해 여러 가지 보안 문제의 원인이 되기도 함.

짧은 CSRF Token이나 예측 가능한 CSRF Token은 사용하면 안된다.

안전성이 보장된 난수 생성기 (CSPRNG)를 사용하여야 함.

 

 

반응형

'Security' 카테고리의 다른 글

[systemhacking] 시스템 해킹 기초  (0) 2021.10.28
[Webhacking] [client-side advanced] CORS  (0) 2021.10.24
[Webhacking] [client-side advanced] CSP  (0) 2021.10.22
[Webhacking] [client-side advanced] XSS  (1) 2021.10.05
[wargame] pathtraversal  (0) 2021.10.04