'Apache Environment를 사용할 때 발생할 수 있는 SQL Injection 취약성'에 관한 핵심 정리

 

 

by Beist Security Study Group
(http://beist.org)

Members of Beist Research Group : beist and anonymous people
Members of Beist Study Group : beist, dars21, obhacker, passion, p-jackpot, jacaranda, cina, algot23

 

 

 

 

요약: 본 문서는 [이승진, Apache Environment를 사용할 때 발생할 수 있는 SQL Injection 취약성, 2003] 문서에서 제시한 기법을 Beist Security Study Group에서 핵심 내용만 간추려 정리한 문서이다. 일반적으로 magic_quotes_gpc 설정이 on으로 되어 있는 환경에선 SQL Injection 공격을 하기가 힘들다고 생각되는데 웹 프로그램에서 Apache Environment를 잘못 사용할 경우 SQL Injection을 성공할 수 있는 가능성이 있다. 본 문서는 이러한 문제에 대해서 다루고 있다.

 

 

 

 

 

 

 

1. 개요

대부분 웹 프로그램은 해당 프로그램에서 사용하는 정보를 유연하고 편리하게 관리하기 위해 데이터베이스와 연동하여 동작한다. 데이터베이스와 연동을 하기 위해서 웹 프로그램은 Parameter를 통해 데이터베이스에 보낼 데이터를 지정한다. 이때 데이터베이스로 넘어가는 Parameter를 악의적으로 조작하여 시스템에서 부당한 정보나 권한을 획득하는 공격 기법을 SQL Injection이라 한다.

[이승진, Apache Environment를 사용할 때 발생할 수 있는 SQL Injection 취약성, 2003] 문서에서는 웹 프로그램을 작성할 때 Apache Environment를 잘못 사용할 경우 일어날 수 있는 SQL Injection 기법에 대해서 제시하였다. 내용을 간단히 살펴보면 기존 웹 프로그램을 공격할 경우 magic_quotes_gpc 의 제한 때문에 SQL Injection 공격을 수행하기 힘든 경우가 종종 있었는데 위 문서에서는 Apache Environment를 잘못 사용할 경우 이를 우회하여 공격할 수 있는 방법에 대해서 나타내었다.

본 문서는 위 문서를 바탕으로 Beist Security Study Group에서 핵심적인 내용만 간략하게 정리 요약한 문서이다. 또한 본 문서는 SQL Injection 공격 기법에 관한 기초 지식 설명은 생략하였다.. 이에 관한 지식은 인터넷에서 쉽게 문서로 접할 수 있다.

 

 

 

 

 

 

2. 기술적인 내용

먼저 magic_quotes_gpc 가 무엇인지 간략히 알아보겠다. 해당 옵션에 관련된 PHP 옵션 정보를 인용하면,

 

 

--인용--

magic_quotes_gpc boolean

GPC (Get/Post/쿠키) 작동의 magic_quotes 상태를 설정합니다. magic_quotes on이면, 모든 ' (작은 따옴표), " (큰 따옴표), \ (백슬래쉬), NUL은 자동적으로 백슬래쉬로 이스케이프됩니다.

 

참고: magic_quotes_sybase 지시어도 ON이면 magic_quotes_gpc가 완전히 교체됩니다. 두 지시어를 모두 활성화하면 작은 따음표는 ''이스케이프합니다. 큰 따옴표, 백슬래쉬, NUL은 건들이지 않고, 이스케이프 하지 않습니다.

--인용--

 

 

, 결론을 내리면 PHP 설정에서 magic_quotes_gpc on으로 되어있을 때 SQL Injection 기법을 사용하기가 좀 더 어려워진다. 왜냐하면 SQL Injection 공격의 핵심이 되는 작은 따옴표, 큰 따옴표 등이 이스케이프 처리되어 공격에 이용할 수 없기 때문이다.

본 문서는 magic_quote_gpc 옵션이 on으로 되어있을 때, 이 옵션 자체를 우회하는 방법에 대해서 설명하지 않는다. 그러나 특정 웹 프로그램의 경우 Apache Environment 변수를 직접적으로 가져와 사용하는 경우가 있는데, 이때 취약성이 발생할 수 있고, 이에 관해서 초점을 맞춘다. 다음 코드를 보자.

 

 

env_test.php

<?

 

echo "HTTP_USER_AGENT : \t\t$HTTP_USER_AGENT\n";

echo "getenv(\"HTTP_USER_AGENT\") : \t" . getenv("HTTP_USER_AGENT") . "\n";

 

?>

 

 

위의 php 코드는 env_test.php 에 접근한 사용자의 웹 브라우저 정보에 대해서 2가지 형태로 출력해준다. 첫째는 $HTTP_USER_AGENT 변수이고, 둘째는 Apache 웹 서버로부터 물려 받은 환경 변수 HTTP_USER_AGENT getenv() 함수로 가져와 출력해준다. 다음과 같은 HTTP 요청을 보내서 결과를 보겠다.

 

 

[beist@localhost beist]$ telnet beist.org 80

Trying 222.239.227.44...

Connected to beist.org (222.239.227.44).

Escape character is '^]'.

GET /env_test.php HTTP/1.1

User-Agent: test

Host: beist.org

 

HTTP/1.1 200 OK

Date: Sun, 20 Nov 2005 07:58:39 GMT

Server: Apache/2.0.50 (Fedora)

X-Powered-By: PHP/4.3.8

Content-Length: 59

Connection: close

Content-Type: text/html; charset=euc-kr

 

HTTP_USER_AGENT :               test

getenv("HTTP_USER_AGENT") :     test

 

 

User-Agent 부분에 test를 입력한 결과, env_test.php 에서 각각 동일한 결과를 출력해주었다. 다음은 User-Agent Escape 문자를 포함하여 보낸 결과이다.

 

 

[beist@localhost beist]$ telnet beist.org 80

Trying 222.239.227.44...

Connected to beist.org (222.239.227.44).

Escape character is '^]'.

GET /env_test.php HTTP/1.1

User-Agent: test'hack

Host: beist.org

 

HTTP/1.1 200 OK

Date: Sun, 20 Nov 2005 08:00:10 GMT

Server: Apache/2.0.50 (Fedora)

X-Powered-By: PHP/4.3.8

Content-Length: 70

Connection: close

Content-Type: text/html; charset=euc-kr

 

HTTP_USER_AGENT :               test\'hack

getenv("HTTP_USER_AGENT") :     test'hack

 

 

이스케이프 문자를 포함하여 보낸 결과 서로 다른 출력을 보여주는 것을 확인할 수 있다. 이러한 원인을 살펴보면, getenv()를 이용하여 가져온 환경 변수는 PHP가 아닌 웹 서버에서 저장하고 있는 환경 변수이다. , PHP에서 어떠한 처리 과정을 거치기 이전의 변수이다. 그러므로 사용자가 보낸 데이터는 순수한 형태로 웹 서버의 환경 변수에 보관되어 있다. 반면에 $HTTP_USER_AGENT PHP에서 만들어낸 것으로, 웹 서버가 갖고 있는 HTTP_USER_AGENT 변수 값을 가져와 가공한 (여기서는 이스케이프 처리를 가공 과정의 한 예라고 볼 수 있다.) 것이다.

만약 위의 사례처럼 웹 프로그램에서 getenv() 함수를 이용하여 특정 환경 변수를 가져올 경우 이스케이프 처리가 되지 않으므로 해커 입장에서는 SQL Injection 공격에 유용하게 악용할 수도 있다. 이 공격 기법은 GET이나 POST등으로 전달되는 Parameter를 조작할 순 없기 때문에 공격에 한계가 있을 수도 있다. (대부분의 Parameter GET, POST로 전달되기 때문이다.) 그러나 실제로 이를 이용한 공격 기법이 적지 않게 잠재하고 있다고 생각된다. 의외로 웹 프로그램에서 getenv() 함수를 이용하여 환경 변수를 가져오는 경우가 많이 존재하기 때문이다.

취약 잠재 가능성을 가진 환경 변수를 예를 들어 HTTP_X_FORWARDED_FOR HTTP_USER_AGENT를 볼 수 있다. 이 환경 변수는 사용자가 마음대로 조작할 수 있는 변수인데 이를 악용할 경우 SQL Injection 공격을 할 수 있는 가능성이 존재한다. 물론 이외에도 getenv()를 이용하여 가져오는 모든 환경 변수도 주목해야 한다.

 

 

 

 

 

 

3. 마치는 말

본 문서에서는 핵심 원리에 대해서만 알아보았지만 SQL Injection에 대한 지식이 있다면 이를 응용하기 어렵지 않을 것이다. SQL Injection은 아직까지도 주요 웹 해킹 기법 중에 하나로 인식될 정도로 많이 사용되기 때문에 이 부분에 대해서 각별한 주의가 필요하다. 대부분 해킹 기법의 기술적인 최종 목표는 Shell을 획득하는 것이지만 웹 해킹의 특성 상 작지만 부당한 권한으로도 웹 사이트에 치명적인 피해를 입힐 수도 있기 때문에 더욱 주의가 요구된다.

이외의 연구로, magic_quotes_gpc에서 GPC GET, POST, COOKIE를 나타내기 때문에, HEAD 등의 Method로 요청할 경우엔 이스케이프가 어떻게 처리될지 살펴보았는데 내부적으로는 같은 Method로 취급하기 때문에 다른 HTTP Method로 보내더라도 이스케이프 처리가 되므로 안심해도 된다.

(또한 앞에서 HTTP_X_FORWARDED_FOR를 예로 들었는데, 본 문서와 직접적으로 관련은 없지만 이에 대해서 한가지 더 첨부하자면, 대부분 웹 프로그램은 이 변수 값을 신뢰하는 경향이 있다. 이것은 사용자의 주소를 나타내는 값인데, REMOTE_ADDR 변수 값과는 달리 사용자가 직접적으로 조작할 수 있기 때문에 가급적이면 사용을 피하고 굳이 사용을 한다면 적절한 조치를 취한 후 사용해야 한다.)

Posted by 달팽이맛나
,