返回

2023 水友赛 WP:独行侠独享 3 道 Web 题,过瘾!

前端

跨年夜 Web 题之乐:过滤绕过、意外惊喜、雪崩效应

迎接新的一年,我们举行了一场跨年 Web 题竞赛,只有短短三道题目,却带给我们别样的快乐和收获。让我们一起回顾一下这三道精彩的题目,探索其巧妙之处。

1. 过滤绕过:突破防御,触及真谛

乍一看题目,我们可能会被第一道题的正则表达式过滤吓到,因为它禁止了我们常见的绕过正则表达式的方法。但是,别慌,仔细分析题目,我们发现题目要求的是过滤绕过,而不是彻底绕过。

于是,我们把目光投向 PHP 的另一个函数——str_replace。它可以用第一个参数替换掉第二个参数中的字符串。如果我们用一个空字符串替换,就相当于删除了字符串中指定的内容。

代码示例:

$key = str_replace(array('flag(', ')'), '', $_GET['key']);

通过这个技巧,我们就巧妙地绕过了正则表达式过滤,获取到了隐藏的 flag。

2. 意外惊喜:别具匠心的函数调用

第二道题乍看之下平平无奇,但是当你仔细琢磨题目的时候,就会发现它隐藏着一个意外的惊喜。题目中提到了一个 PHP 函数——phpinfo(),它可以打印出 PHP 的配置信息,其中包括文件路径。

代码示例:

phpinfo();

这样,我们就可以通过打印配置信息来泄露出 flag,可谓是别具匠心,令人拍案叫绝。

3. 雪崩效应:图片伪装,暗度陈仓

第三道题是一道文件上传题,但它巧妙地限制了上传的文件必须是图片。这看似无懈可击,但我们却发现了一个突破口——md5_file函数,它可以计算一个文件的 MD5 值。

然而,md5_file函数是可以绕过的。我们可以通过修改文件头来绕过它。

具体步骤:

  1. 构造一个 JPG 文件,但文件头是 PNG 的。
  2. 上传此文件到服务器。
  3. 服务器会把文件当作 PNG 文件处理,而不会计算它的 MD5 值。
  4. 这样,我们就可以上传一个任意文件到服务器上了。

代码示例:

// 构造伪造的 PNG 头
$png_header = "\x89PNG\x0d\x0a\x1a\x0a";

// 将 PNG 头附加到 JPG 文件上
$jpg_file = fopen('test.jpg', 'rb');
$png_header = fwrite($jpg_file, $png_header);
fclose($jpg_file);

// 上传伪造的 PNG 文件
$_FILES['file']['name'] = 'test.png';
$_FILES['file']['type'] = 'image/png';
$_FILES['file']['tmp_name'] = 'test.jpg';
$_FILES['file']['error'] = 0;
$_FILES['file']['size'] = filesize('test.jpg');

通过这种雪崩效应,我们突破了文件类型限制,实现了任意文件上传。

总结:巧思迭出,收获满满

虽然这次的题目只有三道,但每一道都巧思迭出,带给我们意想不到的挑战和收获。通过破解这些题目,我们不仅提升了 Web 安全知识,还锻炼了灵活思考和绕过限制的能力。

常见问题解答

1. 这次比赛一共出了多少道题目?

答: 3 道

2. 比赛的难度如何?

答: 中等难度

3. 是否使用了任何编程语言?

答: 是的,PHP

4. 绕过正则表达式过滤最关键的突破口是什么?

答: str_replace函数

5. 上传任意文件题的突破口是什么?

答: md5_file函数的可绕过性