정보보안 공부/웹

[웹] CRLF 취약점 (HTTP 응답 분할 공격)

pxatd 2021. 4. 15. 05:32
728x90

1. 사전조사

클라이언트와 서버 간의 HTTP request와 response Message를 살펴보면 헤더와 바디 사이 CRFL 공백이 존재하는 것을 볼 수 있다. 이 HTTP Response CRLF 공백에 악의적인 코드나 스크립트를 삽입하여 XSS를 생성하거나 캐시를 조작하는 해킹기법이 바로 CRLF 인젝션이다. (HTTP 프로토콜의 응답 방식이나 TCP/IP 의 경우 조금 더 공부한 후에 정리하도록 하겠다.)

CRLF 인젝션(CWE-93: Improper Neutralization of CRLF Sequences “CRLF Injection”)은 HTTP 응답 헤더나 메일 헤더에 있는 줄바꿈 코드 (CR+LF)를 삽입해 의도하지 않은 헤더필드를 추가하는 취약점이다.
- CR(Carriage Return: \r) : 커서의 위치를 현재 줄의 맨 처음으로 보내는 기능
- LF(Line Feed: \n) : 커서를 다음 줄로 옮기는 기능

공격 대상이나 공격 코드를 보내는 방법에 따라 각기 다른 공격 명칭이 붙는다.

2. 취약점 개념 설명

가) HTTP 헤더 Injection
HTTP 헤더 인젝션은 응답 헤더필드에 공격자가 줄바꿈 코드 등을 삽입해 임의의 응답 헤더필드나 바디를 추가할 수 있는 취약점이다. 공격을 위해서는 피해자의 개입이 있어야 하는 수동적인 공격으로 분류된다.
HTTP 헤더 인젝션을 통해 다음과 같은 영향을 줄 수 있다.

- 임의의 URL에 리다이렉트를 시킬 수 있다는 점을 악용해 악성사이트로 유도 가능
- 모든 쿠키를 생성할 수 있기에 세션 고정 공격에 이용
-임의의 HTTP 바디가 생성되므로 웹 페이지에 표시된 애용을 변조시킴

나) HTTP 응답 분할 공격 (HTTP Response Splitting)
HTTP 응답 분할 공격 (CWE-113: Improper Neutralization of CRLF Sequences in HTTP Headers “HTTP Response Splitting”)은 HTTP의 헤더 인젝션을 응용한 공격이다. 여러 개의 HTTP 응답을 만들어 냄으로써 캐시 서버(Cache Server)나 프록시 서버(Proxy Server)에 변조된 컨텐츠를 전송해 다른 사용자에게 영향을 주는 것이다.

다) 이메일 헤더 인젝션
메일 헤더 인젝션은 메일 메시지의 헤더 부분에 공격자가 줄 바꿈 코드 등을 삽입해 임의의 헤더 필드나 바디를 추가시켜 발생하는 취약점이다. 메일 헤더 인젝션을 사용해 보낸 메일은 웹 프로그램이 사용하는 SMTP서버 등에서 보내지는 것이라 스팸메일로 처리되지 않는 경우도 있다. 메일 헤더 인젝션을 통해 다음과 같은 영향을 줄 수 있다.

-받는 사람 (To)나 제목(Subject)등을 변조해 메일 전송
-스팸이나 광고 메일 등으로 이용
-악성파일을 첨부한 메일 전송 가능

3. 취약점 진단 계획

test website (예를들어 badstore,,) 에서 진행해도 되고, VMware같은 가상머신이나 또는 Microsoft-IIS 등으로 직접 웹사이트를 구축하여 실습을 진행해도 좋다. 나는 아직 실습을 진행하지는 않았지만 아마 IIS로 웹 환경을 구축하여 CRLF 취약점을 진단해 볼 계획이다.

프로그램 툴은 Burp Suite과 Wire Shark를 사용할 예정이다. HTTP의 응답을 확인하기 위해서이다.

가) HTTP 응답 분할 취약 테스트 환경 구성
①HTTP 응답 분할 취약점 테스트를 위해 웹 서버 Microsoft-IIS/5.1과 asp언어를 사용하여 게시판에 있는 글을 조회하는 모듈을 구현한다. 이 때, 글 조회 시 Request 패킷의 파라미터 값이 Response 패킷 header에 삽입되도록 한다.
②게시판에서 해당 글을 선택했을 경우, 글 번호 파라미터와 함께 글 상세보기 페이지로 전환하는 소스코드 파일명은 (borad_view.asp)로 정의한다.
③글 상세보기(board_view.asp) 페이지에서 클릭한 글의 번호를 받고 Header에 추가적으로 입력할 파라미터 test를 추가한다.

나) HTTP 응답 분할 취약점 테스트
①게시글 열람 시 Request 패킷 내 파라미터가 전송됨을 확인한 후, test 파라미터에 HTTP 응답 분할을 위한 공격 구문을 삽입한다.
②이 때, HTTP 응답 분할 공격 구문을 삽입하여 전송하면 서버 측에서 공격 코드에 있는 파라미터를 그대로 받아서 처리하므로 Response 패킷 내 header가 2개 존재하게 된다.

4. 예상하는 결과

두 번째 응답 값이 실행되고, 그 이하 첫 번째 응답 값 일부를 모두 문자열로 인식하여 문자 그대로 화면에 출력할 것이다. 또한 첫 번째 응답 값인 게시물 읽기가 실행되어 웹 브라우저에 출력될 것이다.


5. 참고한 단행본

조쉬 파울리 (2016), 『웹 해킹 입문』, pp. 127 ~ 129 , SYNGRESS
우에노 센 (2017), 『취약점 진단 스타트 가이드』, pp 56 ~ 61 , 위키북스

728x90