gpt4 book ai didi

php - 使用 PHP 进行定时攻击

转载 作者:可可西里 更新时间:2023-10-31 22:15:40 26 4
gpt4 key购买 nike

我正尝试在 PHP 中进行定时攻击,并使用 PHP 7.1 和以下脚本:

<?php
$find = "hello";
$length = array_combine(range(1, 10), array_fill(1, 10, 0));
for ($i = 0; $i < 1000000; $i++) {
for ($j = 1; $j <= 10; $j++) {
$testValue = str_repeat('a', $j);
$start = microtime(true);
if ($find === $testValue) {
// Do nothing
}
$end = microtime(true);
$length[$j] += $end - $start;
}
}

arsort($length);
$length = key($length);
var_dump($length . " found");

$found = '';
$alphabet = array_combine(range('a', 'z'), array_fill(1, 26, 0));
for ($len = 0; $len < $length; $len++) {
$currentIteration = $alphabet;
$filler = str_repeat('a', $length - $len - 1);
for ($i = 0; $i < 1000000; $i++) {
foreach ($currentIteration as $letter => $time) {
$testValue = $found . $letter . $filler;
$start = microtime(true);
if ($find === $testValue) {
// Do nothing
}
$end = microtime(true);
$currentIteration[$letter] += $end - $start;
}
}
arsort($currentIteration);
$found .= key($currentIteration);
}
var_dump($found);

这是搜索具有以下约束的单词

  • 仅限a-z
  • 最多 10 个字符

脚本可以毫无问题地找到单词的长度,但是单词的值永远不会像预期的那样通过定时攻击返回。

我做错了什么吗?

脚本循环遍历长度,正确识别长度。然后循环遍历每个字母 (a-z) 并检查这些字母的速度。理论上,'haaaa' 应该比 'aaaaa' 稍微慢一些,因为第一个字母是 h。然后对五个字母中的每一个进行处理。

运行给出类似“brhas”的东西,这显然是错误的(每次都不同,但总是错误的)。

最佳答案

Is there something I am doing wrong?

我不这么认为。我试过你的代码,我也像你和其他在评论中试过的人一样,在第二个循环中得到完全随机的结果。第一个(长度)大部分是可靠的,尽管不是 100% 的时间。顺便说一下,建议的 $argv[1] 技巧并没有真正提高结果的一致性,老实说,我真的不明白为什么要这样做。

出于好奇,我查看了 PHP 7.1 源代码。字符串标识函数 (zend_is_identical) 如下所示:

    case IS_STRING:
return (Z_STR_P(op1) == Z_STR_P(op2) ||
(Z_STRLEN_P(op1) == Z_STRLEN_P(op2) &&
memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0));

现在很容易看出为什么对长度的第一次计时攻击效果很好。如果长度不同,则永远不会调用 memcmp,因此它返回得更快。即使没有太多迭代,差异也很容易被注意到。

一旦计算出长度,在第二个循环中,您基本上是在尝试攻击底层的 memcmp。问题在于时间差异在很大程度上取决于:

  1. memcmp的实现
  2. 当前负载和干扰过程
  3. 机器的架构。

我推荐这篇标题为 "Benchmarking memcmp for timing attacks" 的文章以获得更详细的解释。他们做了一个更精确的基准测试,但仍然无法在时间上获得明显的差异。我只是想引用文章的结论:

In conclusion, it highly depends on the circumstances if a memcmp() is subject to a timing attack.

关于php - 使用 PHP 进行定时攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com