Skip to content

Latest commit

Β 

History

History
37 lines (22 loc) Β· 1.99 KB

README.md

File metadata and controls

37 lines (22 loc) Β· 1.99 KB

Flask (Jinja2) SSTI (Server Side Template Injection)

μ‹ κ²½λ°© (@positiveWand)


μš”μ•½

  • μ„œλ²„ νƒ¬ν”Œλ¦Ώ 엔진은 μ‚¬μš©μžλ‘œλΆ€ν„° μš”μ²­μ΄ λ“€μ–΄μ˜¬λ•Œλ§ˆλ‹€ μž‘μ„±λœ ν…œν”Œλ¦Ώ νŒŒμΌμ„ λ Œλ”λ§ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό μ‚¬μš©μžμ—κ²Œ λ°˜ν™˜ν•œλ‹€.
  • μ„œλ²„λŠ” μ„œλ²„μ— μ €μž₯된 데이터, μ‚¬μš©μž μš”μ²­κ³Ό ν•¨κ»˜ 전달받은 데이터 λ“±κ³Ό 같이 μ„œλ²„μ—μ„œ μ‚¬μš©κ°€λŠ₯ν•œ 데이터듀을 μ΄μš©ν•΄ λ Œλ”λ§μ„ μˆ˜ν–‰ν•œλ‹€.
  • 이 취약점은 Flask와 Flaskμ—μ„œ μ‚¬μš©ν•˜λŠ” ν…œν”Œλ¦Ώ 엔진 "Jinja2"λ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒ. μ‚¬μš©μžκ°€ 잘 κ΅¬μ„±ν•œ λ Œλ”λ§ μ½”λ“œ λ¬Έμžμ—΄μ„ μ„œλ²„μ— μ „λ‹¬ν•˜κ³  μ„œλ²„κ°€ 이 λ¬Έμžμ—΄μ„ κ·ΈλŒ€λ‘œ ν…œν”Œλ¦Ώ 엔진에 μ‚½μž…ν•˜μ—¬ λ Œλ”λ§μ„ μˆ˜ν–‰ν•œλ‹€λ©΄ μ‚¬μš©μžκ°€ μ „λ‹¬ν•œ μž„μ˜μ˜ Python μ½”λ“œκ°€ 싀행될 수 μžˆλ‹€.

ν™˜κ²½ ꡬ성 및 μ‹€ν–‰

  1. docker compose up -d λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ μ‹€ν–‰.
  2. http://your-ip:8000/?name={{233*233}}에 μ ‘μ†ν•˜μ—¬ 54289κ°€ 좜λ ₯λ˜λŠ”μ§€ ν™•μΈν•˜μ—¬ SSTI 취약점이 μ‘΄μž¬ν•¨μ„ ν™•μΈν•©λ‹ˆλ‹€.
  3. python poc.pyλ₯Ό μ‹€ν–‰ν•˜μ—¬ 곡격을 μˆ˜ν–‰ν•˜λŠ” URL을 확인.
  4. ν•΄λ‹Ή URL에 μ ‘μ†ν•˜λ©΄ μ‚½μž…ν•œ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ–΄ μ„œλ²„ ν”„λ‘œμ„ΈμŠ€μ˜ idκ°€ 좜λ ₯λ˜λŠ” 것을 확인할 수 있음.

+) poc.py의 script λ³€μˆ˜μ˜ 값을 μ›ν•˜λŠ” Python μ½”λ“œλ‘œ λ°”κΎΈλ©΄ ν•΄λ‹Ή μ½”λ“œκ°€ μ„œλ²„μ—μ„œ μ‹€ν–‰λœλ‹€. (κΈ°λ³Έ μ½”λ“œλŠ” μ„œλ²„ ν”„λ‘œμ„ΈμŠ€μ˜ idλ₯Ό 좜λ ₯ν•˜λŠ” μ½”λ“œ)


κ²°κ³Ό

poc μ‹€ν–‰ 이미지

μ„œλ²„λ‘œλΆ€ν„° 받은 λ°˜ν™˜κ°’


정리

  • 이 취약점은 μ‚¬μš©μžκ°€ μ„œλ²„μ—μ„œ μž„μ˜μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ„λ‘ ν•  수 있게 λ§Œλ“€κΈ° λ•Œλ¬Έμ— μœ„ν—˜ν•˜λ‹€. μ•ˆμ „ν•œ μ›Ή μ„œλΉ„μŠ€ μš΄μ˜μ„ μœ„ν•΄μ„œλŠ” μ„œλ²„ κ°œλ°œμžκ°€ ν˜Ήμ€ 라이브러리, ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ‚¬μš©μžκ°€ μ „λ‹¬ν•œ 데이터가 ν…œν”Œλ¦Ώ μ½”λ“œμΈμ§€ ν™•μΈν•˜μ—¬ ν•„ν„°λ§ν•˜κ±°λ‚˜ μ‚¬μš©μž μž…λ ₯ 데이터가 μ‹€ν–‰μœΌλ‘œ 이어지지 μ•Šλ„λ‘ ν•΄μ•Όν•œλ‹€.