URL中的十六进制值如何更改文件的路径?

问题描述 投票:0回答:1

我正在研究CTF中的挑战。以下是挑战的链接:Link1

[当我尝试将路径更改为Link2时。

它已成功检索到该标志,但是当十六进制值小于80时,它将不起作用。

我是一个初学者,做了很多挖掘工作以找出方法,但我找不到任何东西。请问怎么办?

php url-routing web-development-server ctf
1个回答
0
投票

[看来,挑战是利用PHP的basename()函数的古怪之处。 As per the documentation:

警告:basename()支持区域设置,因此要使用多字节字符路径查看正确的基本名称,必须使用setlocale()函数设置匹配的区域设置。

这意味着,如果将包含高于0x7F的代码点的字符串传递给它,它将尝试将它们作为多字节字符进行处理。因此,将随机字节传递给此函数可能会使它跌倒。

我将以下脚本上传到服务器进行测试:

<?php

header("Content-Type: text/plain; charset=UTF-8");

echo '$_SERVER["PATH_INFO"] = ';
var_dump($_SERVER['PATH_INFO']);
echo '$_SERVER["PHP_SELF"] = ';
var_dump($_SERVER['PHP_SELF']);
echo 'basename($_SERVER["PHP_SELF"]) = ';
var_dump(basename($_SERVER['PHP_SELF']));

这是我通过一些选定的请求获得的结果:

[GET /index.php?source

]
$_SERVER["PATH_INFO"] = NULL
$_SERVER["PHP_SELF"] = string(15) "/index.php"
basename($_SERVER["PHP_SELF"]) = string(9) "index.php"

[GET /index.php/config.php?source

]
$_SERVER["PATH_INFO"] = string(11) "/config.php"
$_SERVER["PHP_SELF"] = string(26) "/index.php/config.php"
basename($_SERVER["PHP_SELF"]) = string(10) "config.php"

[GET /index.php/config.php/XXX?source

]
$_SERVER["PATH_INFO"] = string(15) "/config.php/XXX"
$_SERVER["PHP_SELF"] = string(30) "/index.php/config.php/XXX"
basename($_SERVER["PHP_SELF"]) = string(3) "XXX"

[GET /index.php/config.php/%F0%9F%98%80?source

]
$_SERVER["PATH_INFO"] = string(16) "/config.php/😀"
$_SERVER["PHP_SELF"] = string(31) "/index.php/config.php/😀"
basename($_SERVER["PHP_SELF"]) = string(10) "config.php"

[您会注意到,在上一个示例中,PHP无法解析PATH_INFO字符串末尾的UTF-8字符,而是默认使用config.php的先前值。

因此,在您给出的示例中,指向/index.php/config.php/%80?source的链接将导致$_SERVER["PHP_SELF"])取值为"config.php"。这使您的查询可以通过以下测试,因为$_SERVER['PHP_SELF']\x80而不是/结尾:

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
  exit("I don't know what you are thinking, but I won't let you read it :)");
}

因此您可以从config.php的源代码中获取标志。

一个有趣的挑战。


注:

如果将PHP的语言环境设置为接受UTF-8字符的内容(例如setlocale(LC_ALL, 'en_GB.UTF8');),则它将正确处理😀个字符,但是在给出无效代码点(如%80
© www.soinside.com 2019 - 2024. All rights reserved.