메뉴 건너뛰기

Hello :0

2017.2.2 워드프레스 관련 취약점 Exploit-DB에 공개 되었다.

Poc 코드 공개 이후 해당 취약점을 이용해서 웹 사이트 게시물을 변조 하는 행위가 크게 늘었다.

 

1.png

웹 사이트 위 건수 급증가, 해당 사이트들을 살펴 보던 도중 워드프레스를 사용 하는 것으로 확인 되었고,

이공격으로 인해 해외는 물론 국내의 다수 워드프레스를 사용하는 사이트의 게시물이 변조되었고 그중은 국내 보안 업체인 S사와  대기업인 S 기업 홍보 사이트도 존재하였다.

 

이번 취약점은 POC공개 이전에 업데이트가 되었으나, 업데이트를 이루어지지 않는 사이트가 많아 단기간에 위변조가 많이 발생했다. Wordpress 엔진에서 기본적으로 제공하는 RestAPI와 관련된 부분이라 피해의 범위가 광범위 했다.

 

http://www.exploit-db.com/exploits/41223/ poc 코드를 살펴보면 크게 3부분으로 나누어져 있다.

 

2.png

먼저 사이트에서 wordpress 사용 여부 확인 밑 rest api url 획득한다.

 

3.png

워드프레스를 사용할 경우 메인 페이지에서 <link rel='http://api.w.org/' href='http://192.168.1.2/wordpress/wp-json/' /> 확인하여 api baser url을 가져온다.

 

4.png

http://192.168.1.2/wordpress/wp-json/wp/v2/posts의 형태를 이용해 전체 포스팅 목록을 가져 올 수 있다.

 

5.png

원하는 포스팅을 선택하여 post로 데이터를 전생해주면 웹 사이트의 내용이 변조 된다.

 

6.png

코드 실행 후 변조 확인 가능.

 

7.png

취약한 살펴 보면 Class-wp-rest-posts-controller.php 파일은 restapi의 라우팅 정보를 제공한다. 여기서 update_item_permissions_check 함수에 취약점이 존재 한다.

 

8.png

먼저 라우팅에 존재하는 update_item의 함수를 살펴보자 id값이 들어오면 빨간 네모안에 보는듯이 int형으로 변경된다 $id에는 4abc의 비정상 값이 들어와도 4가 나오고 정상적으로 포스팅 내용을 가져 올 수 있다.

 

9.png

위 사진에서도 $post 변수에는 게시물 id를 가져오는데 별도의 처리 없이 바로 권한 체크를 한다.  post_id뒤에 abc와 같은 문자열이 있는경구 $post는 존재하지 않는 것으로 인식되고 null이 된다.

첫번쨰 if 구문의 $post && ! $this->check_update_permission( $post )에서 check_update_permission의 값이 False로 결국에는 null && !False로 결과는 False이다. 이것으로 인해 게시물 업데이트를 하기위한 인증을 우회해서 할 수 있다.

 

10.png

원래는 get_post를 wordpress\wp-includes\post.php 를 사용했으나 패치 후에는  Class-wp-rest-posts-contorller.php의 get_post 함수에서 한번 id값을 확인 후 post 내용을 얻어 오도록 변경되었다.

 

11.png

왼쪽은 wordpress 4.7 이고 오른쪽은 4.72버전 id 값에 대한 검증을 하는 것을 확인 할 수 있다.