Homepage 사랑비 BGM 보안 취약점

황제낙엽 2008.08.02 09:49 조회 수 : 405 추천:109

sitelink1 http://heuristing.net/index.php?pl=1337&...4%EC%95%88 
sitelink2  
sitelink3  
sitelink4  
sitelink5  
extra_vars6  

홈페이지 제작에 관심이 있거나 나모 웹에디터나 메모장 등으로 개인 홈페이지를 만들어 본 경험이 있는 사람이면 사랑비 BGM 플레이어라는 프로그램에 대해 한 번쯤은 들어봤을 것이다. 이 프로그램은 2002년도에 개발되어 http://sarangbi.net 을 통해 배포되던 프로그램인데, 2003년 당시 공식 배포 사이트의 해킹 사고 이후 개발이 중단된 상태이다. 하지만, MySQL을 이용한 뛰어난 배경음악 관리기능과 사용법이 매우 쉽고, 스킨 개발이 용이하다는 장점 때문에 지금도 꾸준히 사용되고 있다.


하지만 이 프로그램은 업데이트가 중단된지 매우 오래된 프로그램이기 때문에 심각한 보안 버그가 존재하고 있다. 사랑비 BGM 플레이어는 관리자 모드 페이지를 보려면 인증을 거쳐야 하는데, 인증 방식이 Session 방식이 아닌 Cookie 방식을 사용하고 있기 때문에 누구나 쿠키값 조작을 통해 관리자 모드로 로그인이 가능하다는 문제가 있다.

사랑비 BGM 플레이어는 현재 공식 배포 사이트가 폐쇄된 상태이기 때문에 해당 프로그램을 구하기 위해서는 검색을 통해 다른 사용자들이 올려놓은 파일을 찾아서 받아야 한다.

※ 다운로드 링크 : http://www.hiramid.co.kr/bbs/board.php?bo_table=503&wr_id=8

다음은 관리자 인증을 담당하는 파일의 소스코드 일부이다.
 
  1. <?
  2. if( $HTTP_COOKIE_VARS['sarangbi_bgm_chk_'.$table] != "ok"){
  3.         echo "<br><br><br><br><br><br><br><br><br><br><br>";
  4.         include "admin/login.php";
  5.         include "admin/tail.php";
  6.         exit;
  7. }
  8. ?>

코드에서 보는 바와 같이 srangbi_bgm_chk_default 라는 쿠키값 만 존재하면 로그인이 이루어질 수 있다는 것을 알 수 있다. $table 변수값은 보통 기본적으로 default 값을 가지는데, 이 값은 사랑비 BGM 플레이어를 처음 설치할 때 수정이 가능하다. 하지만, 거의 대부분의 경우 이 값을 default라는 값 그대로 놓고 설치하는 경우가 많다. 따라서 사랑비 BGM 플레이어를 사용하고 있는 웹 사이트라면 대부분이 공격 대상이 될 수 있다.

이 취약점은 근본적으로 사랑비 BGM 플레이어의 관리자 인증 방식이 Session 방식이 아닌 Cookie 방식을 사용하고 있고, .htaccess 파일의 업로드가 가능하다는데 있다. 따라서 관리자 인증방식을 Cookie로 변경하고, 파일 업로드 기능에서 .htaccess 파일을 업로드하지 못하도록 패치를 하여야 한다.

물론 Cookie 방식을 사용하더라도 로그인 인증 시 부여되는 쿠키값을 자신만이 아는 값으로 만들어주면 어느 정도 보안이 되겠지만 좀 더 나은 보안을 위해 가능하면 Session 인증방식을 사용하는 것이 좋다.(쿠키는 사용자의 PC에 남기 때문에 문제가 될 수 있다)

사랑비 BGM 플레이어의 소스 파일을 다음과 같이 수정한다.

[사랑비 BGM 디렉토리]/sarangbi_bgm_admin.php 파일의 20라인 부근:
  1. if( $mode=='') $mode='main';
  2.  
  3. // DB가 설정이 되었는지를 검사
  4. if(!file_exists("db_conn.php")){
  5.  echo"<meta http-equiv="refresh" content="0; url=install.php">";
  6.  exit;
  7. }

[사랑비 BGM 디렉토리]/sarangbi_bgm_admin.php 파일의 46라인 부근:
  1.         if( $pw[0] == $db_pw[pw] && $pw != ''){
  2.                 session_unregister("user_pw");
  3.                 $user_pw = $db_pw;
  4.                 session_register("user_pw");
  5.                 if (!$_SESSION["user_pw"]) $_SESSION["user_pw"] = $user_pw;
  6.                 movepage($PHP_SELF."?mode=main");
  7.         }else{
  8.                 include "admin/top.php";
  9.                 echo "<br><br><br><br><br><br><br><br><br><font color=red>암호가 틀렸습니다. 다시 입력하세요.";
  10.                 include "admin/login.php";
  11.                 include "admin/tail.php";
  12.                 exit;
  13.         }


[사랑비 BGM 디렉토리]/sarangbi_bgm_admin.php 파일의 61라인 부근:
  1. // 로그 아웃 처리
  2. if( $mode == 'logout'){
  3.         session_destroy();
  4.         echo "
  5.                 <script language=javascript>
  6.                 window.close();
  7.                 </script>";
  8. }


[사랑비 BGM 디렉토리]/admin/login_check.php 파일의 1라인 부근:
  1. <?
  2. if($_SESSION["user_pw"] == $pw){
  3.         echo "<br><br><br><br><br><br><br><br><br><br><br>";
  4.         include "admin/login.php";
  5.         include "admin/tail.php";
  6.         exit;
  7. }


[사랑비 BGM 디렉토리]/admin/upload_write.php 파일의 84라인 부근:
  1.                 if($file1_size[$i]>0){
  2.                         $s_file_name1[$i]=$file1_name[$i];
  3.                         if( $use_caption[$i] == 1){
  4.                                 $caption_s_file_name1[$i] = $caption_file1_name[$i];
  5.                
  6.                                 if(eregi(".htaccess",$caption_s_file_name1[$i])||eregi(".htpasswd",$caption_s_file_name1[$i])||eregi(".inc",$caption_s_file_name1[$i])||eregi(".phtm",$caption_s_file_name1[$i])||eregi(".htm",$caption_s_file_name1[$i])||eregi(".shtm",$caption_s_file_name1[$i])||eregi(".ztx",$caption_s_file_name1[$i])||eregi(".php",$caption_s_file_name1[$i])||eregi(".dot",$caption_s_file_name1[$i])||eregi(".asp",$caption_s_file_name1[$i])||eregi(".cgi",$caption_s_file_name1[$i])||eregi(".pl",$caption_s_file_name1[$i])){
  7.                                 echo "Html, PHP 관련파일은 업로드할수 없습니다<br>
  8.                                         파일 : $caption_s_file_name1[$i]<br>";
  9.  
  10.                                 $use_caption[$i] = 0;
  11.                                 }
  12.                         }
  13.                         if(eregi(".htaccess",$s_file_name1[$i])||eregi(".htpasswd",$s_file_name1[$i])||eregi(".inc",$s_file_name1[$i])||eregi(".phtm",$s_file_name1[$i])||eregi(".htm",$s_file_name1[$i])||eregi(".shtm",$s_file_name1[$i])||eregi(".ztx",$s_file_name1[$i])||eregi(".php",$s_file_name1[$i])||eregi(".dot",$s_file_name1[$i])||eregi(".asp",$s_file_name1[$i])||eregi(".cgi",$s_file_name1[$i])||eregi(".pl",$s_file_name1[$i])){
  14.                                 echo "Html, PHP 관련파일은 업로드할수 없습니다<br>
  15.                                         파일 : $s_file_name1[$i]<br>";
  16.  
  17.                                 $i++;
  18.                                 continue;
 
 

 

번호 제목 글쓴이 날짜 조회 수
공지 2023 Software Development Trend 정리 황제낙엽 2024.01.19 1
68 프로젝트의 스토리 보드 황제낙엽 2010.03.03 1
67 Character Entity Set(s) 황제낙엽 2013.06.24 55432
66 비주얼 스튜디오 단축키 모음 황제낙엽 2012.12.04 51
65 줄바꿈 문자에 대한 고찰 (Special Charaters) 황제낙엽 2011.02.13 239
64 CRC32 (C++) file 황제낙엽 2010.03.28 16
63 아웃룩(Outlook 2010) 메일 보관 경로(.pst) 변경과 백업/복구 file 황제낙엽 2009.12.28 504
62 VB 6.0 ActiveX 웹 배포 황제낙엽 2009.10.12 47
61 ActiveX 강좌 황제낙엽 2009.10.12 32
60 쿠키 제어 (Javascript, PHP, JSP) 황제낙엽 2009.06.11 30
59 웹브라우저에서 FTP서버에 접속하기 황제낙엽 2009.01.06 35
58 Touring the Commons - part 1 황제낙엽 2008.05.20 218
» 사랑비 BGM 보안 취약점 황제낙엽 2008.08.02 405
56 Web2.0을 위한 (Flash, JavaScript) 차트(Chart) 솔루션 정리 file 황제낙엽 2008.07.17 36
55 (DNS서버구축) reverse zone 파일 설정 황제낙엽 2008.06.19 92
54 (DNS서버구축) zone 파일 설정 황제낙엽 2008.06.19 35
53 (DNS서버구축) named.conf 작성법 황제낙엽 2008.06.19 30
52 MSSQL 엔터프라이즈 관리자를 이용한 MSSQL접속 방법 황제낙엽 2008.01.30 52
51 자료구조 강의 사이트 황제낙엽 2007.11.24 19
50 자료구조 Part9. "트리" - 트리의 순회 - 이진 트리의 순회. 황제낙엽 2007.11.24 123
49 자료구조 Part8. "트리" - 이진트리의 기본편 황제낙엽 2007.11.24 75