그누보드의 취약점 수정(17.12.12)부분


그누보드는 adm/member_list_update.php에

check_admin_token();

함수를 추가했다.


그렇다면 우선 check_admin_token()함수를 찾아보자.

// POST로 넘어온 토큰과 세션에 저장된 토큰 비교

function check_admin_token()

{

    $token = get_session('ss_admin_token');

    set_session('ss_admin_token', '');


    if(!$token || !$_REQUEST['token'] || $token != $_REQUEST['token'])

        alert('올바른 방법으로 이용해 주십시오.', G5_URL);


    return true; 


소스를 보면

get_session과 set_session의 함수를 쓰고 있다.

또한 token은 get_session으로 값을 받는다.

마지막으로 token값이 없거나 _REQUEST['token']값이 없거나 둘이 다를 경우

경고문이 뜬다.


그렇다면 get_session함수와 set_session함수를 찾아보자.

// 세션변수 생성

function set_session($session_name, $value)

{

    if (PHP_VERSION < '5.3.0')

        session_register($session_name);

    // PHP 버전별 차이를 없애기 위한 방법

    $$session_name = $_SESSION[$session_name] = $value;

}



// 세션변수값 얻음

function get_session($session_name)

{

    return isset($_SESSION[$session_name]) ? $_SESSION[$session_name] : '';

}


set_session함수는 session_name과 value로 값을 받는다.

받은 session_name값을 session_register()에 넣어주는데 

이 함수는 하나 이상의 전역 변수를 세션에 등록해 주는 역할을 한다.

그리고 밑의 $$session_name=$_SSESION[$session_name]=$value는 버전 차이를 없애 준다고 한다.


get_session함수는 session_name을 받아

세션에 session_name변수가 존자하면 그 값을 return시켜준다고 한다.


그렇다면 check_admin_token함수는 

ss_admin_token값이 존재하는지를 확인하고

존재하는지 있으면 그 값을 없으면 0을 token에 저장한 뒤

request로 현재의 token과 비교하여

접속자가 실제의 권한을 가진사람인지를 확인 해 주는 역할을 하는 것으로 판단 되어 진다.


이 토큰을 확인 해 주는 이유는 


Session Hijacking 때문일 것으로 생각된다.


Session Hijacking이란 

보통 밑의 그림처럼 Web Client 와 Web Server가 인증을 맺고 통신을 한다.

하지만 밑의 그림처럼 공격자가

토큰을 중간에 가로챈다면

이는 해킹을 할 수 있는 여지를 준 것이다.

탈취 되어진 토큰으로 공격자가 인증을 하면 그 페이지는 아마

토큰의 주인 여기서는 admin의 페이지로 보여지게 될 것이다.

다음페이지를 넘어간다면 토큰의 검사를 하지않고 다른 인증도 없다면

매우 취약할 것 이므로

페이지에서 토큰검사를 하고 가는 것 으로 보여진다.


+ Recent posts