본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

인젝션(Injection, 삽입 공격)은 신뢰할 수 없는 입력이 명령어나 질의문의 일부로 인터프리터에 전달될 때, 공격자가 넣은 문자열이 데이터가 아니라 명령으로 해석되어 의도하지 않은 명령이 실행되거나 허가되지 않은 데이터에 접근되는 취약점이다.

응용 프로그램이 사용자 입력을 문자열로 이어 붙여 SQL·운영체제 명령·LDAP 필터·XPath 식 같은 인터프리터가 해석하는 문장을 만들면, 입력 속의 따옴표·세미콜론·논리 연산자가 문장의 구조를 바꿀 수 있다. 인터프리터는 어디까지가 개발자가 쓴 코드이고 어디부터가 입력값인지 구분하지 못한다. OWASP Top 10 은 2013년판과 2017년판에서 인젝션을 1위(A1)에 두었고, 2021년판에서는 크로스사이트 스크립트를 합쳐 3위(A03)에 두었다.[1]

종류 해석하는 곳 예
SQL 인젝션 DBMS 의 SQL ' OR '1'='1 로 로그인 우회, UNION 으로 다른 테이블 조회
명령어 삽입(OS 명령 인젝션) 운영체제 셸 ; cat /etc/passwd 를 붙여 셸 명령 실행
LDAP 인젝션 디렉터리 서비스의 검색 필터 *)(uid=*)) 로 조건 무력화
XPath 인젝션 XML 문서 질의 ' or '1'='1 로 XML 사용자 정보 열람
코드·표현식 인젝션 스크립트 엔진, 템플릿·표현 언어 eval 에 넘긴 입력, 서버 측 템플릿 인젝션
크로스사이트 스크립트 피해자 브라우저의 HTML·자바스크립트 게시글에 스크립트 삽입(OWASP 2021 은 인젝션에 포함)
  • DLL 인젝션은 이름만 같을 뿐 다른 프로세스의 메모리에 DLL 을 강제로 올리는 기법이라 이 문서의 인젝션과 다르다
  • 프롬프트 인젝션은 대형 언어 모델에 지시문을 섞어 넣는 공격으로, 데이터와 명령이 한 텍스트로 섞인다는 점에서 원리가 같다

원인은 입력을 검증하지 않고 명령 문자열에 직접 이어 붙이는 것이다. 대응은 데이터와 명령을 처음부터 따로 넘기는 것이 기본이다.[2]

  • 매개변수화 질의(Prepared Statement, 바인드 변수)를 쓴다 → 자바 PreparedStatement
  • 운영체제 명령은 셸을 거치지 않는 API 를 쓰고, 허용 목록(화이트리스트)에 있는 값만 받는다
  • 서버 측 입력값 검증과 특수 문자 이스케이프, 최소 권한 DB 계정, 자세한 오류 메시지 숨기기
  • 정적 분석·동적 점검으로 시큐어 코딩 규칙 위반을 찾는다

비슷한 OWASP 항목과 구분

편집 원본 편집
항목 핵심
인젝션 신뢰할 수 없는 데이터가 명령·질의의 일부로 인터프리터에 전달된다
인증 및 세션 관리 취약점 인증·세션 토큰 처리가 잘못되어 다른 사용자로 가장할 수 있다 → 인증 및 세션 관리 취약점
보안 설정 오류(잘못된 보안 구성) 기본 계정·불필요한 서비스·패치 누락·자세한 오류 메시지 등 설정 문제
알려진 취약점이 있는 컴포넌트 사용 취약점이 공개된 라이브러리·프레임워크를 그대로 쓴다 → 소프트웨어 구성 분석
  1. ↑ 「OWASP Top 10 - 2017: A1 Injection」·「OWASP Top 10:2021 A03 Injection」, OWASP Foundation.
  2. ↑ 「소프트웨어 보안약점 진단가이드」, 행정안전부·한국인터넷진흥원, 2021, 입력데이터 검증 및 표현(SQL 삽입, 운영체제 명령어 삽입, LDAP 삽입, XQuery·XPath 삽입).