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_postsget_instance () 정적 메서드를 사용하여 게시물 을 가져 오는 것을 알게  되었습니다.

코드에서 볼 수 있듯이 기본적으로 모든 숫자로 이루어진 입력이 아닌 경우 실패합니다. 따라서 123ABC 가 실패합니다.

공격자의 경우 WordPress는이 게시물을 편집 할 충분한 권한이있는 사용자라고 생각하면 update_item 메서드 가 실행  됩니다.

이 방법이 무엇인지 확인하는 것이 합리적이라고 생각했습니다.

그 마지막 스크린 샷에는 매우 미묘하면서도 중요한 세부 사항이 있습니다. WordPress는 get_post에 전달하기 전에 ID 매개 변수를 정수  로 변환합니다 !

이는 PHP가 유형 비교 및 ​​변환을 수행하는 방식 때문에 문제가됩니다. 예를 들어 다음 스 니펫 이 123을 반환 한다는 것을 알 수 있습니다 .

이로 인해 공격자가 / wp-json / wp / v2 / posts / 123? id = 456ABC 와 같은 요청을 제출하여 ID가 456 인 게시물  을 변경할 수있는 매우 위험한 상황이 발생합니다  !

이러한 유형의 저글링 문제 로 인해 공격자 는 피해 사이트에서 게시물이나 페이지 의 내용을 변경할 수  있습니다. 거기에서 플러그인 별 단축 코드를 추가하여 취약성 (참여자 역할로 제한되는)을 악용하거나, 사이트 콘텐츠를 SEO 스팸 캠페인으로 감염 시키거나, 광고 등을 삽입 할 수 있습니다.

사이트에서 사용할 수있는 플러그인에 따라 PHP 코드조차도 매우 쉽게 실행될 수 있습니다.

결론적으로

웹 사이트에서 자동 업데이트를 활성화하지 않은 경우 가능한 한 빨리 업데이트하십시오!

이 취약점은 여러 가지 방법으로 악용되어 취약한 사이트를 손상시킬 수있는 심각한 취약점입니다. 지금 업데이트하십시오!