WordPress의 컨텐츠 주입 취약점
보안 위험 : 심각
착취 수준 : 쉬운 / 원격
드레드 점수 : 9/10
취약점 : 권한 상승 / 내용 주입
패치 된 버전 : 4.7.2
Sucuri Firewall (WAF) 의 취약성 연구 프로젝트의 일환 으로 보안 문제를 찾는 여러 오픈 소스 프로젝트를 감사했습니다. WordPress에서 작업하면서 REST API에 영향을 미치는 심각한 콘텐츠 삽입 (권한 상승) 취약점을 발견했습니다. 이 취약점으로 인해 인증되지 않은 사용자 는 WordPress 사이트 내의 모든 게시물이나 페이지의 내용 을 수정할 수 있습니다.
우리는 WordPress Security Team에 취약점을 공개하여 매우 잘 처리했습니다. 그들은 우리와 긴밀히 협력하여 공개 일정을 조정하고 공개하기 전에 많은 호스트 및 보안 공급자가이를 인식하고 패치하도록했습니다.
이것에 대한 수정 사항은 다른 덜 심각한 문제와 함께 버전 4.7.2 에 자동으로 포함되었습니다 . 이것은 모두에게 패치 할 시간을주기 위해 의도적으로 수행되었습니다. 우리는 대부분의 WordPress 사용자가 사이트를 업데이트 할 충분한 시간이 있었기 때문에 세부 정보를 공개합니다.
이 권한 상승 취약점 은 최근에 추가되어 WordPress 4.7.0에서 기본적으로 활성화 된 WordPress REST API 에 영향을줍니다 .
이러한 REST 엔드 포인트 중 하나는 API를 통한 액세스를 통해 게시물을보고, 편집하고, 삭제하고 작성합니다. 이 특정 엔드 포인트 내에서 미묘한 버그로 방문자가 사이트의 모든 게시물을 편집 할 수 있습니다 .
나머지 API는 워드 프레스 사용하는 모든 사이트에서 기본적으로 활성화되어 4.7.0 또는 4.7.1 . 귀하의 웹 사이트가 이러한 버전의 WordPress에있는 경우 현재이 버그에 취약합니다.
기술적 세부 사항
우리의 여정은 시작됩니다. /wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
여기서 주목해야 할 몇 가지 점이 있습니다. 등록 된 경로는 ID 요청 매개 변수에 숫자 를 채우도록 설계되었습니다 . 당신이에 요청 전송하는 경우 예를 들어, / WP-JSON / WP / V2 / 글 / 1234 – ID의 매개 변수로 설정 될 것이다 1234 .
이 동작만으로 공격자가 악의적 인 ID 값 을 만드는 것을 방지 할 수있는 좋은 방법 일 수 있지만 REST API가 액세스를 관리하는 방법을 살펴볼 때 경로의 정규 표현식에 의해 생성 된 값보다 $ _GET 및 $ _POST 값이 우선적으로 우선 함을 발견했습니다. 이렇게하면 공격자가 / wp-json / wp / v2 / posts / 1234? id = 12345helloworld 와 같은 요청을 보낼 수 있습니다. 이는 ID 매개 변수 에 12345helloworld 를 할당 합니다.
더 자세히 살펴보면 위의 스크린 샷에서 다양한 콜백을 살펴 보았습니다. 하나는 update_item 과 update_item_permissions_check의 권한 검사 메소드 입니다 .
즉, 우리의 영숫자 ID 값을 get_post () 함수에 직접 전달 합니다. 이 함수 는 게시물이 실제로 존재 하는지 여부 와 사용자가이 게시물을 편집 할 권한이 있는지 여부 를 확인 하여 요청의 유효성을 검사합니다 . 우리는 이것이 이것이 요청을 위생적으로 정리하는 흥미로운 방법이라는 것을 알았습니다. 해당 게시물이없는 ID 를 보내면 권한 검사를 통과하고 update_item 메소드 에 대한 요청을 계속 실행할 수 있습니다 !
( 존재하지 않는 ID 가 아닌) 게시물을 찾을 때 get_post () 가 실패 할 수 있다는 점이 궁금하다면 wp_posts 의 get_instance () 정적 메서드를 사용하여 게시물 을 가져 오는 것을 알게 되었습니다.
코드에서 볼 수 있듯이 기본적으로 모든 숫자로 이루어진 입력이 아닌 경우 실패합니다. 따라서 123ABC 가 실패합니다.
공격자의 경우 WordPress는이 게시물을 편집 할 충분한 권한이있는 사용자라고 생각하면 update_item 메서드 가 실행 됩니다.
이 방법이 무엇인지 확인하는 것이 합리적이라고 생각했습니다.
그 마지막 스크린 샷에는 매우 미묘하면서도 중요한 세부 사항이 있습니다. WordPress는 get_post에 전달하기 전에 ID 매개 변수를 정수 로 변환합니다 !
이는 PHP가 유형 비교 및 변환을 수행하는 방식 때문에 문제가됩니다. 예를 들어 다음 스 니펫 이 123을 반환 한다는 것을 알 수 있습니다 .
이로 인해 공격자가 / wp-json / wp / v2 / posts / 123? id = 456ABC 와 같은 요청을 제출하여 ID가 456 인 게시물 을 변경할 수있는 매우 위험한 상황이 발생합니다 !
이러한 유형의 저글링 문제 로 인해 공격자 는 피해 사이트에서 게시물이나 페이지 의 내용을 변경할 수 있습니다. 거기에서 플러그인 별 단축 코드를 추가하여 취약성 (참여자 역할로 제한되는)을 악용하거나, 사이트 콘텐츠를 SEO 스팸 캠페인으로 감염 시키거나, 광고 등을 삽입 할 수 있습니다.
사이트에서 사용할 수있는 플러그인에 따라 PHP 코드조차도 매우 쉽게 실행될 수 있습니다.
결론적으로
웹 사이트에서 자동 업데이트를 활성화하지 않은 경우 가능한 한 빨리 업데이트하십시오!
이 취약점은 여러 가지 방법으로 악용되어 취약한 사이트를 손상시킬 수있는 심각한 취약점입니다. 지금 업데이트하십시오!