Cross-site request forgery
简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也被称为one click
攻击。
vince/allen/kobe/grady/kevin/lucy/lili
,密码均为123456
Network
标签,并尝试修改个人信息vince
用户的住址修改为Earth
,在控制台可以看到请求URLhttp://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=Earth&email=vince%40pikachu.com&submit=submit
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=Earth&email=Hacker%40pikachu.com&submit=submit
vince
用户的住址修改成Beijing
CSRFTester
软件进行抓包。先打开CSRFTester
,用法和Brup差不多,不过这里需要配置的监听端口为8008
。点击Start Recording
开启监听后修改用户信息。提交表单后,可以看到已经抓到这个POST请求Generate HTML
生成恶意网页index.html
,使用编辑器将其打开。这里可以直接修改其中的数据,依然将邮箱修改为黑客邮箱Hacker@pikachu.com
,另外还需要添加一个提交按钮。修改完成后,部署到黑客站点,这里我放到Pikachu/vul/csrf/
目录下http://127.0.0.1/pikachu/vul/csrf/index.html
并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求原理:CSRF的主要问题是敏感操作的链接容易被伪造。而只要在每次请求时都增加一个随机码Token
,后台每次都对这个随机码进行验证,则可以有效地防止CSRF
token_get_edit.php
中看到,每次刷新页面,都会调用set_token()
函数,该函数会把SESSION
中Token
销毁,然后生成一个新的Token
,并将这个Token
传到前端表单中<div id="per_info">
<form method="get">
<h1 class="per_title">hello,{$name},欢迎来到个人会员中心 | <a style="color:bule;" href="token_get.php?logout=1">退出登录</a></h1>
<p class="per_name">姓名:{$name}</p>
<p class="per_sex">性别:<input type="text" name="sex" value="{$sex}"/></p>
<p class="per_phone">手机:<input class="phonenum" type="text" name="phonenum" value="{$phonenum}"/></p>
<p class="per_add">住址:<input class="add" type="text" name="add" value="{$add}"/></p>
<p class="per_email">邮箱:<input class="email" type="text" name="email" value="{$email}"/></p>
<input type="hidden" name="token" value="{$_SESSION['token']}" />
<input class="sub" type="submit" name="submit" value="submit"/>
</form>
</div>
Token
值就会传到后台与SESSION
中的Token
进行比较,若不相等,此次表单则提交失败。所以黑客由于不能得知用户当前的Token
值,从而无法进行CSRF攻击。Referer
来限制原页面