강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

신예준님의 프로필 이미지
신예준

작성한 질문수

해킹 입문부터 중급까지, 한 번에 배우는 웹해킹

CRLF 질문 있습니다

해결된 질문

작성

·

33

0

CRLF Injection 문제에서
header=header1 \r\n\r\n &value=<script>alert(1)</script> 로 payload 작성하시던데 그럼
header1 (header 쪽)
\r\n
\r\n
:<script>alert(1)</script>(body 쪽)

이렇게 되는 거 아닌가요? 근데 그러면 header 부분에는 header1 만 덩그러니 남는데 이거는 문제없는건지 궁금합니다. (원래 header에는 Content-Type : ~~ 처럼 키-값쌍이 있어야 하지않나요? )

그리고 body 부분에는 :가 포함된 <script>문이 되는데 (물론 이번 문제에서는 조건이 충족되서 상관없지만) : <- 없이 그냥 <script>alert(1)</script> 처럼 쓸 수 있도록

header=header1&value= \r\n\r\n<script>alert(1)</script> 이렇게 쓰는 거는 안되나요?
이 구문으로 쓰면 정답이 안 나오더라구요

 

답변 2

1

knockOn님의 프로필 이미지
knockOn
지식공유자

안녕하세요! CRLF Injection에서 header의 value에서는 가능하지 않은 점을 말해주셨네요 ㅎㅎ

일단 Falsk에서 CRLF Injection이 가능한 이유를 먼저 찾아보아야 합니다.

현재 취약점이 트리거 되는 코드는 해당 부분입니다.

response = make_response(f'I\'t is very good day to walk out. Power thourgh!!!!')
response.headers.set(header, user_input)

headers.set 에서 CRLF를 발생시키기 위해서는 Value가 아닌 key에 임의의 값을 넣을 수 있어야 됩니다.
실제로 직접 빌드해서 로그를 보면, value에 crlf를 입력할 경우 프레임워크 단에서 차단하는 것을 확인할 수 있습니다.

https://github.com/pallets/werkzeug/issues/1080
https://werkzeug.palletsprojects.com/en/stable/changes/
따라서 Key값에 CRLF를 진행해야 되며, value의 값이 비어 있어도, CRLF 두번을 기준으로 헤더와 바디가 나뉘기 때문에 브라우저에서는 이를 body로 인식하여 XSS가 가능하게 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. 신예준님.

CRLF 삽입(Injection) 문제를 다루실 때 여러모로 헷갈릴 수 있는 부분이 많으신 것 같습니다. 질문 주신 부분에 대해 답변 드리겠습니다.

CRLF(Carriage Return Line Feed)는 헤더와 본문(body)의 경계를 형성하는데 사용되며, 이를 통해 헤더와 본문을 구분할 수 있습니다. 때문에 의도한대로 모의해킹을 적용하기 위해선 CRLF 주입의 정확한 위치와 구성 요소가 중요합니다.

이 문제에서 사용된 페이로드는 다음과 같은 역할을 합니다:
1. 헤더 단절: \r\n\r\n를 사용해 헤더가 끝났음을 서버에 알립니다. 이 부분이 없을 경우, 헤더와 본문이 올바르게 구분되지 않을 수 있습니다.
2. 본문 시작: \r\n\r\n 이후의 내용은 HTTP 요청의 본문(Body)로 해석됩니다. 본문의 시작 위치가 명확해야 정확하게 데이터를 전달할 수 있습니다.

질문하신 부분에서 header1 \r\n\r\n<br><script>alert(1)</script>는 헤더를 종료하고 본문에 자바스크립트 코드를 삽입하는 일련의 작업입니다. 이때, 헤더 부분에는 키-값 쌍이 들어가야 한다는 말씀은 맞습니다. 특정 웹 서버나 애플리케이션에서는 올바른 헤더 구성이 중요하며, 그렇지 않을 경우 쿼리를 무시하거나 오류가 발생할 수도 있습니다.

마지막으로 두번째 방법(header=header1&value= \r\n\r\n<script>alert(1)</script>)을 사용해도 CRLF Injection이 가능하지만, 이 때는 웹 서버가 어떻게 헤더와 본문을 구분하고 해석할지를 명확히 이해해야 합니다. 첫 번째 방식이 정답으로 제시된 이유는 서버의 특성상 명확한 경계 설정을 위해 그런 것일 수 있습니다.

유사 질문이나 관련된 다른 사용자들의 경험을 통해 추가 학습을 원하신다면 아래 링크를 확인해 보세요:
- CRLF Injection 관련 사례와 해결 방안

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

신예준님의 프로필 이미지
신예준

작성한 질문수

질문하기