CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户在已认证网站上的身份,本质上是利用网站的同源策略对该网站执行非本意操作的攻击方式。下面是其原理和攻击方式的详细说明:
🔍 原理
CSRF 利用的是网站的信任。假设用户已经登录了网站 A,并且浏览器保存了网站 A 的 cookie。那么此时:
-
用户访问攻击者构造的恶意页面; -
该页面在用户不知情的情况下向网站 A 发起请求; -
浏览器会自动附带 cookie(比如 session cookie); -
网站 A 认为请求是合法用户发起的; -
攻击者成功诱使网站 A 执行了用户本不想执行的操作。
🧨 攻击方式
1. GET 类型 CSRF
攻击者构造一个带参数的链接:
<img src="http://bank.com/transfer?to=attacker&amount=1000" />
用户只要打开该页面,浏览器就会自动请求这个图片(其实是银行转账接口),从而完成攻击。
2. POST 类型 CSRF
通过隐藏的表单 + JavaScript 自动提交:
<form action="http://bank.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>
3. 通过 AJAX(有限)
因为同源策略,CSRF 通常不能直接使用 XMLHttpRequest
或 fetch
读取响应,但可以发起请求(如 POST)。
🔐 防御手段(简要)
-
CSRF Token:为每个用户请求生成一个唯一且不可预测的 token,嵌入表单中进行验证; -
SameSite Cookie:设置 Set-Cookie: sessionid=xxx; SameSite=Strict
,禁止跨站携带 cookie; -
Referer / Origin 检查:后端校验请求头的 Referer
是否是本站; -
双重验证操作:例如转账需要密码/验证码等。
pikachu靶场的crsf攻击
GET型csrf
1.get 型的 CSRF,漏洞点可能在 url 中。进来⾸先要登录,不知道账号密码,点⼀下提示
2.提示已经告诉我们密码了,所以我们试一下登录vince 吧,登录进去显示了 vince 的个人信息,并且最下面有个修改个人信息的链接,点一下
3.住址改成 france,然后点 submit,发现 url 没变化,点击提交之后就跳转到上图这个显示人信息的页面了,住址也修改成功了。
4.回到 burpsuite,查看刚提交地址数据(有用户信息)的过程,burpsuite拦截的数据包,从数据包中的url可以看出,修改用户信息的时候,是不带任何不可预测的认证信息的,那么,这里应该是可以被利用的。发到重发器,修改为其他手机号码,然后放开拦截。手机号成功被更改,攻击成功
POST型CSRF
1.进来也是需要登录,我们先试一下登录lucy账号
2.把性别改成boy再提交,查看bp抓的数据包的url有什么特点
3.从上图的请求报文来看,和前面⼀样,没有不可预测的认证信息,可以被利用。我们和前面一样发送到重发器,修改电话号码,返回靶场页面,发现电话号码成功被修改,攻击成功!
DVWA靶场的crsf攻击
GET型的crsf
1.修改靶场的安全等级为low
2.找到 csrf,这里可以进行一个修改密码的实验,这个地方直接就是输入新密码,没有输入原密码的输入框,那么这地方很容易出现 csrf 漏洞,如果需要输入原密码,那么 csrf 就搞不定了,因为有一个数据库校验过程,我们做 csrf 渗透的时候,不知道原密码是什么的。
3.查看csrf的源代码,发现服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现)
4.输入新的密码之后就会在地址栏出现相应的链接(是get型所以提交的参数会显示),并提示密码修改成功(123456)
5.在同一个浏览器中打开新的页面将上面的链接,把参数password_new与password_conf都改为123,到地址栏并进行访问,此时成功访问
6.然后在没有退出原本的登录的情况下(这其实就是真实攻击时,比如,用户登录了京东,在没有退出京东(或身份认证信息还未过期时)打开了新的(攻击者设计好的修改京东登录密码的链接),就会把京东的密码改了),新打开的页面地址栏修改链接的密码为123(原本为123456)并回车,新页面会显示密码修改成功,此时退出登录后重新登录会发现登录密码变为新的123而123456无法登陆:
构造恶意链接
1.生成短链接:https://www.urlc.cn/,访问该网址也是一样的页面。如果用户在没有登陆过这个网站的浏览器上打开这个链接,并不会更改密码,而是跳转到登录界面。因为服务器在接受访问时,首先还要验证用户的cookie,如果浏览器上并没有之前登录留下的cookie,那攻击也就无法奏效。所以CSRF攻击的关键就是利用受害者的cookie向服务器发送伪造请求。
bp生成恶意页面
2.真实CSRF攻击中,攻击者为了隐藏自己的攻击手段,可能构造一个假的页面,然后放在公网上,诱导受害者访问这个页面,如果受害者访问了这个页面,那么受害者就会在不知情的情况下完成了CSRF攻击。自己测试可以写一个本地页面,也可以利用burpsuit直接生成攻击页面代码。方法如下: 抓取更改密码的数据包,利用engagement tools生成CDRF POC,访问点击提交之后就可以更改密码。
3.复制该代码,保存为test.html
4.用IE浏览器打开,点击提交改密码,发现跳转到登录的页面,因为csrf利用的是网址的同源性,因为IE浏览器是没有登录过的,所以没办法更改密码。
5.用登录过的火狐浏览器访问,成功改密码
感兴趣的可以关注微信 公众号【Cauchy网安】,一起一步步慢慢来,该到达的高度终将会抵达的,加油,如有雷同纯属巧合
原文始发于微信公众号(Cauchy网安):借助pikachu和DVWA靶场带你走进跨站请求伪造CSRF攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论