워게임을 풀다가 공부하게된 php 버퍼 취약점 입니다.

php는 내부적으로 출력 버퍼를 가지고 있습니다.

이때 버퍼가 일정 크기 이상으로 커지면, php가 버퍼를 자동으로 전송하게 됩니다.

이를 이용하여 특정 코드에서 CSP 등을 우회 할 수 있습니다.

if (strpos($comment, 'abc') !== false) {
    echo $prefix . $comment;             
}

if (strpos($comment, 'script') !== false) {
    $untrusted_comment = $_GET['comment'];

    while (strpos($untrusted_comment, 'script') !== false) {
        echo $alert;                    // 특정 문자열 출력 (ex. 경고문)
        echo $untrusted_comment;         
        $untrusted_comment = str_replace('script', '', $untrusted_comment);
    }
}

$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: ... nonce-{$nonce}");

 

드림핵 워게임 중 일부를 수정하여 예시로 든 코드입니다.

보안의 중점인 CSP 헤더가 코드의 맨 뒷 부분에서 추가되는 모습입니다.

이때 위에서 조건문 안에 적힌 echo 문들이 문제가됩니다.

 

위에서 말씀드린거처럼 php 버퍼에 일정량 이상의 정보가 쌓이면 php가 내부적으로 응답을 그냥 보내버리게됩니다.

echo문이 바로 그 버퍼를 채우는 역할을 합니다.

 

조건문을 보면 script 라는 문자열이 입력값에 있을 때 그 값을 공백으로 바꾸면서  $alert값 (특정 문자열)을 출력값에 더하게됩니다.

그냥 보면 입력 검증 후 CSP 헤더를 추가하여 출력하는 정상적인 코드로 보이지만, script가 입력값에 아직 남아 있으면 계속 루프를 돌면서 echo로 alert값을 출력에 더하게됩니다.

이를 통해 버퍼가 과도하게 가득 차게됩니다.

 

공격자가 입력값에 script 값을 여러번 넣어서 echo 문을 과도하게 많이 출력시키게 한다면 php의 출력버퍼가 꽉 차게 되어 뒤에 붙을 CSP 헤더의 공간이 없어지게 됩니다.

그 상태에서 출력값이 나가면 CSP 헤더가 붙지 않고 응답이 나가게됩니다.

즉 CSP를 우회하는 결과가 나오게 됩니다.

 

script가 가득한 입력값에 악의적인 XSS 문구 등을 같이 넣는다면, CSP가 작동하지 않아 공격이 먹히게됩니다.

 

 

 

'보안 > 이론 정리' 카테고리의 다른 글

API - GraphQL  (0) 2026.03.05
웹 해킹 - SQLi UNION에 대하여  (0) 2026.02.11
웹 해킹 - XSS Filter Bypass  (0) 2025.10.15
스프링부트 - URL 매핑과 컨트롤러  (0) 2025.10.03
웹 해킹 - 직렬화와 역직렬화  (0) 2025.09.25

+ Recent posts