目录
一、CSRF
1.简介
1.1 官方介绍
差不多就这几点
CSRF是什么
CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。也被称为 one-click attack 或者 session riding。
CSRF攻击原理
CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。本质是借用户的权限完成攻击,因此攻击成功需要用户已经通过验证获得了权限,并触发了攻击者提供的请求。
CSRF的判断
判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
CSRF的预防
网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如:
--对敏感信息的操作增加安全的token;
--对敏感信息的操作增加安全的验证码;
--对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等
二、闯关
1.CSRF(get)
我们看提示,有用户名和密码。
登录进去是这个页面
点击修改信息,把性别改为girl
发现顶部url并没有什么变化。
bp抓包看看。
从抓包可见,修改用户信息的时候,是不带任何不可预测的认证信息的。那么,这里应该是可以被利用的。
在allen登录状态下(其实这个链接里面是不包含用户名的,谁登录都无所谓,只要有人登录着就行,登录着的用户的信息就会被改成url提供的那些),试试改一改上面的链接,比如把电话号码改一改。浏览器地址栏输入payload:
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=17867676677&add=nba+76&email=allen%40pikachu.com&submit=submit
url输入Payload,修改成功。
如果被攻击者此时登录状态或cookie/session没有过期,则信息被修改。
我们可以用短链接生成网址,生成短链接,进行利用,
性别成功改为boy,攻击成功
2.CSRF(post)
出现报错是因为php版本过高,打开php文件,在MYSQL后加一个l就好了。
bp抓包
post类型,URL不再显示修改参数,所以无法再使用上述办法(即通过URL来伪造请求)进行修改,但是抓包可以知道本页面中有的标签以及name,方便后面构造表单时使用。
post类型的比get类型利用起来要烦一点,需要攻击者自己写个利用该漏洞的html文件,放在自己服务器上,并发给用户请求这个html文件的链接。
构造带有修改信息的csrf.html
<html>
<script> <!-- 这个script是用来自动提交表单的 -->
window.onload = function() {
document.getElementById("submit").click();
}
</script>
<body>
<form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="girl" />
<input type="hidden" name="phonenum" value="123456789" />
<input type="hidden" name="add" value="usa" />
<input type="hidden" name="email" value="caker@pikachu.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>
放在pikachu目录下
部署在小皮上
打开新网址,访问http://127.0.0.1/pikachu/csrf.html
如果出现404,应该是以下原因csrf_post.php文件中如果检测到用户没有登录,会跳转到同文件夹(csrfpost)下的csrf_get_login.php,但事实上csrfpost文件夹下并没有这个文件,因此会返回404 not found。
打开csrfpost.php,把header("location:csrf_get_login.php");改成header("location:csrf_post_login.php");
输入http://127.0.0.1/pikachu/csrf.html ,攻击成功。
3.CSRF---Token
我们修改信息并用bp抓包,发现token的值。
发送至Repeater
删掉token,发现没有成功修改。
在抓一次,token之间也没有规律可言。
谷歌浏览器bp抓包
把在谷歌浏览器抓到的token放到火狐浏览器的包中,发现还是修改不了。
可是,我们还是有办法的,这里我们可以使用bp的插件CSRF Token Tracker绕过token验证。
打开CSRF token的插件,Host输入主机ip,name输入token,Value输入token的值。
这是没有打开bp token插件之前,修改不会生效。
开启插件,他会随机生成t相应的oken值。
攻击成功!!!
虽然token的值不能删掉,也没有规律可言,从谷歌浏览器修改得到的token值,到火狐浏览器还是不可用,但我们还是能够用一些绕过的方法进行攻击,可见靶场对token的验证还有一些问题。
源码
修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。
修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。
set_token()函数如下图所示,在生成新token之前会先销毁老token,避免token重复使用