壳牌注射 - 这是安全的吗?

use*_*891 2 linux bash sed

我正在解决我在Linux下的Firefox中表现不佳的问题.

我想知道以下代码是否安全.输入是不可信的,我觉得如果没有消毒,可能会很危险.

#!/bin/bash

#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;
out=`echo $in | sed -r 's/vlc:\/\/www\.youtube\.com\/watch\?v=([-_a-zA-Z0-9]*).*$/\1/g'`;
vlc "http://www.youtube.com/watch?v=$out";
Run Code Online (Sandbox Code Playgroud)

编辑1:基于Jan Hudec的评论,我已经谈到了这一点

#!/bin/bash

#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;

if [ `expr "$in" : '^vlc://www.youtube.com/watch?v=[-_a-zA-Z0-9]*$'` -gt 0 ]
then
    vlc "http${in:3}";
fi
Run Code Online (Sandbox Code Playgroud)

编辑2(可能是最终):

#!/bin/bash

#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;

if expr "$in" : '^vlc://www.youtube.com/watch?v=[-_a-zA-Z0-9]*$' >/dev/null 
then
    vlc "http${in:3}";
fi
Run Code Online (Sandbox Code Playgroud)

Jan*_*dec 5

我不认为这个特定的脚本可以被实际利用来做任何邪恶的事情,但只要vlc不会在格式错误的URL上做任何恶意,从正确的youtube主机开始,但包含有趣的东西.因为消毒完全无效.

有3个错误在一起意味着几乎任何东西都可以传递给vlc,并且可以使用它找到有关系统的一些信息:

  • 第一个问题是echo命令.Echo是unix shell中最不规则的命令,在每个shell中表现非常不同.使用printf如果需要参数传递到未修改的命令的标准输入.
  • 第二个问题是它的参数没有被引用(你仍然需要在命令替换中引用变量),所以它将进行单词拆分和文件名生成(通配).后者可能被滥用以获取系统的一些信息.只要命令只有本地效果,这就没有价值,但在任何网络可观察的情况下都会出现类似的错误.另外一些shell(但不是bash)可能允许文件名生成的一些副作用,在这种情况下它会变得危险.
  • 最后sed将返回$in不匹配的内容,并将其直接传递给vlc.它在那里被正确引用,因此vlc不会将其解释为单独的URL或选项,仅作为一个有趣的无效URL.所以除非在vlc中使用一些严重的bug,否则它不太可能被利用.

我想你应该:

  1. 使用expr带有正确引用参数的命令检查参数是否采用适当的格式.
  2. 如果没有,则中止错误.
  3. 而不是简单地删除前缀,${in#*=}因为你已经检查了前缀是否存在并以此结束=.