Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: 제로보드 취약점에서 아직도 석연찮은 부분

내용으로 바로 넘어 가기


TokigunStudio3

228 / 3282   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

제로보드 취약점에서 아직도 석연찮은 부분

2005/01/22 AM 12:44 | 개발 | 6 comments | 0 trackbacks | AllBlog: vote, to pocket

1년 전부터 내가 발견해서 몇몇 사람들한테 알려 줘서 아는 사람들은 알겠지만, 이 버그의 가장 중요한 점은 \0의 사용이다. 원래 magic_quotes_gpc가 On이면 $keyword 변수를 %00으로 때려도 당연히 '\0'(길이 2인 문자열)로 나오지만 (물론 내가 이 사실을 안 건 얼마 안 되었다 -_-;) 제로보드 내부에서 addslashes와 stripslashes를 반복하면서 이게 그냥 "\0"(길이 1인 문자열, chr(0)과 같음)로 바뀌는 것이다.

조금 더 정확하게 설명을 하자면, 일단 extract($HTTP_GET_VARS);를 통해서 $keyword가 선언되고, $keyword = stripslashes($keyword);가 실행된다. 이 상황에서 처음에 입력된 %00은 모두 chr(0)로 바뀐다. 이 다음 $keyword가 공백이 아니면 한 번 addslashes 함수 적용했다가 다시 stripslashes 함수를 적용시킨다. 이래도 chr(0)은 그대로 남는다. 그게 list_check 함수에 가서 정규표현식에 그대로 안착해 버리고 결국 말썽의 근원이 되는 것이다.

그런데, 아직도 석연찮은 구석이 있다면, 도대체 이 버그가 안 먹히는 서버가 있는 이유를 도통 모르겠다는 것이다. 지금까지 이 버그가 안 먹히는 서버는 서너 군데(nzeo.com, *.new21.org 등등)였는데, 먹히지 않을 리가 없는 것 같은데 왜 안 먹히는 건지 도무지 이해가 가지 않는다.

혹시나 나중에 가면서 이게 바뀌었나 싶어서 5.0.3까지 설치해 가면서 테스트해 봤는데도 (뭐 이전에 4.1.x까지 테스트해 본 적도 있으니...) 제대로 나오는 걸로 봐서 버전 문제는 아닌 것 같고, 심지어 register_globals와 magic_quotes_gpc를 다 바꿔 가면서 실험해도 어떤 문제도 발생하지 않은 걸로 봐서 이것도 문제의 원인은 아닌 것 같다. :( 내일 조금 더 찾아 보고, 못 찾겠으면 "대부분의 서버에 대해서 적용된다"라고 뭉뚱그려 설명해야 할 것 같다. (석연찮지만...)

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=323

Comment: azurespace (2005/01/22 AM 04:31)

단순히 서버 운영체제상의 문제는 아닐까? \0을 하나의 일반 문자로 인식하느냐, 아니면 NULL 문자로 인식하느냐.

근데, 사실 공개 안 하는 게 나을 것 같아. 제로보드에 치명적인 버그가 그거 하나만 있는 것도 아닌데, 별 차이 없겠지. 오히려 부정적인 영향이 있으면 있었지.

Comment: azurespace (2005/01/22 AM 04:33)

어이쿠 -_- 이런. 이건 또 무슨 일이래..

Comment: d3m3 (2005/01/22 AM 07:27)

되려 공개하는게 좋지 않나요?
문제된다고 꼭꼭 숨기는건 이전같은 문제를 야기할 뿐입니다;;;
단지 버그 공개 시점에 해결책을 같이 문서해 올리는게 좋겠죠.
nzeo.com엔 버그 신고해도 안고쳐진다는 소리가 자주들리긴 하던데요;;

Comment: d3m3vilurr (2005/01/22 AM 07:27)

켈룩 이름이 잘렸...

Comment: azurespace (2005/01/22 AM 10:51)

이 버그도 신고한 지 1년이 넘은 버그입니다. 그런데 아직 안 고쳐지고 있지요. 물론, 버그를 공개하고 이걸 막을 수 있는 패치법을 공개하겠지요. 하지만 직접 제로보드를 수정할 능력이 없는 사람들은 어떻게 하지요?

Comment: 토끼군 (2005/01/22 PM 12:33)

azurespace: 프로그램에서 그 경우를 제대로 처리하지 못 한 경우에 더 가깝다. 사실은 정규표현식에서 preg_quote만 제대로 썼어도 다 해결되는 문제이기도 하지. 그리고 ftp를 쓸 줄 아는 사람이라면 충분히 고칠 능력은 있다고 생각한다. (중복 댓글은 지웠음)
d3m3vilurr: 제 생각이 그거죠... 단지 시점이 지금인 이유는, 마침 다른 버그들도 속속 공개되고 있으니까 이 때 같이 공개하는 게 패치하는 사용자를 늘리는 데 더 도움이 될 것이라는 생각 때문입니다.

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).