회원가입

로그인

아이디
비밀번호
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
:맥노턴
레벨 31
370430/
-7%
McNorton & Education Lab.
Director
댓글
0
댓글 쓰기
권한이 없습니다.

로그인

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