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
148 REST, REST API, RESTful [2] 황제낙엽 2021.01.11 91128
147 Character Entity Set(s) 황제낙엽 2013.06.24 55453
146 엑셀(excel)에서 16진수 -> 10진수 변환 file 황제낙엽 2017.08.29 4294
145 설치형 블로그, 위키, 게시판 모음 황제낙엽 2006.09.20 4131
144 반올림하는 두 가지 방법 (Round-off(사사오입), Round-to-nearest-even(오사 오입)) file 황제낙엽 2019.08.27 1339
143 notepad2 에서 문서내의 일부 문자열의 byte 크기 알아내기 file 황제낙엽 2018.03.29 1207
142 부동소수점 연산에 관한 정리 황제낙엽 2018.03.26 1051
141 컴퓨터는 음수를 2의 보수법으로 표현한다 file 황제낙엽 2016.10.24 753
140 효과적인 모바일 애니메이션 응용예 file 황제낙엽 2018.03.30 671
139 2020 클라우드 정리 - cloud, aws, azure, gcp, iaas, paas, saas 황제낙엽 2020.04.05 664
138 XQL 황제낙엽 2003.07.10 576
137 아웃룩(Outlook 2010) 메일 보관 경로(.pst) 변경과 백업/복구 file 황제낙엽 2009.12.28 504
136 2019년 웹 프레임워크 인기 순위 file 황제낙엽 2020.04.06 470
135 음성인식서비스 개발을 위한 음성 API 모음(STT API) 황제낙엽 2019.04.28 465
134 자료구조 Part1. "동적배열"의 모든 것. 황제낙엽 2007.11.24 431
133 소프트웨어 개발 환경 갖추기 황제낙엽 2006.09.21 408
» 사랑비 BGM 보안 취약점 황제낙엽 2008.08.02 405
131 Web 2.0이란 무엇인가 : 다음 세대 소프트웨어를 위한 디자인 패턴 및 비즈니스 모델(2) 황제낙엽 2007.11.20 383
130 변수를 unsigned int형 선언 0xffffffff 할당 결과가 -1이 되는 이유는? 황제낙엽 2016.10.24 376
129 EULA (End User License Agreement) ; 소프트웨어 사용자 라이선스 계약 황제낙엽 2015.06.26 368