### 提权时选择可读写目录,为何尽量不用带空格的目录 **1. 命令行解析问题** 在 Linux、Windows 等操作系统的命令行环境中,空格被视为命令、参数和选项的分隔符 例如,你想将一个文件写入 `/tmp/my file/` 目录: - **错误的做法**:`echo "hello" > /tmp/my file/test.txt` - 命令行会将其解释为: - **命令**:`echo "hello"` - **参数**:`>` - **参数**:`/tmp/my` - **参数**:`file/test.txt` - 显然,这会导致命令执行失败,因为 `/tmp/my` 目录不存在 - **正确的做法**:为了让命令行将带空格的路径看作一个整体,需要用引号将路径包裹起来 - `echo "hello" > "/tmp/my file/test.txt"` - `echo "hello" > /tmp/"my file"/test.txt` - `echo "hello" > /tmp/my\ file/test.txt` **2. 脚本和编程语言的兼容性** 在进行提权时,我们通常不是手动输入命令,而是通过 Webshell 或漏洞执行脚本来完成操作。这些脚本(如 PHP、Python、Bash)在执行系统命令时,如果对带有空格的路径处理不当,就会导致提权失败 - **Bash 脚本**:如果脚本中的变量没有用引号包裹,那么当变量值包含空格时,会引发解析错误 - **错误示例**:`path=$webshell_path; cp /tmp/shell $path/shell.php` - **正确示例**:`path="$webshell_path"; cp /tmp/shell "$path/shell.php"` - **PHP `system()` 或 `exec()` 函数**: - **错误示例**:`system('cp /tmp/shell ' . $webshell_dir . '/shell.php');` - 如果 `$webshell_dir` 的值是 `/var/www/my site`,PHP 会执行 `cp /tmp/shell /var/www/my site/shell.php`,这会失败 - **正确示例**:`system('cp /tmp/shell "' . $webshell_dir . '/shell.php"');` - 加上双引号后,命令会正确执行 **3. 避免不必要的复杂性** 在渗透测试的实战环境中,时间非常宝贵。为了快速、稳定地完成提权,我们会尽量选择最可靠的方法 - **绕过引号限制**:在某些情况下,Webshell 或命令执行漏洞可能对引号(`"` 或 `'`)进行了过滤或转义,这会使得正确处理带有空格的路径变得更加困难 - **减少出错概率**:选择一个不带空格的目录,例如 `/tmp`、`/var/tmp`、`/dev/shm` 等,可以省去考虑引号包裹的麻烦,确保命令能够一次性成功执行,提高效率