【工具-DVWA】DVWA渗透系列三:CSRF

前言

DVWA安装使用介绍,见:【工具-DVWA】DVWA的安装和使用

本渗透系列包含最新DVWA的14个渗透测试样例:

1.Brute Force(暴力破解)                    
2.Command Injection(命令注入)
3.CSRF(跨站请求伪造)                        
4.File Inclusion(文件包含)
5.File Upload(文件上传)                    
6.Insecure CAPTCHA(不安全的验证码)
7.SQL Injection(SQL注入)                    
8.SQL Injection(Blind)(SQL盲注)
9.Weak Session IDs(有问题的会话ID)                
10.XSS(DOM)(DOM型xss)
11.XSS(ref)(反射型xss)                    
12.XSS(Stored)(存储型xss)
13.CSP Bypass(Content Security Policy内容安全策略,旁路/绕过)    
14.JavaScript​​​​​​​

安全级别分低、中、高、安全四个级别来分析CSRF的渗透测试过程。

【工具-DVWA】DVWA渗透系列三:CSRF_第1张图片

1 基础知识

  • CSRF:Cross-site request forgery,跨站请求伪造

为何需要伪造请求呢?如果只是自己模拟网站请求,那没有利用价值,和登录网站发起请求效果一样。但是如果可以借用其他用户的身份,然后再模拟请求呢?比如基本信息提取,修改密码,转账等等。

  • 如何获取其他用户身份

伪造连接,让用户自己发起请求,前提该用户已登录目标网站,如果没有登录,就需要你引导Ta去登录,是自己构造一个仿真登录页(容易被发现,但是如果成功,那么你就获取了账号密码,就无所谓后续的请求伪造了),还是跳转到真实网站,都可以。当然,这个伪造连接必须要有一定的吸引力,跳转之后的页面,可以是404页面,也可以是其他页面(比如你伪造了一个获奖链接,则返回一个当前活动已结束页面),页面中可以隐藏一个CSRF请求。

2 Low+Medium+High

都是属于忘记密码,然后重置的功能,无需输入原密码

【工具-DVWA】DVWA渗透系列三:CSRF_第2张图片

2.1 渗透测试

  • 构造攻击页面

放入隐藏代码块,当页面被加载时,会执行修改密码请求,攻击页面需要放在漏洞网站(避免浏览器阻止跨域请求),上传方式可利用任意文件上传漏洞。

  • 注入代码块

利用XSS(Store)漏洞,将代码注入到网站,当用户访问存在XSS(Store)漏洞页面时,将触发修改密码请求。

1、拷贝发现文本框有长度限制,解决方案有两个,burpsuite拦截请求将请求内容进行修改,或者修改页面css代码,去除限制。

【工具-DVWA】DVWA渗透系列三:CSRF_第3张图片

将最大长度50修改为5000

【工具-DVWA】DVWA渗透系列三:CSRF_第4张图片

提交请求后,使用其他用户进行登陆,访问该页面后,重新登陆,确认密码已经修改为hack。

PS:构造过程中,构造恶意请求的用户的密码也会被修改为hack。

2.2 源码分析

  • Low:无任何效验,直接获取前端传入的值
// Get input
$pass_new  = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
  • Medium:添加stripos() 函数(查找字符串在另一字符串中第一次出现的位置),来判断Referer是否包含Server_NAME
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
	// Get input
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

PS:如果你伪造的是跨域请求,则需要修改请求页面名称为IP-Server.html(IP-Server换成真实IP或域名)这样可以绕过Referer验证,所以这种方式不安全,应该判断是否以http(s)://IP-Server开头。

  • High:加入Token效验,每次访问页面会设置一个token,请求时,将验证token是否正确
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Generate Anti-CSRF token
generateSessionToken();

获取token方式:将级别调整到Low,然后使用Xss-Store漏洞注入代码(High级别的XSS的绕过,后续具体章节再说),注入之后再将级别调整为High