PHP 기반 웹사이트 해킹 – 주요 PHP 취약점과 완벽한 해결 가이드
PHP는 오늘날 거의 모든 인기 있는 CMS의 근간을 이루는 언어입니다. 간결한 문법과 무료 라이선스 덕분에 동적 웹사이트 개발에 가장 선호되는 선택지가 되었죠. 그러나 안타깝게도 낮은 코딩 표준 때문에 PHP 사이트가 상대적으로 쉽게 공격당하는 현실도 함께 존재합니다. 온라인 곳곳에는 '커스텀 PHP 사이트가 해킹당했다', 'PHP 사이트가 다른 도메인으로 리다이렉트된다'는 호소로 가득합니다. 하지만 이는 PHP 자체의 잘못이 아니라, 부실한 구현과 설정에서 비롯된 문제입니다.
그렇다면 PHP 웹사이트 리다이렉트 해킹의 진짜 원인은 무엇일까요? 이 글에서는 PHP 사이트를 위협하는 보안 결함과 이를 예방하는 방법을 자세히 살펴봅니다.
커스텀 PHP 웹사이트 해킹 사례
대부분의 사이트 운영자는 개발에만 집중하고 보안에는 소홀하기 마련입니다. 그래서 PHP로 제작된 웹사이트가 해킹당했을 때, 개발비만 지불하고 보안 대책은 받지 못한 운영자들은 어디에도 도움을 요청할 곳이 없습니다. 고민하는 사용자들이 온라인 포럼에서 답을 찾아 헤매거나 이런 글을 읽고 있는 것이 현실입니다. 몇 가지 실제 사례를 살펴보겠습니다.
커스텀 PHP 웹사이트 해킹 증상
- 민감한 정보 입력을 유도하는 피싱 페이지가 사이트에 나타난다.
- 사이트 내 특정 링크를 클릭하면 다른 도메인으로 이동한다. 설정 오류 또는 PHP 리다이렉트 해킹이 원인일 가능성이 높다.
- 애드블로커가 사이트의 일부 요소를 암호화폐 채굴 코드로 탐지하여 차단한다.
- 출처를 알 수 없는 PHP 파일 관리자가 나타나고, 악성 광고가 노출된다.
- PHP 파일에 알 수 없는 코드가 삽입되어 리다이렉션이 발생하거나 수상한 사이트로의 백링크가 생성된다.
- 사이트에 의미 없는 난해한 콘텐츠가 표시된다. 일본어 키워드 해킹이나 파르마 해킹 등이 원인일 수 있다.
- 서드파티 호스팅 이용 중 계정 정지 경고 메시지가 나타난다.
- 구글 등 검색 엔진으로부터 멀웨어·스팸으로 블랙리스트 등재 경고를 받는다.
- phpMyAdmin에 알 수 없는 새 데이터베이스 관리자 계정이 존재한다.
- 사이트 도메인에서 발송된 이메일이 스팸으로 분류된다.
- 예기치 않은 오류 메시지가 발생하고 사이트 속도가 느려지며 응답하지 않는다.
커스텀 PHP 웹사이트가 해킹되는 13가지 원인
1. 서버 설정 오류
① 약한 파일 권한
파일 권한은 특정 PHP 파일을 수정할 수 있는 사용자의 범위를 결정합니다. 파일 권한이 올바르게 설정되지 않으면 공격자가 PHP 파일에 멀웨어나 스팸 코드를 주입할 수 있습니다.
② 기본값·약한 비밀번호
약하거나 흔히 쓰이는 비밀번호 사용은 PHP 사이트 해킹의 단골 원인입니다. 공격자는 맞춤형 사전 공격으로 가능한 모든 조합을 시도할 수 있으며, FTP 또는 cPanel 무차별 대입(brute force)에 성공하면 관리자 영역에 침입해 PHP 멀웨어나 백도어를 업로드하게 됩니다.
③ 디렉토리 인덱싱 활성화
디렉토리 인덱싱이 켜져 있으면 공격자가 민감한 PHP 파일을 열람할 수 있습니다. 이를 통해 서버 관련 정보가 노출되고, 해당 정보를 바탕으로 사이트에 대한 사이버 공격이 이루어질 수 있습니다.
④ 열린 포트
열린 포트 역시 해킹의 통로가 될 수 있습니다. 공격자는 열린 포트를 이용해 백엔드 서비스를 핑거프린팅하고, 그 정보를 토대로 익스플로잇으로 백엔드 서비스나 포트 자체를 공격합니다.
⑤ 저품질 호스팅
저렴한 PHP 호스팅은 보안에서 값을 치르는 경우가 많습니다. 가격을 낮추기 위해 보안 운영을 축소한 호스팅 환경에서는 감염이 확산될 때 직접 표적이 되지 않았더라도 같은 서버의 여러 사이트가 함께 위험해질 수 있습니다.
2. 취약한 PHP 코드
⑥ SQL 인젝션(SQL Injection)
PHP SQL 인젝션의 주원인은 검증되지 않은(unsanitized) 사용자 입력입니다. 부실한 코딩으로 인해 입력값이 필터링 없이 데이터베이스 서버까지 전달되어 실행됩니다. 커스텀 PHP 페이지에서 SQLi가 발생하는 주요 원인은 다음과 같습니다.
- 공백 문자에 대한 필터링 부재
- 문자열 구분에 따옴표만 사용
- 검증되지 않은 사용자 입력의 DB 전달
- 유니코드 인코딩의 부적절한 처리
- 코드와 데이터의 혼재
- 부적절한 타입 처리
⑦ 크로스 사이트 스크립팅(XSS)
XSS는 SQL 인젝션 다음으로 흔한 해킹 원인입니다. 두 공격 모두 웹 전반에 만연하여 매년 OWASP Top 10에 이름을 올립니다. XSS 역시 사용자 입력 검증 부족에서 비롯되며, PHP 사이트에서 주로 세 가지 유형으로 나타납니다.
- 저장형 XSS(Stored XSS): 악성 코드가 서버에 저장되어 해당 페이지를 방문할 때마다 실행됩니다. 포럼, 댓글 기능이 있는 PHP 사이트에서 특히 흔하며 매우 위험합니다.
- 반사형 XSS(Reflected XSS): 사용자나 관리자가 특정 링크를 클릭하면 악성 스크립트가 로드되어 쿠키를 탈취하는 방식입니다.
- DOM 기반 XSS: 위 두 유형 중 하나에 해당하지만 탐지가 매우 까다로워 코드 감사에서도 놓칠 수 있습니다.
XSS에 취약한 사이트는 주로 PHP 리다이렉트 해킹의 표적이 되거나 관리자 쿠키 탈취에 악용됩니다.
⑧ 크로스 사이트 요청 위조(CSRF)
CSRF 공격은 PHP 사이트 사용자가 의도하지 않은 작업을 수행하도록 속이는 공격입니다. 회원가입을 허용하는 커스텀 PHP 사이트라면 CSRF를 통해 임의 계정 삭제 등이 가능해집니다. 공격자에게 직접적인 이득은 보이지 않지만, 사용자 계정이 삭제되면 사이트 트래픽 감소로 이어질 수 있습니다.
⑨ 로컬 파일 포함(LFI)
파일 포함 취약점은 공격자가 루트 'www' 디렉터리 외부의 파일에 접근할 수 있을 때 발생합니다. 파일명을 파라미터로 받는 부실하게 작성된 스크립트가 주범입니다. 이 취약점을 통해 공격자는 민감한 설정 파일과 비밀번호 파일을 열람하고, 여기서 얻은 정보로 관리자 권한 로그인에 성공해 사이트 전체가 해킹당할 수 있습니다.
3. PHP 제로데이 취약점
⑩ 버그가 있는 플러그인 또는 테마
부실하게 코딩된 플러그인이나 테마는 서버 위에 그대로 놓여 있는 취약점으로, 악용되기를 기다리는 것과 다름없습니다. 실제로 공격자들이 취약한 플러그인을 표적으로 삼아 PHP 사이트에 대규모 공격을 감행한 사례도 있었습니다. PHP 사이트가 해킹당했다면 코딩이 부실한 플러그인이나 테마일 가능성이 큽니다.
⑪ 오염된 PHP 패키지
PHP 라이브러리와 패키지 자체가 취약할 가능성도 배제할 수 없습니다. 최근에는 PHP PEAR 패키지 관리자가 공격자에게 오염되어, 원본이 악성 코드가 주입된 것으로 교체된 채 아무것도 모르는 사용자들에게 다운로드된 사례가 있었습니다. 이러한 사례는 드물지만, 제로데이 취약점으로 인한 해킹 가능성은 항상 존재합니다.
4. 소셜 엔지니어링 공격
⑫ 피싱
관리자에게 '나이지리아 왕자'를 사칭한 메일이 도착한 적이 있습니까? 이런 공격은 웹 관리자를 속여 PHP 사이트의 민감한 정보를 넘기게 만드는 것이 목적입니다. 피싱으로부터 안전하려면 사이트 도메인으로 들어오는 이메일에 필터를 적용하세요.
⑬ 테일게이팅(Tailgating)
테일게이팅은 피싱의 변종입니다. 공격자는 먼저 하위 권한의 사용자 계정을 탈취한 뒤 이를 발판으로 권한을 상승시킵니다. 탐지를 회피하는 데 자주 쓰이는 기법으로, 정보 유출부터 사이트 전체 해킹까지 다양한 결과를 초래할 수 있습니다.
커스텀 PHP 웹사이트 보안 강화하기
올바른 파일 권한 설정
PHP는 파일 권한을 확인하는 세 가지 함수를 제공합니다.
- is_readable(): 사용자가 파일을 읽을 수 있으면 true 반환
- is_writable(): 사용자가 파일에 쓸 수 있으면 true 반환
- is_executable(): 사용자가 파일을 실행할 수 있으면 true 반환
권한 수정은 chmod() 함수로 가능합니다. 예를 들어 "chmod($RandomFile, 0644);"처럼 파일명과 권한을 지정하면 됩니다. 이때 숫자 앞에 '0'을 붙여 8진수임을 PHP 인터프리터에 알려주는 것을 잊지 마세요.
안전한 비밀번호 설정
숫자, 영문자, 특수문자를 조합한 강력한 비밀번호를 사용하세요. 비밀번호를 정하기 전에 Rockyou.txt 같은 유출 비밀번호 사전에 해당 값이 포함되어 있는지 확인하는 것도 좋은 예방책입니다. 리눅스 사용자라면 grep -i '*새비밀번호*' rockyou.txt 명령으로 대용량 파일을 손쉽게 검색할 수 있으며, 온라인 비밀번호 생성기를 활용해 길고 무작위한 안전한 비밀번호를 만드는 것도 좋은 방법입니다.
디렉토리 인덱싱 비활성화
특정 디렉터리의 인덱싱을 막으려면 .htaccess 파일(.htaccess가 없다면 새로 생성)에 다음 코드를 추가하세요.
Options -Indexes
안전한 호스팅 선택
호스팅 서비스를 선택할 때는 Astra Security와 같이 방화벽이나 보안 솔루션을 제공하는 곳인지 확인하세요. 또한 서브네팅(subnetting)을 통해 같은 서버의 다른 사이트로부터 내 사이트를 격리할 수 있는지도 점검해야 합니다.
PHP 코드 감사(Code Audit)
커스텀 PHP 사이트를 이미 구축했다면 처음부터 다시 만드는 것은 경제적으로 비합리적입니다. 따라서 공격자보다 먼저 취약점을 찾아내는 가장 좋은 방법은 코드 감사입니다. 전문 보안 커뮤니티의 도움을 받아 사이트 보안을 점검하고 모의해킹(pentest)을 진행하는 것을 권장합니다.