그누보드5 <5.2.8 검색 컬럼 취약점

2017년 6월 21일에 썼던 글인데 그 때 서버가 날아가서 기억을 바탕으로 재구성해봤습니다.

취약점 설명

diff --git a/lib/common.lib.php b/lib/common.lib.php
index 65fd95d66c..40023f6905 100644
--- a/lib/common.lib.php
+++ b/lib/common.lib.php
@@ -628,7 +628,7 @@ function get_sql_search($search_ca_name, $search_field, $search_text, $search_op
 
             // SQL Injection 방지
             // 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다.
-            $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? $field[$k] : "wr_subject";
+            $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? strtolower($field[$k]) : "wr_subject";
 
             $str .= $op2;
             switch ($field[$k]) {
...
             $str .= $op2;
             switch ($field[$k]) {
                 case "mb_id" :
                 case "wr_name" :
                     $str .= " $field[$k] = '$s[$i]' ";
                     break;
...
                 case "wr_ip" :
                 case "wr_password" :
                     $str .= "1=0"; // 항상 거짓 [1]
                     break;
                 // LIKE 보다 INSTR 속도가 빠름
                 default :
                     if (preg_match("/[a-zA-Z]/", $search_str)) // [2]
                         $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";
                     else
                         $str .= "INSTR($field[$k], '$search_str')";
                     break;
             }
             $op2 = " or ";
         }
         $str .= ")";
         $op1 = " $search_operator ";

그누보드 5에서 게시글을 검색하면 sfl 파라미터로 검색 대상 컬럼이 전달되는데, 이 때 wr_ipwr_password는 검색이 불가능하도록 [1]과 같은 검사를 거칩니다. 하지만 패치에 나와있는대로, 그누보드 5.2.8 버전 이하에서는 컬럼 이름을 필터링하기 전에 소문자로 변경하지 않았고, 따라서 WR_PASSWORDsfl 파라미터에 전달하면 게시글 내 비밀번호 해시 컬럼이 검색되는 문제가 있었습니다 [2]. 비밀번호 해시의 캐릭터셋은 0-9A-F*이며, 따라서 최대 16 * 40, 즉 640번의 검색으로 임의 사용자의 비밀번호 해시를 얻는 것이 가능해집니다.

해당 컬럼에는 DB에 있는 작성자의 비밀번호 해시가 들어있었으며, 이는 비밀글로 지정 시 비밀번호 검사에 쓰입니다. 그러나 해당 컬럼은 비밀글이 아니여도 저장되며, 비밀번호 해시가 있으면 비 관리자 계정에 한해 자동 로그인 기능을 통해 로그인이 가능합니다. 물론 비밀번호가 약한 경우 비밀번호 해시를 크랙하는 것도 가능합니다.

결론

해당 취약점은 2017.06.14에 릴리즈된 그누보드 5.2.8에서 패치되었습니다.