前言
CSRF
cross-site request forgery
与XSS相比
XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等
CSRF:利用站点对已经身份认证的用户的信任,攻击者伪造一个链接误导用户点击链接来使用用户的身份认证来访问服务器
1、简介
功能
- 结合社工在身份认证会话过程中实现供给
- 修改账号密码、个人信息(email、收货地址)
- 发送伪造的业务请求(网银、购物、投票)
- 关注他人社交账号、推送博文
- 在用户非自愿、不知情的情况下提交请求
业务逻辑漏洞
- 服务器对关键操作缺少确认机制
- 自动扫描程序无法发现此漏洞
漏洞利用条件
- 被害用户已经完成身份认证
- 新请求的提交不需要重新身份认证或确认机制
- 攻击者必须了解 Web APP 请求的参数构造
- 诱使用户触发攻击的指令(社工)
自动扫描程序的检测方法
- 在请求和响应过程中检查是否存在 anti-CSRF token 名
- 检查服务器是否验证 anti-CSRF token 的名值
- 检查 token 中可编辑的字符串
- 检查 referrer 头是否可以伪造
对策
- captcha
- anti-CSRF token
- referer 头
- 降低会话超时时间
2、漏洞利用
新的修改密码请求不需要输入原密码
攻击者修改服务器 URL 地址,诱导用户点击修改密码
http://192.168.1.115/dvwa/vulnerabilities/csrf/?password_new=aaaaaaaa&password_conf=aaaaaaaa&Change=Change
# 放在 kali 本机,kali 模拟访问
普通用户在正常登陆 dvwa 的时候,点击此链接
被攻击者的密码被修改
攻击者可以使用新的密码进行登录
生成 PoC 文件
如图所示
把html内容copy下来放入/var/www/html
修改value,使得被攻击者点击链接后密码被修改
将 URL 保存至文件诱导用户访问
3、服务器源码
dvwa Low 安全级别
<?php
if (isset($_GET['Change'])) {
// Turn requests into variables
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if (($pass_new == $pass_conf)){
$pass_new = mysql_real_escape_string(