WordPress 취약점을 해결하는 5가지 최고의 방법

게시 됨: 2020-02-01

현재 WordPress는 웹의 33%를 차지합니다. 그것은 많은 수의 사용자가 그것을 사용하고 있음을 의미하므로 더 많은 공격자와 해커를 끌어들일 것입니다. 이로 인해 SQL Injection 공격, Redirection 공격, CSRF 공격, XSS 공격 등 워드프레스에 취약점을 일으키는 위협과 공격 이 많아지고 있다. 이러한 이유로 WordPress가 안전하지 않다는 의미는 아닙니다. WordPress를 안전하게 만들기 위해 데이터 삭제, 데이터 유효성 검사, 데이터 이스케이프, nonce 사용 및 확인, 안전한 리디렉션, 사용자 기능 등에 중점을 두어야 합니다. 그러나 WordPress의 취약점으로 인해 안전하지 않습니다. 이제 WordPress 보안 문제에 대해 논의해 보겠습니다.

취약점은 WordPress에도 나타납니다. 하지만 어떻게?

한편으로는 WordPress 취약점 으로 인한 주요 위협 및 공격이 있습니다. 반면에 WordPress 개발 중에 코드를 사용하여 이러한 공격을 극복하거나 방지해야 합니다.

WordPress 개발자가 아니더라도 해커가 사이트를 공격하도록 유인하는 주요 공격을 알 수 있으므로 게시물을 읽는 것이 좋습니다. 또한 WordPress의 잘못 코딩된 플러그인과 테마 를 아는 방법도 이해할 수 있습니다. 온라인 상점을 운영하는 경우 안전한 최고의 WooCommerce 플러그인 및 테마를 결정하는 것이 유용합니다.

내용물
1 WordPress 보안 취약점
2 위협 및 공격
2.1 WordPress 취약점 – SQL 주입 공격
2.2 데이터 삭제
2.2.1 데이터 삭제 예:
2.3 WordPress 취약점 – XSS 공격
2.3.1 XSS 공격 예:
2.4 데이터 검증
2.4.1 데이터 검증의 예:
2.5 데이터 이스케이프
2.5.1 데이터 이스케이프 예제:
2.6 WordPress 취약점 – CSRF 공격
2.7 논스 사용하기
2.8 논스 확인
2.9 WordPress 취약점 – 리디렉션 공격
2.10 안전한 리디렉션
2.11 사용자 기능 취약점
2.12 WordPress에서 항상 반환 또는 종료

워드프레스 보안 취약점

취약한 코드는 어디에서 오는가?

먼저 WordPress 보안 문제 가 어디에 있는지 잘 이해해야 합니다. WordPress는 WordPress 핵심 코드, 테마 및 Php, Html, javascript 및 기타 코드를 포함하는 플러그인으로 구성됩니다.

오픈 소스 커뮤니티는 WordPress 핵심 코드를 검사합니다. 버그를 보고하고 취약점을 수정하고 공로를 인정하는 수많은 사람들이 있습니다. WordPress의 취약점은 SQL Injection 공격, CSRF 공격, XSS 공격, Redirection 공격 및 기타 유사한 기술에 의해 악용될 수 있습니다. 따라서 핵심 개발에서 WordPress의 취약성은 많지 않습니다.

테마는 일반적으로 wp 데이터베이스와 상호 작용하지 않으며 사이트는 테마를 자주 변경합니다. Gutenberg는 WordPress의 기본 편집기이므로 더 나은 성능과 보안을 위해 Gutenberg 호환 WordPress 테마를 선택해야 합니다. 따라서 더 적은 취약점이 발생합니다.

반면에 WordPress 플러그인에는 복잡한 기능과 동작이 있습니다. 또한 사용자 및 데이터베이스와의 상호 작용이 높습니다. 이 사이트에는 외부 기능이 있는 많은 플러그인이 포함되어 있습니다. 결과적으로 사이트에 많은 취약점을 가져올 수 있습니다. 플러그인은 WordPress의 주요 취약점을 소개합니다.

WordPress 취약점 - 위협 및 공격
워드프레스 취약점 – WPscan.org

wpscan.org에 따르면 취약점의 11%는 테마에서 발생하고 취약점의 37%는 WordPress Core 개발에서 발생합니다. 마찬가지로 나머지 52%는 플러그인에서 가져옵니다. WordPress 플러그인이 무엇인지 이미 알고 있다고 가정합니다.

위협 및 공격

WP 테마 또는 플러그인 개발자인 경우 코드를 안전하게 만들고 WordPress 취약점을 줄이려면 위협 및 공격에 대해 잘 알고 있어야 합니다.

위협 및 공격-SQL 주입-XSS-CSRF-리디렉션
위협 및 공격

SQL Injection 공격, XSS 공격, Redirection 공격, 데이터 삭제, 데이터 유효성 검사, 데이터 이스케이프, nonce 사용 및 확인, 안전한 리디렉션, 사용자 기능 등으로 예방할 수 있는 CSRF 공격과 같은 많은 공격이 있습니다.

개발자의 적은 일반적으로 악의적인 사용자입니다. 그러한 사용자는 우리 코드에 해를 끼칩니다. Never Trust User Inputs를 일상적인 코딩 동작에 통합하면 이미 WordPress의 보안 문제를 줄이기 위해 더 안전한 코드를 작성하는 중간 단계입니다. 이렇게 하면 WordPress Customizer로 작업이 더 쉬워집니다.

WordPress 취약점 – SQL 주입 공격

중요하고 민감한 데이터를 검색하기 위해 SQL 주입 공격은 악성 SQL 코드를 WP 데이터베이스에 주입합니다. SQL 데이터베이스(MySQL, Oracle, SQL Server 등)를 사용하는 WordPress 사이트를 대상으로 합니다.

이러한 의도로 데이터를 쉽게 추가, 편집 또는 읽을 수 있으므로 암호, 이메일 주소 또는 민감한 데이터에 액세스할 수 있습니다.

유명한 "Bobby Tables" 만화를 예로 들 수 있습니다.

유명한 바비 테이블 Comic- Threat and Attack
유명한 바비 테이블 만화

이 만화에서 한 여성은 아들의 이름을 '로버트'로 유지합니다.) DROP TABLE 학생; -') '; 데이터베이스에 입력할 때 이름이 삭제되지 않은 경우 학교의 전체 학생 테이블을 삭제하는 SQL 명령을 사용합니다.

따라서 SQL 주입을 피하기 위해 사용자 입력 데이터를 삭제해야 합니다.

데이터 삭제에 대해 자세히 논의해 보겠습니다.

데이터 삭제

살균이란 입력 보안, 사용자 입력 정리를 의미합니다. 이 프로세스는 WordPress의 취약성을 줄이기 위해 입력에서 잘못된 텍스트, UTF-8 문자 또는 코드를 제거합니다.

HTML 특정 문자를 엔티티로 변환하고 모든 태그를 제거합니다. 또한 WordPress의 주요 보안 문제의 원인인 줄 바꿈, 탭 및 추가 공백, 스트립 옥텟을 제거합니다.

데이터를 살균하는 WordPress 내장 기능이 많이 있습니다. 그 중 몇 가지가 아래 목록에 있습니다.

  1. Sanitize_email(): 이메일에 포함되어서는 안 되는 모든 문자를 제거합니다.
  2. Sanitize_text_field(): 문자열을 삭제합니다(사용자 입력/데이터베이스에서).
  3. Sanitize_file_name(): 문자를 제거합니다(파일 이름에서).
  4. Sanitize_key(): 소문자 영숫자 문자, 대시 및 밑줄을 제외한 키를 제거합니다.

데이터 삭제 예:

 $title=sanitize_text_field($_POST['title']); update_post_meta($post->ID,'title',$title);

여기에서 처음에는 제목을 소독하고 있습니다. 삭제 후 wp 데이터베이스의 제목 값을 업데이트하고 있습니다.

 $Name= ' Robert'); DROP TABLE Students; --') '; INSERT INTO Students VALUES ('$Name'); INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --')

여기 위의 SQL 명령에서 이름에는 학생 테이블에 삽입된 문자열과 특수 문자 및 엔터티가 있습니다. 이름은 ' Robert')입니다. 그러면 insert SQL 명령이 닫히고 다른 명령이 DROP TABLE Students라는 이름의 절반으로 실행됩니다. -') '; 이 드롭 테이블 학생들은 데이터베이스의 모든 학생 레코드를 삭제합니다.

따라서 여기에서 데이터베이스에 값을 입력하기 전에 소독을 수행했다면 전체 학생 데이터베이스 테이블을 잃지 않았을 것입니다.

아래에서 살균을 수행하는 예를 살펴보겠습니다.


 $Name=sanitize_text_field("' Robert'); DROP TABLE Students; --') ';"); $sql = $wpdb->prepare("INSERT INTO Students VALUES ($Name)"); /* this will only insert 'Robert DROP TABLE Students' */ $wpdb->query($sql);

여기 위의 예에서 삭제는 이름에서 추가 엔터티와 문자를 제거하고 데이터베이스에 삽입할 문자열만 허용합니다. 이런 식으로 데이터를 안전하게 삽입할 수 있고 SQL 주입으로부터 안전합니다.

이 링크를 따라 입력 보안 에 대해 자세히 알아보세요.

WordPress 취약점 – XSS 공격

XSS(Cross-Site Scripting) 공격은 취약한 스크립팅 언어 자바스크립트 코드를 주입하여 쿠키, 세션 토큰 및 기타 정보와 같은 다른 사용자의 유사한 데이터를 훔칩니다. 쿠키 정보가 있으면 자동으로 연결할 수 있습니다. WordPress의 보안 문제는 다른 ID로 쉽게 로그인할 수 있으므로 도난된 쿠키와 함께 발생합니다.
브라우저에서 실행됩니다. 사이트를 탐색하는 수백만 명의 사람들이 이 공격의 영향을 받습니다. 의심할 여지 없이, 이 공격은 가장 심각한 공격 중 하나입니다.

XSS 공격 예:

 <script <script type=”text/javascript”>
var hacker ='../hacker.php? cookie_data=' +escape(document.cookie);
</script>
</script>

여기 이 XSS 공격 예에서 쿠키가 탈출하여 해커.php 스크립트의 변수 'cookie_data'로 전송됩니다.

공격자가 이 스크립트를 웹사이트의 코드에 삽입하면 사용자의 브라우저에서 실행되고 쿠키가 공격자에게 전송되는 위험한 문제입니다. 따라서 이를 방지하려면 유효성을 검사해야 합니다. 모든 사용자 입력 데이터의 유효성을 검사하고 삭제하고 출력 데이터를 이스케이프합니다.

아래에서 자세히 논의해보자.

데이터 유효성 검사

유효성 검사는 사용자 입력을 확인하는 것입니다. 이것은 사용자가 유효한 값을 입력했는지 확인하기 위해 수행됩니다.
내장 PHP 기능, 핵심 WordPress 기능 및 사용자 정의 기능인 데이터를 검증하는 세 가지 방법이 있습니다. WordPress 취약점을 피하기 위해 이것을 피하지 마십시오. 그 중 몇 가지가 아래 목록에 있습니다.

  1. isset()/empty(): 변수 존재 여부 확인
  2. is_email(): 주어진 데이터가 이메일 형식인지 확인
  3. is_serialized(): 값이 문자열인지 확인

데이터 검증 예:

 $number='12323'; if(intval(number)){ //do your things } else{ esc_html_e('Enter valid number','text-domain'); }

위의 예는 입력 데이터가 숫자인지 여부를 확인하고 숫자인 경우에만 프로그램을 실행합니다. 따라서 데이터 유효성 검사는 WordPress 보안 문제를 줄이는 데 도움이 됩니다.

데이터 유효성 검사 에 대해 자세히 알아보려면 이 링크를 따르세요.

데이터 이스케이프

탈출은 출력을 확보하는 것입니다. 잘못된 HTML 또는 스크립트 태그와 같은 원치 않는 데이터를 제거하는 프로세스입니다. 이스케이프는 특수 HTML 문자를 HTML 엔터티로 변환할 뿐만 아니라 실행 대신 표시합니다. 이는 XSS 공격을 방지하고 데이터가 사용자가 기대하는 대로 표시되도록 하기 위해 수행됩니다.
WordPress는 몇 가지 도우미 기능을 제공합니다. 그들은 대부분의 경우에 사용됩니다. 그 중 일부는 다음과 같습니다.

  1. esc_html(): HTML 특정 문자를 이스케이프합니다.
  2. esc_attr(): HTML 태그 속성 값을 이스케이프합니다.
  3. esc_url(): 하이퍼텍스트 REFerence 속성을 이스케이프합니다.

데이터 이스케이프 예제:

 $url = "javascript : alert ('Hello')";
<a href= "<?php echo esc_url ($url) ;?>"> Text </a> href= "<?php echo esc_url ($url) ;?>"> Text </a>

위의 예에서 해커는 스크립팅 언어 코드를 입력하여 WordPress 사이트의 보안 문제에 도전했습니다. 따라서 이를 피하기 위해 esc_url을 사용하여 URL 값을 이스케이프하고 그 후에만 코드에서 값을 에코합니다. 이러한 방식으로 XSS 공격을 방지했습니다.

WordPress 취약점 – CSRF 공격

WordPress 취약점에서 더 논의하면 Cross-Site Request Forgery 공격은 원 클릭 위협 및 공격 또는 세션 라이딩 공격입니다.
CSRF 공격은 공격자가 로그인한 사용자가 동의나 인지 없이 중요한 작업을 수행하도록 합니다.
여기서 인가된 사용자는 인가되지 않은 명령을 전송합니다.
특정 페이지나 URL로 전송된 인증된 사용자가 자신이 했는지 알지 못하는 일을 할 수 있다는 아이디어에 의존합니다. 또한 nonce와 verify nonce를 사용하여 고정할 수 있습니다.

논스 사용

WP는 nonce라는 보안 토큰을 생성합니다. 특정 작업에 사용할 수 있는 반복되지 않는 고유 번호입니다. nonce 값은 24시간 동안 유효하며 이후 만료되며 새 값은 wp에 의해 생성됩니다. nonce에 대한 유효성 검사 시간도 설정할 수 있습니다.
URL과 양식이 오용되지 않도록 보호하여 WordPress의 기존 보안 문제를 줄입니다.

또한 nonce로 폼을 보호하기 위해 wp_nonce_field() 함수를 사용하여 숨겨진 nonce 필드를 만듭니다.

 <form method="post"> <!-- some inputs here ... --> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> </form>

다음은 nonce에 대한 몇 가지 기능입니다.

  1. wp_nonce_url() – URL에 nonce를 추가합니다.
  2. wp_create_nonce() – 사용자 지정 방식으로 nonce를 사용하여 AJAX 요청을 처리합니다.

Nonce 확인

  1. check_ajax_referer() – nonce(리퍼러 아님)를 확인하고, 확인이 실패하면 기본적으로 스크립트 실행을 종료합니다.
  2. wp_verify_nonce() – nonce를 확인합니다.
 if(isset($_POST['name_of_nonce_field']) && wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action')){ //do something } else{ esc_html_e('Sorry,your nonce did not verify.','text-domain'); }

nonce 에 대해 자세히 알아보려면 이 링크를 따르세요.

WordPress 취약점 – 리디렉션 공격

WordPress 취약점으로 인해 사이트 방문자가 자동으로 악성 웹사이트로 리디렉션됩니다.
이것은 일반적으로 방문자가 요청한 페이지나 웹사이트 대신 다른 페이지로 리디렉션할 때 발생합니다.
사이트에 트래픽이 많은 경우 이 공격으로 인해 사이트에 대한 트래픽이 줄어들 수 있습니다. 사이트 방문자가 다른 페이지로 리디렉션된다는 사실조차 깨닫지 못할 것입니다. 그러나 Safe Redirect의 도움으로 해결할 수 있습니다.

안전한 리디렉션

사용자를 페이지로 리디렉션하는 경우 작업 또는 양식 후에 wp_safe_redirect를 사용하십시오. wp_safe_redirect는 허용된 호스트를 확인합니다. 호스트가 허용되지 않으면 사이트 URL로 리디렉션됩니다. 따라서 다른 호스트로의 악의적인 리디렉션을 방지합니다. 그러나 이것은 wp_redirect에 의해 확인되지 않습니다. 따라서 WordPress 보안 문제를 줄이려면 wp_safe_redirect를 사용하는 것이 링크를 리디렉션하는 더 안전한 방법입니다.

 $redirect=admin_url('edit.php'); wp_safe_redirect($redirect);

사용자 기능 취약점

Redirection 공격, XSS 공격, CSRF 공격, SQL Injection 공격 외에도 WordPress는 User Capabilities에 취약합니다. 모든 사용자가 데이터를 제출하기 위해 사이트를 방문하도록 허용하는 경우 사용자 기능을 확인하십시오. 그렇지 않으면 위협과 공격의 희생자가 될 것입니다.
사용자 역할이 높을수록 사용자는 더 많은 기능을 갖게 됩니다.
때때로 개발자는 양식을 제출하는 페이지에 있는 사용자에게 작업을 수행하는 데 필요한 권한이 있는지 확인하는 것을 잊습니다. WordPress 취약점의 공통 소스를 가져올 것입니다.

 if ( current_user_can( 'edit_posts' ) ) { edit_post_link( esc_html__( 'Edit', 'wporg' ), '', ''); }

Contact Form 7 취약점 (WordPress 취약점 유형)의 예를 들어보겠습니다.

이 플러그인의 활성화 수는 500만 명 이상의 사용자입니다. 취약한 코드가 하나만 있으면 500만 명이 넘는 사람들에게 영향을 미칩니다.

권한 취약점-연락처 양식 7
문의 양식 7의 권한 취약성

5.0.3 및 이전 버전에는 기능 취약점이 있었습니다. 기고자 역할로 로그인한 사용자는 연락처 양식을 쉽게 편집할 수 있습니다. 기본적으로 관리자 및 편집자 역할 사용자만 액세스할 수 있었습니다.
그래서 해킹당할 가능성이 더 커졌다. 플러그인의 새 버전은 이러한 오류를 해결했습니다.

WordPress에서 항상 반환 또는 종료

함수 또는 아약스 호출을 작성하는 동안 코드 완료 후 반환을 놓쳤거나 죽는 경우. 간단해 보이지만 중요한 보안 문제로 이어질 수 있습니다.

항상 반환을 추가했는지 확인하고 의도한 위치에서 죽습니다. Apple의 #gotofail 버그를 예로 들 수 있습니다.

 defined( 'ABSPATH' ) defined( 'ABSPATH' ) or die ( "No script kiddies please!" );
function function adls_view() { global $wpdb; { global $wpdb;
            include( 'inc/frontend/smls-detail/smls-grid-inline.php' );
           exit(); }
function function adls_generate_random_string ( $length ){
           $string = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $random_string = '';
            for ( $i = 1; $i <= $length; $i ++ ) { { $random_string .= $string[ rand( 0, 61 ) ];
            }
           $random_string; return 합니다.
       }
 }

마무리

보안에 신경쓰는 워드프레스 전문가들에게 중요한 포스팅이었습니다. 이 게시물에서 WordPress에 취약성을 가져오는 다양한 위협과 공격에 대해 배웠습니다. 여기에는 SQL 주입 공격, XSS 공격, CSRF 공격, 리디렉션 공격 등에 대한 간략한 소개가 포함됩니다.

검증-위생-이스케이프-Nonce
기억할 점

데이터 삭제, 데이터 유효성 검사, 데이터 이스케이프, nonce 사용 및 확인, 안전한 리디렉션 및 사용자 기능과 같은 다양한 기술도 논의되었습니다. 이로 인해 WordPress에는 보안 문제가 있습니다.

결론적 으로,

  1. WordPress 취약점을 피하기 위해 사용자 입력을 절대 신뢰하지 마십시오.
  2. 모든 입력을 확인하고 삭제하고 모든 출력 데이터를 이스케이프합니다.
  3. 워드프레스를 믿으세요!

위에서 언급한 위협 및 공격과 관련하여 문제에 직면했다면 이에 대해 알려주십시오. 당사의 전문가가 문제에 따라 적합한 솔루션을 제공합니다.