信安小白,一篇博文讲明白CSRF攻击和防御

靶机系统:Win7

CSRF攻击和防御

  • 系列博文
  • 前言
  • 一、CSRF是什么
    • 1.如何判断存在CSRF漏洞?
    • 2. 分析中级CSRF源码加固机制
    • 3. 分析高级CSRF源码加固机制
    • 4. 分析Impossible级CSRF源码加固机制
  • 二、XSS和CSRF比较
  • 三、CSRF攻击案例
  • 四、CSRF防御
  • 实验


系列博文

  1. 信安小白,说明白渗透测试及信息安全
  2. 信安小白,一篇博文讲明白暴力破解和SQL注入
  3. 信安小白,一篇博文讲明白上传漏洞——获得shop靶机的Webshell
  4. 信安小白,一篇博文讲明白存储型、反射型XSS漏洞
  5. 信安小白,一篇博文讲明白CSRF攻击和防御

前言

如果没有XSS漏洞,还能否盗用用户的身份(cookies)呢?

信安小白,一篇博文讲明白XSS攻击与防御

DVWA实验目标: 修改用户登录密码。
  我们日常生活中,碰到修改密码时,需要填入原密码,才能再修改密码,或者填入密保问题再修改,还有的是使用手机验证码验证后才能修改。这些措施的目的是确认用户本人才能修改自己的密码,但如果是 攻击者想冒充他人,能否请求修改密码呢?会有漏洞出现吗?


一、CSRF是什么

  跨站请求伪造(Cross-site request forgery),通常缩写为 CSRF 或者 XSRF, 盗用(伪造)了用户身份,以用户名义发送恶意请求,这种恶意请求被服务器当做正常请求执行。简单来说就是:攻击者盗用了你的身份,以你的名义发送恶意请求。
信安小白,一篇博文讲明白CSRF攻击和防御_第1张图片

1.如何判断存在CSRF漏洞?

  我们的目的是冒充用户修改密码,因此修改请求只能是用户(或者带着用户cookie)发出,从XSS漏已知,攻击者可以引诱用户点击恶意链接进入恶意网站,发送请求让攻击者获取用户身份,因此不用担心用户能否跨站发出修改请求。 跨站请求的核心是:构造请求url,因此我们必须要知道目标网站是如何修改密码的需要提供什么信息参数才能修改。
  通过实验,我们发现在实验“CSRF”的页面中将管理员密码改为123,可以得到url:
http://192.168.3.37/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
同时,我们还需要验证:是否能跨站使用此url的相关修改密码参数来进行修改,如果可以,那就是存在CSRF漏洞。但往往不可以,只有用户自己提交修改密码参数(带着用户的合法cookie),服务器才认可。因此综上所述,攻击者如何让用户自己提交参数呢?

在已经登录进入DVWA的状态下,新打开网页,这里的ip地址目标网站服务器的ip地址

<img src="http://192.168.1.*/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#"border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>

CSRF攻击满足的必要条件:

  1. 用户登录网站A是登陆状态,生成cookie
  2. 网站存在CSRF漏洞,服务器对提交参数没有任何验证(只要带cookie就可以通过)
  3. 用户在不登出网站A的情况下,可以访问攻击者恶意网站
  4. 用户在不知情的情况下,访问恶意网站,跨站向A请求(跨站请求伪造

2. 分析中级CSRF源码加固机制

if( isset( $_GET[ 'Change' ] ) )
// Checks to see where the request came from
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) )

函数说明:
int eregi(string pattern, string string)
  检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。Medium级别的代码检查了http包头的Referer参数的值(表示来源地址)HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,如果是别的网站链接,就不能验证成功。

Burp抓包查看:
用户自己登录:
Host: 192.168.1.120
Referer: http://192.168.1.120/dvwa/vulnerabilities/csrf

访问攻击者网页跨站连接:
Host: 192.168.1.120
Referer: http://192.168.1.121/csrf.html

跨站请求的referer与用户自己的referer完全不一样,ip地址是关键字。但可以把文件名(例如:csrf.php)改成网站的ip地址,有了关键字就可以绕过了。

3. 分析高级CSRF源码加固机制

if( isset( $_GET[ 'Change' ] ) )
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

  High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token(令牌),向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。用户每次刷新会重新刷新token。

4. 分析Impossible级CSRF源码加固机制

if( isset( $_GET[ 'Change' ] ) )
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$pass_curr = $_GET[ 'password_current' ];

  Impossible级别不仅检查token,还要求输入原密码。


二、XSS和CSRF比较

  • XSS:
      用户过分信任网站,放任来自浏览器地址栏代表的那个网站代码在自己本地任意执行。如果没有浏览器的安全机制限制,xss代码可以在用户浏览器为所欲为;
  • CSRF:
      网站过分信任用户,放任来自所谓通过访问控制机制的代表合法用户(不管合不合法,只要持有cookie)的请求执行网站的某个特定功能。

三、CSRF攻击案例

  • 修改密保问题 :攻击者利用漏洞,修改密保问题为自己的,从而进入修改页面修改密码。
  • 修改收货地址
  • 删除博客
  • 百度Hi之CSRF蠕虫攻击
      百度用户中心短消息功能和百度空间、百度贴吧等产品相互关联,用户可以给指定百度ID用户发送短消息,在百度空间用互为好友的情况下,发送短消息将没有任何限制
  • CSRF和XSS组合(最常见)
    信安小白,一篇博文讲明白CSRF攻击和防御_第2张图片
      我们登陆网站后会看到资料填写页面,空间里的信息只能用户自己看见,如果填写的信息存在xss漏洞,没有进行过滤,一些XSS脚本就会被服务器存储并存储在自己的个人数据库中,而这些信息只对个人空间有效,并不能影响别人,同时用户也不会自己提交XSS脚本到数据库中去。因此,在这种情况下,这里的服务器很可能不会进行XSS过滤。 我们称这种情况称之为Self-XSS。
       问: 这里怎样在用户登录的状态下,让用户自己上传脚本到服务器呢?
       答: 如果这个页面还存在CSRF漏洞,就伪造用户身份可以利用CSRF漏洞,让用户跨站请求,让用户在修改信息的同时提交恶意js脚本,此时服务器就能将js脚本存在个人数据库中了。下一次用户登录页面时,服务器就能让脚本发给用户,用户执行脚本就把自己信息发送给攻击者了。

四、CSRF防御

是源于WEB的隐式身份验证机制
  WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,CSRF攻击但却无法保证该请求是用户批准发送的

CSRF防御

  1. 验证码
      用户在表单中填写一个图片上的随机字符串
  2. 使用token校验
      对于CSRF检查的请求(一般是POST请求),服务端会分配一个token,在这次session的有效时间之内,客户端每次请求都发送token到服务器,服务器验证token是否相同,相同则放行,否则返回错误信息
  3. 手机短信验证等

实验

实验目的:
1)编写钓鱼网页,修改用户名和密码。
2)提出防御方案。

  1. 查看DVWA更改密码的格式
    信安小白,一篇博文讲明白CSRF攻击和防御_第3张图片
    url:password_newpassword_conf自拟
    csrf
# url是 目标网站服务器的ip地址+网页路径+新的密码参数+重复的密码
http://192.168.163.128/DVWA-1.9/vulnerabilities/csrf/?password_new=xxx&password_conf=xxx&Change=Change
  1. 准备恶意网站脚本,引诱用户点击:ip地址为DVWA的ip地址,也就是要提交网站的ip地址,我这里是自己的ip地址。
<img src="http://192.168.163.128/DVWA-1.9/vulnerabilities/csrf/?password_new=xxx&password_conf=xxx&Change=Change#" border="0" style="display:none;"/> 
<h1>404<h1> 
<h2>file not found.<h2>
  1. 保存至WWW根目录下:文件必须为PHP格式(网页格式)

信安小白,一篇博文讲明白CSRF攻击和防御_第4张图片

  1. 访问网站: 此时的ip地址为攻击者的ip的地址,因为网站是攻击者的,访问的是攻击者。

信安小白,一篇博文讲明白CSRF攻击和防御_第5张图片

  1. 用新的密码登陆 admin/xxx 注意:须待登陆情况下(这里是DVWA靶机情况下)访问CSRF。
    信安小白,一篇博文讲明白CSRF攻击和防御_第6张图片

防御方案:

  1. 网站设置验证码。攻击者没办法知道用户在浏览时的验证码。
  2. 使用token机制,网站后台隐藏验证码。
  3. 手机验证码等验证机制。(指纹,邮箱验证)

你可能感兴趣的:(信息安全,csrf,安全,web安全)