Dvwa之Csrf攻击笔记
介绍
今天笔者便用dvwa漏洞测试环境来探讨一下跨站请求攻击。
Csrf全称为Cross-Site Request Forgery中文解释为跨站请求伪造攻击。
Csrf通常与XSS结合起来进行利用,一般存在XSS漏洞的网站,很大可能也存在Csrf漏洞。二者最简单的区别就是一个是获得用户信任,一个是获得服务端的信任。
生活场景
比如说有一天,你闲来无事在寝室上网,然后打开网页,查看一下自己的银行余e,这时候正好你收到一封邮件(账户仍处于登陆状态),来自你一个非常要好的朋友,于是你打开它,里面是,这是我发现的一篇很好看的文章,后面是一个url,然后你好奇的点开了,结果发现是404,以为是网页错误,便不管了,再打开银行界面发现自己的账户的钱全没了。这就是Csrf的危害。
成功因素
从上面的例子我们可以发现,
成功攻击需要具备以下几个因素:
1.被攻击者仍处于会话中
2.欺骗用户访问自己精心设计的攻击url。
3.攻击者需要知道url中所有参数项,并了解其中的含义。
在这幅图的第4步,用户收到恶意攻击者通过邮件或其他方式发送的具有具有恶意攻击代码的网址,用户如果点开的话,点开的过程中用户自己刚开始建立的会话一直保持着,在这个过程中用户如果点击恶意代码,便会遭到攻击。
在上面的攻击中,如果结合XSS直接能实现在用户访问界面弹出一个含有恶意攻击网站的url的弹窗。
实际演练:
首先进入dvwa界面,选择Csrf界面如下:
这是一个修改密码的界面,首先我们查看一下源码:
1. <?php
2.
3. if (isset($_GET['Change'])) {
4.
5. // Turn requests into variables
6. $pass_new = $_GET['password_new'];
7. $pass_conf = $_GET['password_conf'];
8.
9. //判断两次输入是否一样
10. if (($pass_new == $pass_conf)){
11. $pass_new = mysql_real_escape_string($pass_new);
12. //对sql注入进行了预防
13. $pass_new = md5($pass_new);
14. //对新密码进行了MD5加密
15.
16. $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
17. $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); //对sql注入进行了预防
18.
19. echo "<pre> Password Changed </pre>";
20. mysql_close();
21. }
22.
23. else{
24. echo "<pre> Passwords did not match. </pre>";
25. }
26.
27. }
28.?>
通过分析可知这个网页可以有效的防止sql注入,但是却缺少对密码修改的二次验证。所谓二次验证就是在密码修改时,网站会询问用户,更安全的是做token验证,这个我们以后再探讨。
接着我们构造一个url如下
如果被攻击者点击这个url,密码便会被修改
但是这种方法是很简陋的,因为是基于get方法的请求,所以当用户把鼠标放在CSRF上时出现整个请求的内容,攻击的隐蔽性比较差。
下面是基于POST请求的操作,由于POST请求的内容不在地址栏显示,所以隐蔽性要比前者好。
构造页面
源码
接下来介绍一下bp在Csrf中强大的用法,在任何的url,HTTP请求上,
右键>>Engagement tools>Generate CSRF PoC,其会自动生成一个POC
。
另外bp的Scanner模块还能对Csrf漏洞进行检测
总结
初步总结一下Csrf攻击,正如张炳帅在web安全深度分析中所说,不如把Csrf理解为一个小XSS,如果一个网站同时具有Csrf和XSS漏洞,XSS可以给做的更多,比如通过XSS获得webshell不就是XSS和Csrf的结合吗?
所以防范Csrf漏洞首先要防范XSS漏洞,如果一个网站存在XSS漏洞那么防范CSRF也没有什么意义。