국내 게시판의 보안 문제 및 해결 방안

Posted by Hide­
2007.03.18 00:20 Security/Web
1. upload 취약점

- intro

php를 함께 사용하면서 upload 취약점은 국내 게시판의 공통적인 문제점이다.
지난 5월, 이 취약점을 이용한 'How apache.org was defaced' 가 공개되었으며 최근 국내에서 널리 악용되는것으로 보인다.
웹서버에 php를 같이 돌리고 있는경우 주의를 기울이자

- in a case

.php .ph 등의 file을 upload한후 nobody권한을 획득하고, bindshell을 통한 시스템 침투.apache site가 해킹당한 이후 국내 크래커나 black hats이 많이 사용하는 기법이다.

- solution,patch

php4.x이상에서는 passthru함수등은 제거가 되었지만 현재 대부분의 국내 게시판이 위와 비슷한 취약성이 있다. 해결책으로는 JSBoard 개발자인 김정균씨가 제시한 방법이 좋은 방법이다.

file의 확장자가 php,php3,ph,ph. 등의 file이 upload되는것을 방지하고, apache에서 또한 강력한 인증을 하는 것이 좋다.

(Linux에서는 php. php3. 포함)

http://jsboard.kldp.org/bbs/read.php?table=bbs_notice&no=60 http://jsboard.kldp.org/bbs/read.php?table=bbs_notice&no=62

2. setup file(db passwd,기타설정) 노출

- intro

.ph .inc등 설정화일이 노출될수 있다.

- in a case

url을 통해 ph, inc 파일에 접근 할 수 있다.

- solution,patch

apache의 httpd.conf에 다음 줄을 추가함으로 설정파일이 노출되는 문제를 해결할수 있다.

AddType application/x-httpd-php .php .php3 .ph .inc
또한 .ph.php .inc.php 이런식으로 이름을 줄 수가 있다.

3. directory,file permission

- intro

국내 게시판의 대부분이 데이타를 저장함에 있어서 mode 777 로 된 디렉에 저장이 되고 o+w권한이 있는 화일이 생성이 된다.

- in a case

악의적인 목적을 가진 크래커나 black hats은 local 에서 쉽게 web server 권한을 취할수 있게된다. 또한 잘못된 permission을 통해 해당 글이 저장되는 화일을 볼 수가 있다.

drwxrwxrwx 5 ksecurity ksecurity 4096 6월 17 15:09 db/

-rw-rw-rw- 1 nobody nobody 154 7월 27 23:37 article.cgi

- patch

nobody를 제외한 유저들의 w 권한을 없애는 것도 하나의 방법 해당 글이 저장되는 화일에 대한 permission을 검사한다.

4. shell을 실행하는 함수의 취약점

- intro

< C > system(),popen()

< perl > system(),open(),eval(), exec(), ` `(Backticks)

< php > system(),passthru(),exec(),popen(),escapeshellcmd(),` `(Backticks)

- patch

이러한 함수들을 사용할때에는 변수가 인자로 들어가는 경우 shell metacharacters 들을 제거 해야 한다.

shell metacharacters
;<>*|'&;$!#()[]{}:'"/^\n\r

- case1

$value =~ tr/+/ /;
$value =~ s/~!/ ~!/g;
$value =~ s/<([^>]|\n)*>//g;
$value =~ s/([\&;\`'\\\|"*?~<>^\(\)\[\]\{\}\$\n\r])/\\$1/g;
$value =~ s/\0//g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

- case2

if($shell =~ tr/;<>*|`&$!#()[]{}:'"//) {
print "don't abuse";
exit(1);
}

- case3

$value =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"])/\\$1/g;

5. file open 취약점

- intro

open()이나 fopen()같은경우 FILE을 열때 보통 많이 사용하게된다. null byte,역패스나 \ , | 기타 meta characters들을 제거해야 한다.

case in perl)

s/\0//g; #null byte 제거
s/\.\.//g
s/(\|)/\\$1/g

case in php)

eregi_replace("\.\.","",$file);

case in JSBoard)
(역패스 meta characters 대응방안)

if(eregi("/",$dn[name]) || eregi("\.\.",$dn[path]) || !$dn[cd] || !$dn[name]) {
echo "\n";
exit;
}

6. 예외 처리 문제

- intro

프로그램 작성시에 예외 처리를 하지 않으면 socket이나 file등 open하는 함수를 사용할때 오류가 발생하면서 해당서버의 full path를 노출하게 된다.

- case in JSBoard(whois.php)

if (!$table || !$host) {
echo "\n";
exit;
}

7. 변수 조작가능 취약점

- intro

프로그램 구조상 if등이나 제어문에서 조건을 판단 할시에 변수의 조작가능성을 살펴보는게 좋다.

- in a case

if($admin)
{
admin mode진입
}

admin=1 이라는 값을 준다면?

8. admin auth problem , 기타인증

- intro

게시판에 많이 사용하는 admin mode시에 인증을 확실히 하자.
url을 통한 인증되지 않은유저가 변수에다가 직접값을 넣을 수 있도록 하는건 피하는것이 좋다.

- in a case

(보통 POST방식으로 작동하는 게시판들)
한가지 예로 여러가지 도배라든지 가능해 지기 때문이다.

9. buffer overflow

- intro

c,c++로 program을 작성하는 경우에는 buffer overflow 부분을 조심하도록 한다.

- in a case

bof bug를 가지고 있는 code

int bof_exist(){
char buf[10];
strcpy(buf,get_table_name(tablename));
}

query_string_buf[1024];
querysend = getenv ("QUERY_STRING");
strcpy (query_string_buf, querysend);

이러한 종류의 함수는 사용할때 주의를 한다.
gets (),getenv(), strcpy (), strcat (), sprintf (), fscanf (), scanf (), sscanf (), vscanf(),vsscanf, vfscanf(),vsprintf (),realpath (), getopt (), getopt_long(), getpass (), streadd (),strecpy (), strtrns ()

되도록 bcopy(),fgets(),memcpy(),strncpy(),snprintf(),strccpy(), strcadd(),vsnprintf()으로 대체해서 사용하도록 한다.

10. 기타 주의할 점

해당변수의 localhost가 아닌 다른 host로 Redirect 가능성이 있는지 생각 해 본다.

환경변수 이용시 주의한다.

system("ls -l /var/www/board/db");
정확한 PATH를 넣어주자.
system("/bin/ls -l /var/www/board/db");

$ENV{"PATH"} = "/bin:/usr/bin:/usr/local/bin";
$ENV{"IFS"} = "/";

다른 환경변수 예

$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"\n";

간혹 게시판들 프로그램중에 임시화일을 만드는 경우
또는 배포시에 .bak등 백업화일은 넣지 않도록 한다.

suid,sgid 는 될 수 있으면 피하도록 한다.

---[ a conclusion ]---

c,c++,perl,php 등을 이용해서 cgi 프로그램을 개발하는 개발자들은 자신의 프로그램이 혹시 버그가 없을까
조금만 더 살펴보자.

cgi 보안은 chroot,cgi wrappers(cgiwrap,suEXEC,sbox)등을 적절히 사용 하는 것도 하나의 방법이다.

이 문서가 도움이 되었길 바란다.


--[Reference]--


Ksecurity bbs - 국내 게시판들의 문제점
Ksecurity bbs - bugtraq에서의 technote 취약점 공개에 대해
Ksecurity bbs - Building OpenBSD firewall,NAT,IDS (2/3)
Ksecurity auditing - 국내 게시판들의 취약점 분석
Ksecurity auditing - 국내 웹서버 보안 문제
Ksecurity auditing - CGI Security
Ksecurity auditing - PHP Security

Ksecurity Advisory - JSBoard muiltiple security hole
- JSBoard Distributed Spam Attack
- JSBoard write bypass admin s
 


다른 사람들이 많이 읽은 글
이 댓글을 비밀 댓글로

티스토리 툴바