1. CSRF(跨站请求伪造)简介
(1)CSRF
CSRF(Cross—site request forgery),跨站请求伪造,是指利用受害者未失效的身份认证信息(cookie,会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下,以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账,改密等)。
(2)CSRF与XSS的区别
CSRF属于业务逻辑漏洞,在服务器看来,所有的请求都是合法正常的;
XSS,SQL注入等等都是属于技术漏洞;
XSS:客户信任服务器;
CSRF:服务器信任客户(经过身份认证的);
(3)CSRF攻击成功的前提
用户必须登录;
黑客必须懂得一些发包的请求;
服务器端不会有二次认证;
被害者是不知情的;
2. CSRF攻击图示
- 用户首先登录服务器;
- 服务器返回cookie;
- 然后hacker将可以修改用户密码的URL发给用户;
- 用户如果点击了该URL,则密码就会被更改(如果没有点击,则密码不会被修改,但密码是否被更改hacker是不知道的);
- 最后,黑客使用用户的用户名和密码尝试进行登录服务器;如果成功,则证明用户点过url,如果没有登录成功,则用户没有点击url;
3. CSRF(跨站请求伪造)
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.128;
(2) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)
(3)受害者:虚拟机Windows Server 2003,IP地址:192.168.37.128;
实验过程
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
从源码中可以看到,密码中不能包含SQL中的特殊字符;
服务器收到修改密码的请求后,会检查参数pass_new与pass_conf是否相同,如果相同,则会更新数据库,修改密码,并没有任何的防CSRF机制(用户已经登录服务器)。
(4)实验操作
(注:每次登录进去都重置一下数据库,将密码恢复为初始密码)
方式一:构造修改密码的链接
如果受害者点击了这个链接,密码就会被修改;
这个修改密码的链接一眼就能看出来这个链接是改密码的,而且在点击了这个链接后,页面就会显示密码已修改;
4.1> 抓取CSRF的包;
4.2> 保存链接;http://localhost/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change
并查看效果;
4.3> 在虚拟机Windows 2003上点击如上修改密码的链接;
密码就已经被修改;
如果修改密码的链接过于明显,可以使用一些缩短链接的方法;
方式二:写一个修改密码的脚本文件,尝试访问该页面就可以修改密码;
4.1> 复制修改密码的链接,并在Kali上写入脚本;
4.2> 重置数据库,使其密码恢复为初始值;
4.3> 拿虚拟机Windows2003访问kali上的脚本;
(如下我是直接拿物理机进行尝试的,方便进行抓包,两者效果是一样的,都是访问文件,进行点击,密码被修改)
4.4> 点击CSRF超链接,就可以通过burp suite抓取到修改密码的数据包
此时,使用修改后的密码可以登录成功
方式三:构造攻击页面
这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击,我们在本地写一个2.html,然后是受害者去点击;
2.html的内容:
访问如上2.html页面;一般情况下,普通用户看到404的页面都会下意识的关闭它,而此时,密码已经在用户访问2.html的时候进行了更改;(我是直接在物理机上的操作,也可以直接认为物理机就是受害者)
方式四:结合存储型XSS进行重定向
使用存储型XSS,重定向到2.html页面
此时,密码已经进行修改;
安全级别:Medium
(1)设置安全级别;
(2)查看源码;
(3)源码分析
Medium级别的代码使用 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,即要求本地登录),希望通过这种机制抵御CSRF攻击。
过滤规则是http包头的Referer参数的值中必须包含主机名(192.168.37.128);
(4)实验过程
我们可以通过抓包将主机名放在http包头的Referer参数中;
尝试进行登录验证;
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
(4)实验过程
抓包,我们可以将抓取包中的级别High改为Low;
安全级别:Impossible
(1)设置安全级别
(2)查看源码
(3)源码分析
Impossible级别的代码利用PDO技术防御SQL注入;
对于防护CSRF,则要求用户输入原始密码,攻击者在不知道原始密码的情况下,无法进行CSRF攻击;
(4)实验过程