提权时选择可读写目录,为何尽量不用带空格的目录
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
等,可以省去考虑引号包裹的麻烦,确保命令能够一次性成功执行,提高效率