【问题标题】:Semicolons in superglobal $_COOKIE超全局 $_COOKIE 中的分号
【发布时间】:2016-10-03 23:32:42
【问题描述】:

在编写访问超全局变量的类时,我刚刚认识到 php 可能出于安全原因正在从超全局变量中删除分号。

例如将 cookie 值设置为 <?php phpinfo(); ?> 之类的值时 我可以看到一个看起来像 Array ( [cookie] => <?php phpinfo() [?>] => ) 的变量转储,看到包含分号的字符串被分成两个或修剪值直到第一次出现分号。

现在问题来了。
如何让完整的字符串通过?

因为我已经“控制”了传递的变量,所以我想记录一个例如使用unpack("H*",$booboostr) 对任意有效载荷进行十六进制转储。

所以这是问题二。
如何为输入创建十六进制表示?

提前感谢您的任何提示。 问候

【问题讨论】:

  • Cookie 需要 URL 编码。
  • 所以在尝试读取/传递它时使用urlencode($_COOKIE["cookie"]) 之类的东西会奏效吗?
  • 分号在 cookie 中有特殊的含义,用于将值与域、路径等选项分开。
  • @MarcBredt 也用于分隔 cookie:cookie1=value1; cookie2=value2
  • 不清楚你在这里做什么。你为什么首先将文字 <?php 放入 cookie 中?

标签: php inject superglobals


【解决方案1】:

为了完成@Barmar 的评论,任何带有分号的 $_COOKIE 值都将被拆分为额外的 $_COOKIE 键值对,如果一个部分包含“=”,否则数据将被省略。

对于 $_COOKIE 值来说,“;”会出现双重爆炸。和“=”调用。

当客户端在以类似于firstval; foo=bar; omit-me; §$&%/&(/)=}][{ ¬½ 的方式发送之前(重新)发送之前修改 cookie 键 sg 的 cookie 值时,它将导致在服务器端包含以下数据的 $_COOKIE 数组,而不是cookie 键 cookie 的“简单”字符串:

$_COOKIE = Array (
  [cookie] = firstval,
  [foo] = bar,
  [§$&%/&(/)] = ][{ ¬½
);

如您所见,omit-me 将被省略,这导致考虑到上述条件,无法立即获得完整的字符串。

问候。

【讨论】:

  • 我不认为他是这么说的。他说它在饼干中很特别。除了$_COOKIES,您是否尝试过使用其他全局变量?这对我来说很好:$_SESSION["sg"] = 'firstval; foo=bar; omit-me; §$&%/&(/)=}][{ ¬½';
  • 正如您对@Barmar cmets "[它用于将值与选项或 cookie 分开]" 的支持所看到的那样。考虑到任何超全球,这导致我错误地完成他的评论。在第一个中,我指出超全局变量可能被直接从外部修改,例如_GET、_POST、_COOKIE,其中爆炸机制略有不同。无论如何,我更正了我的答案/线程标题并将其限制为超全局 $_COOKIE。
  • @miken32 测试了您的更正,但由于我没有在我的场景中使用 $_COOKIE["foo"] = "anything"; 从输入/服务器端设置 cookie 值,它可以按预期工作,将“foo”设置为“任何东西”您的更正与我的测试用例场景略有不同,效果不同。
  • 好的,然后随时回滚编辑。 Cookie 正在其他地方设置并由 PHP 读取?
  • 在我的测试场景中cookie的值是通过客户端设置的。
猜你喜欢
  • 2012-11-19
  • 2019-02-14
  • 2016-08-26
  • 2012-10-13
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多