【问题标题】:Session Check bypassed vulnerability会话检查绕过漏洞
【发布时间】:2014-09-23 08:39:23
【问题描述】:

我们有一个 php 页面,它是网站的管理部分。它用于对数据库执行一些更新操作。代码如下所示

session_start(); 
     if (!isset($_SESSION['somevariable']) ) 
        {
        header("Location:loginpage.php");
        }



    $id=$_GET['somevariable];
$sql = "UPDATE sometable SET somecolumn='' where someothercolumn=?";
$stmt = $con->prepare($sql);
$stmt->bind_param('s',$id);
$stmt->execute();

我们注意到存在一些漏洞,这段代码似乎是从未知来源以周期性间隔(5 秒)运行的,这看起来不像有人拥有管理部分的密码并且正在运行手动操作。

我们想知道黑客能否绕过此登录检查并在没有密码的情况下执行其余代码?对上述代码中的漏洞的任何见解都会有所帮助。提前致谢

【问题讨论】:

  • 注意到代码中缺少一个引号!
  • @knittl 关于攻击者如何做到这一点以及如何避免它的任何建议?将其更改为 POST 而不是获取帮助?
  • @MaximDsouza:pouya darabi's answer 是正确的。 header 不会停止脚本执行
  • @MaximDsouza 使用session.use_strict_mode=On。 link

标签: php security get


【解决方案1】:

我看到了两个漏洞:

1) CSRF(直接从get方法中使用变量)

2) 调用头函数后退出不使用

正确的代码应该是这样的:

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>

参见 php.net 文档 Link

【讨论】:

  • 即使重定向在另一组代码之前,是否可以执行以下代码?我的意思是出口不存在的场景?
  • 如果您在标头函数后不使用退出,您的代码将继续执行
  • 如果你想确保浏览器得到重定向,你必须在重定向代码后使用退出!
  • +1 ... 几乎忽略了丢失的exit 呼叫。 header 只会发送一个http头,但会继续执行脚本
  • 非常感谢大家。我们会牢记这一点。任何其他输入也将被视为学习。
【解决方案2】:

如果管理员有一个活动会话,并且黑客以某种方式发现了他们的 PHPSESSID cookie 的值,他们可以发送 cookie 并劫持会话。

确保您使用 SSL 加密,以防止有人窃听连接并获取 cookie。

【讨论】:

  • 我们很确定当攻击发生时管理员没有登录。
  • 那么攻击者必须以某种方式登录。只有在 PHP 脚本创建会话时才会创建会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-08-01
  • 2013-08-06
  • 1970-01-01
  • 2022-01-18
  • 2022-07-20
相关资源
最近更新 更多