詳細検索

작성자 쿼리를 이용해 워드프레스 사용자 이름 유출을 방지하는 방법

아바타
글쓴이 maeno

작성자 쿼리를 이용해 워드프레스 사용자 이름 유출을 방지하는 방법
日本語에서 번역 • 원문 보기

DEVLAB은 워드프레스에서 운영되며, 워드프레스에 관한 한 기사가 제 관심을 끌었습니다. 워드프레스 사이트의 홈 URL에 "?author=x"라는 GET 쿼리를 추가하면 사이트 내 사용자 이름이 공개 됩니다( 자세한 내용은 MT Systems의 워드프레스 팁 참고). '?author=x'의 x는 숫자이며, 워드프레스 사용자 ID(사용자 테이블의 기본 키)가 됩니다. 즉, x에 1을 지정하면 워드프레스 루트 관리 사용자가 됩니다. 저는 즉시 DEVLAB에서 시도해보니 'https://dev.blog.colorkrew.com?author=1'이 퍼머링크 설정에 명시된 리라이트 규칙에 따라 다시 작성되어 <ルート管理ユーザー名>'https://blog.colorkrew.com/author//'로 리디렉션되었습니다. 이런 상황이 계속되면 비밀번호가 무차별 대입될 것이고, 로그인이 성공하면 사이트가 해킹될 것입니다! 하지만 DEVLAB의 경우, 워드프레스의 일반 로그인 화면 'wp-login.php'이 비활성화되어 있어 로그인 방법을 찾기 어려워 당분간은 안전합니다. 하지만 사용자 이름 유출을 방지하는 취약점을 막아야 하므로 대응책을 검토해 왔습니다.

MT Systems 사이트에서 소개된 바와 같이, 작성자의 아카이브 페이지에 있는 템플릿 'author.php'로 리디렉션 방식이 HTTP 응답 헤더의 리디렉션 위치로 사용자 이름을 출력하므로, '.htaccess'에 리라이트 규칙을 추가하더라도 이를 막을 수 없는 문제가 발생합니다. MT Systems 웹사이트는 사용자 데이터의 'user_nicename'을 로그인 계정 'user_login'과 다른 값으로 재작성하는 방안을 게시했으나, 관리자 패널에서 직접 편집할 수 없는 항목이기 때문에 매우 어렵습니다.

좀 더 쉽게 처리할 수 있지 않을까... ──그래서 나만의 대응책을 만들려고 했어.

워드프레스에서 작성자 쿼리에 의한 사용자 이름 유출을 방지하세요. 
함수 knockout_author_query() { 
    저자 재작성 규칙을 비활성화하세요
    전역 $wp_rewrite; 
    $wp_rewrite->flush_rules(); 
    $wp_rewrite->author_base = ''; 
    $wp_rewrite->author_structure = '/'; 
    저자 문의 요청에 대해
    if (isset($_REQUEST['author']) & !empty($_REQUEST['author'])) { 
        $user_info = get_userdata(intval($_REQUEST['author'])); 
        if ($user_info && array_key_exists('administrator', $user_info->caps) && in_array('administrator', $user_info->roles)) { 
            wp_redirect(home_url()); 
            출구; 
        } 그렇지 않으면 { 
            저자 재작성 규칙 활성화
            $wp_rewrite->author_base = '저자'; 
            $wp_rewrite->author_structure = '/author/%author%/'; 
        }
    }
}
add_action('init', 'knockout_author_query'); 

위 소스를 테마의 'function.php' 같은 곳에 추가하면 즉시 활성화할 수 있습니다.

프로세스 내용에 관해서는, 퍼머링크 설정에서 기본값이 아닌 다른 설정을 재작성한 사이트의 경우, 먼저 WP_Rewrite 프로세스를 덮어쓰고 저자 아카이브의 재작성을 도메인 바로 아래에 있는 균일한 TOP 페이지('/')로 변경합니다. 다음으로, '?author=x'로 쿼리를 검색할 때, 쿼리에 지정된 사용자 ID가 관리자 권한이 있는 사용자라면 TOP 페이지로 다시 작성됩니다(고정 링크 설정이 기본값에서 변경된 경우, 기본값일 경우 리디렉션됩니다). 비관리자 사용자라면 저자 아카이브가 표시됩니다. 이 경우, 'author.php' 템플릿 등이 포함된 헤더를 보내면 리디렉션이 아니므로, 리디렉션(또는 재작성)되더라도 위치는 HTTP 응답 헤더로 출력되지 않습니다.

?author=1 시 HTTP 요청 헤더

GET /?author=1 HTTP/1.1
진행자: devlab.isao.co.jp
연결: 킵-어라이브
수락: text/html, application/xhtml+xml, application/xml;q=0.9,image/webp,*/*; q=0.8
사용자 에이전트: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 게코와 유사) Chrome/37.0.2062.120 Safari/537.36
수락-인코딩: gzip, deflate, sdch
수용-언어: ja, en-us; q=0.8,en; q=0.6
쿠키: (생략됨)

?author=1 시 HTTP 응답 헤더를 요청할 때

HTTP/1.1 302 발견
날짜: 2014년 9월 12일 금요일 08:07:24 GMT
서버: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11
X-Powered-By: PHP/5.5.11
위치: https://dev.blog.colorkrew.com
내용-길이: 0
킵-어라이브: 타임아웃=5, 최대 =100
연결: 킵-얼라이브
콘텐츠 유형: 텍스트/HTML

하지만 이 자체만으로도 보안 조치가 허술하며, 관리자가 아닌 사용자가 저자 아카이브를 표시하면 그 사용자의 사용자 이름이 표시됩니다. 따라서 결국 사용자 정보의 'user_nicename'이 'user_login' 값과 다른 값으로 설정되지 않으면 로그인 계정에서 강제 삭제되어 비밀번호 무차별 대입 공격을 당할 위험이 남아 있습니다. 관리자 사용자의 로그인 계정은 유출되지 않으므로 최악의 피해는 아니지만, 사이트 변조는 쉽게 할 수 있으니 저자 아카이브 기능을 사용하려면 'user_nicename'도 변경하는 것이 좋습니다. 사이트가 저자 아카이브를 사용하지 않는다면, 이전 소스에서 해당 처리 부분을 삭제하고 다음 작업을 할 수 있습니다.

워드프레스에서 작성자 쿼리에 의한 사용자 이름 유출을 방지하세요. 
함수 knockout_author_query() { 
    저자 재작성 규칙을 비활성화하세요
    전역 $wp_rewrite; 
    $wp_rewrite->flush_rules(); 
    $wp_rewrite->author_base = ''; 
    $wp_rewrite->author_structure = '/'; 
    저자 문의 요청에 대해
    if (isset($_REQUEST['author']) & !empty($_REQUEST['author'])) { 
        $user_info = get_userdata(intval($_REQUEST['author'])); 
        if ($user_info && array_key_exists('administrator', $user_info->caps) && in_array('administrator', $user_info->roles)) { 
            wp_redirect(home_url()); 
            출구; 
        }
    }
}
add_action('init', 'knockout_author_query'); 

이 경우 저자 아카이브는 어떤 사용자에게도 표시되지 않으며, 사용자 이름이 TOP 페이지로 리디렉션되므로 '?author=x' 쿼리로 인한 사용자 이름 유출 위험은 없습니다. DEVLAB은 이에 대해 조치를 취하고 있습니다.

또한, 퍼머링크 설정에서 rewrite를 활성화했다면, '/author/' 경로에 대한 접근을 비활성화하면 보안이 더욱 강화되므로, 여기서도 조치를 취하시길 권장합니다('.htaccess'에 다음 재작성 규칙을 추가하세요).

리라이트 규칙 ^author/(.*)? / [R=302,L]

참고 링크

Related Articles