Skip to content
Permalink
Browse files

1.3.1 - 그누보드 4.37.27

4.37.27 (2015.05.13)

: 로그인 검사시 Magic Hash 취약점이 발견되어 수정 (빈경윤님께서 알려주셨습니다.)

국내 기사) http://www.boannews.com/media/view.asp?idx=46219&kind=4
취약점 발표) https://blog.whitehatsec.com/magic-hashes/

동작 환경)
비밀번호 해시값이 '0e' + '숫자로만 생성'되었을 경우, 미리 알고 있는 Magic Hash 값을 통해 아무나 로그인할 수
있게 됩니다.
그누보드에서는 mysql 의 password()함수로 hash 하므로,
mysql 4.1 이전 버전이거나 old_password 설정이 활성화된 상태에서만 취약합니다.

해결방법)
아래처럼 비밀번호 비교 구문을 모두 찾아, 동등 연산자(!=)를 일치 연산자(!==)로 변경해주시기만 하면 됩니다.

bbs/login_check.php 의

if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {

를

if (!$mb[mb_id] || (sql_password($mb_password) !== $mb[mb_password])) {

로 수정하세요.
  • Loading branch information...
open2 committed May 19, 2015
1 parent ea0a8d7 commit 5d5bc44b0aedefb28a1b10cfed87c138974e4116
@@ -7,7 +7,7 @@
auth_check($auth[$sub_menu], "w");
if ($member[mb_password] != sql_password($_POST['admin_password'])) {
if ($member[mb_password] !== sql_password($_POST['admin_password'])) {
alert("패스워드가 다릅니다.");
}
@@ -9,7 +9,7 @@
if ($is_admin != "super")
alert("최고관리자만 접근 가능합니다.");
if ($member[mb_password] != sql_password($_POST['admin_password'])) {
if ($member[mb_password] !== sql_password($_POST['admin_password'])) {
alert("패스워드가 다릅니다.");
}
@@ -8,7 +8,7 @@
if ($is_admin != "super")
alert("최고관리자만 접근 가능합니다.", $g4[path]);
if (!($mb_password && sql_password($mb_password)==$member[mb_password]))
if (!($mb_password && sql_password($mb_password)===$member[mb_password]))
alert("최고관리자 패스워드가 틀립니다.");
// 테이블 생성 ------------------------------------
@@ -6,7 +6,7 @@
check_token();
if ($member[mb_password] != sql_password($_POST['admin_password'])) {
if ($member[mb_password] !== sql_password($_POST['admin_password'])) {
alert("패스워드가 다릅니다.");
}
@@ -31,7 +31,7 @@
} else {
if ($write[mb_id])
alert("로그인 후 삭제하세요.", "./login.php?url=".urlencode("./board.php?bo_table=$bo_table&wr_id=$wr_id"));
else if (sql_password($wr_password) != $write[wr_password])
else if (sql_password($wr_password) !== $write[wr_password])
alert("패스워드가 틀리므로 삭제할 수 없습니다.");
}
@@ -60,7 +60,7 @@
{
;
}
else if ($wr_password && !$write[mb_id] && sql_password($wr_password) == $write[wr_password]) // 패스워드가 같다면
else if ($wr_password && !$write[mb_id] && sql_password($wr_password) === $write[wr_password]) // 패스워드가 같다면
{
;
}
@@ -40,7 +40,7 @@
if ($member[mb_id] != $write[mb_id])
alert("자신의 글이 아니므로 삭제할 수 없습니다.");
} else {
if (sql_password($wr_password) != $write[wr_password])
if (sql_password($wr_password) !== $write[wr_password])
alert("패스워드가 틀립니다.");
}
@@ -22,7 +22,7 @@
// 가입된 회원이 아니다. 패스워드가 틀리다. 라는 메세지를 따로 보여주지 않는 이유는
// 회원아이디를 입력해 보고 맞으면 또 패스워드를 입력해보는 경우를 방지하기 위해서입니다.
// 불법사용자의 경우 회원아이디가 틀린지, 패스워드가 틀린지를 알기까지는 많은 시간이 소요되기 때문입니다.
//if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password]))
//if (!$mb[mb_id] || (sql_password($mb_password) !== $mb[mb_password]))
//if (!$mb[mb_id] || ($check_password !== $mb[mb_password] and sql_old_password($mb_password) !== $mb[mb_password])) {
$login_check=0;
@@ -13,7 +13,7 @@
// 회원정보를 가져 옵니다
$mb = get_member($mb_id, "mb_name, mb_password");
if (!$mb_id || !$mb_name || !$mb_password || $mb_name != $mb[mb_name] || (sql_password($mb_password) != $mb[mb_password] and sql_old_password($mb_password) != $mb[mb_password]))
if (!$mb_id || !$mb_name || !$mb_password || $mb_name != $mb[mb_name] || (sql_password($mb_password) !== $mb[mb_password] and sql_old_password($mb_password) !== $mb[mb_password]))
alert("회원아이디/비밀번호가 틀리거나 정상적인 접근이 아닌것 같습니다.");
// 회원탈퇴일과 탈퇴사유를 저장
@@ -7,7 +7,7 @@
if ($is_admin == "super")
alert("최고 관리자는 탈퇴할 수 없습니다");
if (!($_POST[mb_password] && $member[mb_password] == sql_password($_POST[mb_password])))
if (!($_POST[mb_password] && $member[mb_password] === sql_password($_POST[mb_password])))
alert("패스워드가 틀립니다.");
// 회원탈퇴일을 저장
@@ -6,7 +6,7 @@
$wr = get_write($write_table, $wr_id);
if (sql_password($wr_password) != $wr[wr_password])
if (sql_password($wr_password) !== $wr[wr_password])
alert("패스워드가 틀립니다.");
// 세션에 아래 정보를 저장. 하위번호는 패스워드없이 보아야 하기 때문임.
@@ -60,7 +60,7 @@
sql_query($sql);
} else if (!$member[mb_id]) {
$result = sql_fetch(" select pc_password from $g4[poll_etc_table] where pc_id = '$pc_id' and po_id = '$po_id' ");
if (sql_password($wr_password) != $result['pc_password'])
if (sql_password($wr_password) !== $result['pc_password'])
alert("패스워드가 틀립니다.");
$sql = " delete from $g4[poll_etc_table] where pc_id = '$pc_id' and po_id = '$po_id' and pc_password = '" . sql_password($wr_password) . "'";
@@ -71,9 +71,9 @@
if ($member[mb_id] != $mb_id)
alert("로그인된 회원과 넘어온 정보가 서로 다릅니다.");
//if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]))
//if (!($member[mb_password] === sql_password($_POST[mb_password]) && $_POST[mb_password]))
/*
if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
if (!($member[mb_password] === sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
alert("패스워드가 틀립니다.");
// 수정 후 다시 이 폼으로 돌아오기 위해 임시로 저장해 놓음
@@ -90,7 +90,7 @@
$tmp_password_old = sql_old_password($_POST['mb_password']);
}
//if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
//if (!($member[mb_password] === sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
if ($_POST['is_update']) {
if ($member['mb_password'] != $tmp_password)
alert("패스워드가 틀립니다.");
@@ -330,7 +330,7 @@
if (!$is_admin) {
if (!($member[mb_id] && $member[mb_id] == $write[mb_id]))
if (sql_password($wr_password) != $write[wr_password])
if (sql_password($wr_password) !== $write[wr_password])
alert("패스워드가 틀립니다.");
}

0 comments on commit 5d5bc44

Please sign in to comment.
You can’t perform that action at this time.