【问题标题】:Are we really secured from CSRF?我们真的不受 CSRF 的保护吗?
【发布时间】:2015-01-30 08:27:58
【问题描述】:

确认.php

<?php
 session_start();
 $token= md5(uniqid());
 $_SESSION['delete_customer_token']= $token;
 session_write_close();
?>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />

confirm_save.php

<?php
 session_start();
 $token= $_SESSION['delete_customer_token'];
 unset($_SESSION['delete_customer_token']);
 session_write_close();
 if ($_POST['token']==$token) {
   // delete the record
 } else {
   // log potential CSRF attack.
 }
?>

假设我们有一个像这样的典型 CSRF 保护 如果攻击者使用此代码绕过 csrf 令牌怎么办?

//On any site
<img src="http://cia.teletubbies.com/csrf.php" height="0" weight="0"/>

//csrf.php
$cont = get_file_contents("http://cia.google.com/confirm.php");
// parse the html using [PHP Simple HTML DOM Parser][2] and get the CSRF token
//CURL and send a POST request to confirm_save.php with the token

这件事一直困扰着我,但我懒得尝试对任何随机站点进行攻击。这不可能吗?

示例代码是从preventing csrf in php盗取的

更新

当有人想将令牌从一个平台传递到另一个平台或从服务器端传递到客户端时会发生什么?以 Flash 到 PHP 为例,它如何从 csrf 中保护?

【问题讨论】:

  • 你误解了 CSRF。如果攻击者使用您发布的“绕过”代码示例,他们将获得自己的唯一令牌。劫持他们自己的会话毫无意义。
  • 感谢您的解释,关于使 CSRF 安全客户端请求的任何想法?

标签: php security xss csrf csrf-protection


【解决方案1】:

您将获得 您用于抓取页面的服务器会话的 CSRF 令牌。 由于该会话不是受害者的,因此它是安全的。 (如果你在窃取用户的会话,那就不再是 CSRF 攻击了!)

所以,是的,除非它的实现很糟糕,否则你不能只抓取一个 CSRF 令牌并将其用于 CSRF 攻击。

【讨论】:

  • 所以 csrf.php 将获得一个新会话,而不是每次请求都会更改的当前用户?
  • 执行get_file_contents() 的服务器将与用户的会话不同,是的,因此$_SESSION['delete_customer_token'] 的值将不同。
  • 好的,如果有人想从 CSRF 安全地从客户端应用程序发出服务器端请求怎么办?这怎么可能?
  • 取决于客户端应用程序的类型。除非应用程序只是通过浏览器通过 POST/GET 提交数据,否则这应该不是问题。只要你不能利用用户浏览器的信任,它就不是 CSRF-able。否则,以类似的方式使用会话令牌 - 它不一定必须与 PHP 使用的令牌相同。
【解决方案2】:

CSRF 保护有效,因为只有经过身份验证的用户才能访问令牌。

您的 csrf.php 页面位于另一个域中,因此无法看到合法站点的会话 cookie,也无法获取 CSRF 令牌。

【讨论】:

  • 攻击者可以获取以典型 HTML 形式传递的令牌并使用 CURL 提交
  • 令牌只在合法网站和合法用户的浏览器之间传递。攻击者只控制另一台服务器上的 csrf.php,无权访问合法用户的令牌。如果攻击者向合法网站发出请求,他将得到自己的令牌,而不是合法用户的令牌。
  • 我想我明白了,但是有人如何从 CSRF 安全地从客户端应用程序发出服务器端请求?
  • 如果客户端需要通过第三方服务器进行请求,客户端需要将token传递给第三方。在这种情况下,您必须信任第三方。但这确实不是 CSRF 保护的设计目标。
猜你喜欢
  • 2018-10-23
  • 2018-03-09
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2012-03-03
  • 2015-12-22
  • 2011-02-03
  • 2012-05-01
相关资源
最近更新 更多