防止 bash 脚本中的目录遍历漏洞
Prevent directory traversal vulnerability in bash script
如何在参数包含目录名称的 bash 脚本中防止目录遍历攻击?
示例:
$STAGE=
$APP=
deploy.sh dist/ /opt/apps/"$STAGE"/"$APP"
$STAGE
和 $APP
变量是从外部设置的。攻击者可以使用 ".."
.
将其更改为任意路径
我知道通常的解决方案是将目录字符串与 returns 绝对路径的函数结果进行比较。但是我找不到现成的解决方案,也不想提出自己的解决方案。
该脚本应该运行作为只具有访问必要目录权限的用户。
是这样的吗?
#! /bin/bash
STAGE=
APP=
expectedParentDir="/opt/apps/"
function testDir(){
arg=
if [[ ! -f $arg ]]
then
echo "File $arg does not exist."
exit 1
fi
rpath=$(realpath $arg)
if [[ $rpath != ${expectedParentDir}* ]]
then
echo "Please only reference files under $expectedParentDir directory."
exit 2
fi
}
testDir /opt/apps/"$STAGE"/"$APP"
... deploy ...
调用示例[=16=]
test.sh "../../etc/" "passwd"
Please only reference files under /opt/apps/ directory.
------------
test.sh "../../etc/" "secret"
File /opt/apps/../../etc//secret does not exist.
- 使用
-f
测试文件是否存在,如果目标必须是目录,则使用 -d
- 使用
realpath
解析路径
- 使用
== ${expectedParentDir}*
查明解析的路径是否以预期的字符串开头
如何在参数包含目录名称的 bash 脚本中防止目录遍历攻击?
示例:
$STAGE=
$APP=
deploy.sh dist/ /opt/apps/"$STAGE"/"$APP"
$STAGE
和 $APP
变量是从外部设置的。攻击者可以使用 ".."
.
我知道通常的解决方案是将目录字符串与 returns 绝对路径的函数结果进行比较。但是我找不到现成的解决方案,也不想提出自己的解决方案。
该脚本应该运行作为只具有访问必要目录权限的用户。
是这样的吗?
#! /bin/bash
STAGE=
APP=
expectedParentDir="/opt/apps/"
function testDir(){
arg=
if [[ ! -f $arg ]]
then
echo "File $arg does not exist."
exit 1
fi
rpath=$(realpath $arg)
if [[ $rpath != ${expectedParentDir}* ]]
then
echo "Please only reference files under $expectedParentDir directory."
exit 2
fi
}
testDir /opt/apps/"$STAGE"/"$APP"
... deploy ...
调用示例[=16=]
test.sh "../../etc/" "passwd"
Please only reference files under /opt/apps/ directory.
------------
test.sh "../../etc/" "secret"
File /opt/apps/../../etc//secret does not exist.
- 使用
-f
测试文件是否存在,如果目标必须是目录,则使用-d
- 使用
realpath
解析路径 - 使用
== ${expectedParentDir}*
查明解析的路径是否以预期的字符串开头