회원가입

로그인

아이디
비밀번호
ID/PW 찾기
아직 회원이 아니신가요? 회원가입 하기

웹 해킹 3/15 (눈에 보이지 않는 것에 대해 주의할점)

Profile
:맥노턴
/*
http://beist.org
beist@hanmail.net
wowcode at wowhacker team
*/
3) 눈에 보이지 않는 것에 대해 주의할점

이번 주제 역시 Web 프로그래밍 시에 일어나기 쉬운 취약성 중 하나이다.
아마도 Web 프로그램 만큼 BUG 가 많은 것도 없을 것이다. 왜냐하면 인터넷의
발전에는 WWW 가 있었고 WWW 의 대부분에 CGI 가 사용되기 때문이다.
(CGI 개발자들이 CGI 개발을 잘 못했다는 이야기가 아니라 워낙 많은 양의 CGI
가 있어서 많은 BUG 가 발견 될 수 밖에 없다는 이야기이다.)

이번의 BUG 는 BUG 라기보다는 개발자의 단순한 실수로 인한 것이라고 보는 것이 더
정확할 듯 하다.

이번에는 공지사항을 예로 들어서 설명을 하겠다. 공지사항은 Admin 만 올릴 수
있는 Board 같은 것입니다.

그러면 일반 사용자가 글을 쓸수 있지 못하도록 프로그래밍을 해야 한다.
하지만 어떤 Web CGI 에서는 아주 이상한 방법으로 사용자가 글을 쓸수 없도록
하기도 한다.

board.php

1  <?
2
3  echo "
4  <html>
5  <head>
6  <title>게시판 Menu</title>
7  </head>
8  <body>
9  ";
10
11 include "list_board.php";
12
13 echo "<br><br>";
14
15 echo "<a href=list.php>게시물 리스트</a><br>";
16 echo "<a href=next.php>다음 글</a><br>";
17 echo "<a href=pre.php>이전 글</a><br>";
18
19 if($adminpw="123456")
20 {
21 echo "<a href=writeform.html>공지사항쓰기</a><br>";
22 echo "<a href=delete.html>글 삭제하기</a><br>";
23 echo "<a href=modify.html>글 수정하기</a><br>";
24 }
25 echo "
26 </body>
27 </html>
28
29 ?>

11 번째 줄에서 list_board.php 를 include 하는데 list_board.php 의 기능은  공지사항의 게시물을 출력해주는 Script 이다. list_board.php 는 설명하려는  취약성이 아니므로 소스 첨부를 하지 않겠다. 게시물의 리스트를 보여주고  15~17 에서는 일반적인 게시판 메뉴들을 보여준다.

그리고 만약 board.php 를 요청하였을때 변수 $adminpw 가 있고, 그 값이
123456 이라면 이 사용자는 Admin 으로 인식하여 Admin 메뉴들도 뿌려준다.
21~23 에서 쓰기, 삭제, 수정 메뉴들을 보여준다.

모두 다 같은 원리이므로 여기서는 쓰기만을 예로 들어서 설명하겠다.

writeform.html

<html>
<head>
<title>이 page 는 공지사항 write form 이다.</title>
</head>
<body>
<form action=write_ok.php method=post>
제목 : <input type=text name=subject><br>
본문 : <input type=text name=comment><br>
비밀번호 : <input type=password name=pass><br>
<input type=submit value=글쓰기>
</form>
</body>
</html>

위와 같은 write form 을 이용하여 우리는 공지사항을 올릴 수 있을 것이다.

하지만 writeform.html 을 보다시피 writeform.html 자체에서는 이 사람이
admin 인지 아닌지 확인하는 알고리즘이 없다. (write_ok.php 에서도 Admin
인지 확인하는 알고리즘이 없다고 가정한다.) 그래서 만약 Cracker 가
board.php 에서 $adminpw 와 그에 맞는 값을 가지고 요청을 하지 않아도,  writeform.html 의 url 만 알고 있으면 공지사항을 쓸 수 있다는 이야기이다.

이런 Bug 도 일종의 Security Hole 이라고 할 수 있다. 이런 류의 취약점은
비슷한 상황에서 여러 종류의 취약점으로 발견된다. 예를 들면 Web Board
에서 File Upload 시에 <input type=file> 만 출력하지 않아서 자료실 기능이
없는 것처럼 만들어 놓았지만, 실제로는 자료실 기능이 없는 것이 아니라
단순하게 <input type=file> 만 출력하지 않는 것이다.

sample.php

<?

echo "
<html>
<head>
<title>write form!</title>
</head>
<body>
<form action=write_ok.php method=post ENCTYPE=\"multipart/form-data\">  제목 : <input type=text name=subject><br>  본문 : <input type=text name=comment><br>  ";

$fp=fopen("conf.txt", "r");

$test=fgets($fp, 2);

if($test==1)
echo "
<input type=file name=infile><br>";

echo "
<input type=submit value=글쓰기><br>
</form>
</body>
</html>
";
  
?>

이런 식으로 conf.txt file 에서 데이터를 읽은 후 그 값이 만약 1 이라면
File upload 기능을 사용한다고 보고 <input type=file> 을 출력하여 주는 것
인데, 만약 Cracker 가 html 을 수정하여 임의로

<input type=file name=infile>

를 추가한다면 Cracker 는 자료를 올릴 수 있게 될 것이다. (단 write_ok.php
에서 별다른 인증을 거치지 않는다는 가정하임)

한때 이런 버그를 이용하여 악의적인 Script 를 올린 후 Shell 을 획득하는
방법이 유행하기도 하였다. 이 것은 우습게 보아서는 안될 부분이며 개발자가
생각하는 것 이상으로 Server 에 피해를 미칠수도 있다.

해결책을 알아보자.

개발자가 개발을 하거나 Patch 를 할때 알아둬야 할 사항이 있다. Cracker 가
Source 를 다 볼수 있는 환경이어도 hacking 을 당해선 안되는 것을 만들어야
한다.

이 말은 완벽한 CGI 를 만들라는 것이 아니라, 정석의 알고리즘을 사용하지
않고 편법을 이용하여 단순히 눈속임을 하는 방법을 사용하지 말라는 이야기이다.

board.php 와 같은 경우에는 특별히 수정하지 말고 writeform.html 에서 action  script 인 write_ok.php 를 수정하는 것이 가장 좋은 방법이다.

write_ok.php 의 맨 앞에 다음과 같은 인증을 한다. 만약 $pass 와 그 값이
123456 이 아니라면 Admin 이 아닌 사용자가 글을 쓰려는 것으로 인식하여 script
를 중지시킨다.

if($pass!="123456")
{
  echo "입력하신 암호는 정확하지 않습니다.<br>";
  echo "공지사항을 올리 실 수 없습니다.";
  exit;
}

sample.php 에서의 write_ok.php 에서는 약간 다르게 처리하면 될 것이다.  write_ok.php 에서

$fp=fopen("conf.txt", "r");

$test=fgets($fp, 2);

if($test==1) {
copy($infile, "data/$infile_name");
chmod("data/$infile_name", 0444);
}

이런식으로 file 을 실질적으로 Server 로 Copy 하는 copy 함수를 사용하기 전에
conf.txt file 을 읽어와 설정값이 1 로 되어있는지 확인하고 1 이 아니라면
file 을 copy 하지 않는다.

Profile
:맥노턴
레벨 30
960255/961000
99%
McNorton & Education Lab.
Director
댓글
0
댓글 쓰기
권한이 없습니다.

번호 제목 조회 수 날짜
131 주변기기/네트워크장비 사운드블래스터 영문판/한글판 8692 03.03.23
130 XE 맥노튼님 대문 꾸미기 노하우를 배우고 싶어요... (2) 20184 03.03.23
129 컴퓨터바이러스 트로이 목마가 사용하는 포트 리스트 45773 03.03.16
128 Unix/Linux - 가 파일명 맨 앞에 들어간 파일 삭제하기 10293 03.03.14
127 Unix/Linux [아파치로그강좌1] cronolog를 이용하여 아파치 Log 분할하기 7748 03.03.04
126 소프트웨어안내 Favorite폴더에 대하여 (3) 5769 02.12.23
125 서버운영 ASP 페이지의 ODBC관련(80004005) 오류 10371 02.12.18
124 오피스웨어활용 엑셀, 수우미양가 성적산출 서식 10783 02.12.16
123 소프트웨어안내 아웃룩 실행시 MSN 자동실행 막기 5692 02.11.13
122 Windows/DOS 프로그램 추가/제거 실행시 ... line 472 에러 6191 02.11.05
121 White Hacking 웹 해킹 4/15 (file upload 알고리즘 시의 주의할점 -1-) 8017 02.10.22
White Hacking 웹 해킹 3/15 (눈에 보이지 않는 것에 대해 주의할점) 20782 02.10.22
119 White Hacking 웹 해킹 2/15 (Open 함수 사용시 주의할점) 7826 02.10.22
118 White Hacking 웹 해킹 1/15 (system, exec, passthru 함수 사용시 주의할점) 8852 02.10.22
117 소프트웨어안내 [re] 키워드 '멀티미디어'로 검색하시면... 5036 02.10.22
116 XE [re] 검색어로 멀티미디어를 입력해 보십시오. 7648 02.10.22
115 소프트웨어안내 멀티미디어가 뭔지 가르쳐 주세요~~~ 20974 02.10.18
114 소프트웨어안내 멀티미디어가 뭔가요? 4181 02.10.14
113 XE 내용 보신후에 답변 꼭 부탁 드립니다. 17685 02.10.14
112 XE [re] 네... 제가 살펴보니... (1) 8455 02.10.01

로그인

아이디
비밀번호
ID/PW 찾기
아직 회원이 아니신가요? 회원가입 하기