그누보드의 취약점 수정(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의 페이지로 보여지게 될 것이다.
다음페이지를 넘어간다면 토큰의 검사를 하지않고 다른 인증도 없다면
매우 취약할 것 이므로
페이지에서 토큰검사를 하고 가는 것 으로 보여진다.