antSword icon indicating copy to clipboard operation
antSword copied to clipboard

当网站根目录包含双引号”特殊字符时,终端执行命令失效

Open ph4ntonn opened this issue 6 years ago • 7 comments

当根目录名类似 /var/www/"(任意字符)/ ,在终端无法执行命令 如下图 图片 原因是由于目录中双引号的存在导致了语法错误

  • 一个错误出现在/source/core/php/template/command.js第10行,如下所示: $c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\""; 将其改为如下即可: $c=substr($d,0,1)=="/"?"-c {$s}":"/c {$s}";

  • 另一个错误出现在/source/modules/terminal/index.js第60-62行,如下所示:

this
   .term
   .exec(`cd ${this.options.path}`);

将其改为如下即可:

if (this.options.path.toString().search("\'")==-1){
            this
                .term
                .exec(`cd '${this.options.path}'`);
          }
          else {
            this
                .term
                .exec(`cd "${this.options.path}"`);
          }
  • 最后一个错误出现在/source/modules/terminal/index.js第418-422行,如下所示:
    return (this.isWin ?
      this.isPowershell ?
      `cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
      `cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
      `cd "${path}";${cmd};echo [S];pwd;echo [E]`);

将其改为如下即可:

    if (path.search("\'")==-1) {
      return (this.isWin ?
          this.isPowershell ?
              `cd '${path}';${cmd};echo [S];(pwd).path;echo [E]` :
              `cd /d '${path}'&${cmd}&echo [S]&cd&echo [E]` :
          `cd '${path}';${cmd};echo [S];pwd;echo [E]`);}
    else
    {
      return (this.isWin ?
      this.isPowershell ?
      `cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
      `cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
      `cd "${path}";${cmd};echo [S];pwd;echo [E]`);}

修补完成后,在之前同样的目录下打开命令行情况如下所示: 图片 打开目录中含有单引号的情况如下所示: 图片 打开正常目录的情况如下所示: 图片

若修复过程存在问题或者我有什么弄错的地方,请大佬联系我~ 感谢大佬为我们开发了这一个好工具哈哈 XD

ph4ntonn avatar Jul 30 '19 07:07 ph4ntonn

你试一下打了你这个 patch 之后 ls -al 能不能用

Medicean avatar Jul 30 '19 09:07 Medicean

你试一下打了你这个 patch 之后 ls -al 能不能用

图片 图片 图片 可以的 XD

ph4ntonn avatar Jul 30 '19 09:07 ph4ntonn

@phantom11235 cd 到其它目录,然后尝试 ls -al

$ cd /tmp
$ ls -al

除此之外,你也可以测试一下其它的字符

Control operators:
        & && ( ) ; ;; | || <newline>

Redirection operators:
         < > >| << >> <& >& <<- <>

Medicean avatar Jul 30 '19 14:07 Medicean

@phantom11235 cd 到其它目录,然后尝试 ls -al

$ cd /tmp
$ ls -al

除此之外,你也可以测试一下其它的字符

Control operators:
        & && ( ) ; ;; | || <newline>

Redirection operators:
         < > >| << >> <& >& <<- <>

cd到其他的目录会出现问题。权宜之计是/source/core/php/template/command.js第10行不用修改保持原样,这样的话只会在最初的cd操作会报错,但是接下来的命令完全可以正常执行,如下图所示: 图片 另外,创建了一个包含所有特殊字符的文件夹,并在其下打开命令行,命令的执行没有问题: 图片 对于第一步cd操作报错的问题我会再进一步研究,如果觉得无伤大雅的话其实也没关系,因为至少命令是可以执行了,如真的想进入该目录还是可以手动进入的(当然最好是完美一点了哈哈)

如果网站根目录有双引号或者单引号的话好像/source/core/php/template/command.js第10行保持不变也没用,不能执行任何命令。。。如果网站根目录没有单双引号则只会第一步报错,之后命令还是可以执行,我再研究一下吧。。

ph4ntonn avatar Jul 30 '19 16:07 ph4ntonn

@phantom11235 cd 到其它目录,然后尝试 ls -al

$ cd /tmp
$ ls -al

除此之外,你也可以测试一下其它的字符

Control operators:
        & && ( ) ; ;; | || <newline>

Redirection operators:
         < > >| << >> <& >& <<- <>

总结一下: 当网站根目录中存在双引号时,程序将无法执行任何命令。 修复如下

  • 一个错误出现在/source/modules/terminal/index.js第60-62行,如下所示:
this
   .term
   .exec(`cd ${this.options.path}`);

改为如下即可:

if (this.options.path.toString().search("\'")==-1){
            this
                .term
                .exec(`cd '${this.options.path}'`);
          }
          else {
            this
                .term
                .exec(`cd "${this.options.path}"`);
          }
  • 一个错误出现在/source/modules/terminal/index.js第418-422行,如下所示:
    return (this.isWin ?
      this.isPowershell ?
      `cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
      `cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
      `cd "${path}";${cmd};echo [S];pwd;echo [E]`);

改为如下即可:

if (path.search("\'")==-1) {
      return (this.isWin ?
          this.isPowershell ?
              `cd '${path}';${cmd};echo [S];(pwd).path;echo [E]` :
              `cd /d '${path}'&${cmd}&echo [S]&cd&echo [E]` :
          `cd '${path}';${cmd};echo [S];pwd;echo [E]`);}
    else
    {
      return (this.isWin ?
      this.isPowershell ?
      `cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
      `cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
      `cd "${path}";${cmd};echo [S];pwd;echo [E]`);}
  • 最后一个错误出现在/source/modules/terminal/index.js第414-417行,如下所示:
    path = path
      .replace(/\\\\/g, '\\')
      .replace(/"/g, '\\"')
      .replace(/\\/g, '\\\\');

改为如下即可:

    path = path
      .replace(/\\\\/g, '\\')
      .replace(/"/g, '\\"');
  • 原先/source/core/php/template/command.js第10行保持原样无需修改

这样修改过后,当网站根目录特殊字符仅是双引号时,在点击在此处打开终端后,第一步自动的cd操作会报错,但是之后的命令执行都是可以正常执行,第一步报错原因已知晓,只是暂时没有好办法解决,另外当网站根目录特殊字符仅是单引号时,仍无法执行命令。

其余情况皆可正常执行命令。

以下是部分测试图例:

  1. 当网站根目录包含大量特殊字符时: 图片

1.当网站根目录包含双引号时: 图片

  1. 当网站根目录正常时: 图片

  2. 当网站根目录既包含单引号又包含双引号时: 图片

ph4ntonn avatar Jul 31 '19 04:07 ph4ntonn

我觉得是不是把问题搞复杂了...

对于这行来说,就算是一个正常的linux终端shell执行也是有问题的,cd后面要处理双引号,这部分本身就要操作者注意. 图片

那么解决的方法可能是,凡是在操作path的时候规范下使用双引号包围,同时转义其中可能出现的\和"

/source/core/php/template/command.js第10行 在这里不需要把双引号去掉,只要增加 $s=str_replace("\\"","\\\\\\"",str_replace("\\\\","\\\\\\\\",$s));一条语句即可 /source/modules/terminal/index.js第60-62行应该类推

下面这段修复代码,简单判断有单引号则用双引号包围反之则用单引号,那么要是path同时包含单双引号会不会有问题.

改为如下即可:

if (this.options.path.toString().search("'")==-1){ this .term .exec(cd '${this.options.path}'); } else { this .term .exec(cd "${this.options.path}"); }

这里原意的可能是为了处理XSS,这样改的确可以,但会不会影响到xss就没细究了 图片

以上都应该仅基于linux环境,Windows还不允许有那么多的特殊字符, 而且也不是用单引号包围path

有待详细测试

ref:https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell

ViCrack avatar Jul 31 '19 13:07 ViCrack

我觉得是不是把问题搞复杂了...

对于这行来说,就算是一个正常的linux终端shell执行也是有问题的,cd后面要处理双引号,这部分本身就要操作者注意. 图片

那么解决的方法可能是,凡是在操作path的时候规范下使用双引号包围,同时转义其中可能出现的\和"

/source/core/php/template/command.js第10行 在这里不需要把双引号去掉,只要增加 $s=str_replace("\\"","\\\\\\"",str_replace("\\\\","\\\\\\\\",$s));一条语句即可 /source/modules/terminal/index.js第60-62行应该类推

下面这段修复代码,简单判断有单引号则用双引号包围反之则用单引号,那么要是path同时包含单双引号会不会有问题.

改为如下即可: if (this.options.path.toString().search("'")==-1){ this .term .exec(cd '${this.options.path}'); } else { this .term .exec(cd "${this.options.path}"); }

这里原意的可能是为了处理XSS,这样改的确可以,但会不会影响到xss就没细究了 图片

以上都应该仅基于linux环境,Windows还不允许有那么多的特殊字符, 而且也不是用单引号包围path

有待详细测试

ref:https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell

首先,确实操作者需要注意路径中有双引号的情况,但是,最开始的cd操作是自动完成的,只要网站的根路径包含双引号,就一定会出错。 另外,路径同时包含单双引号的情况我已经截图,可以详细看下我发的图 至于处理XSS那一部分,确实可能会有此隐患,有待进行测试 最后本测试完全基于linux,window根本无法允许这么多特殊字符

ph4ntonn avatar Jul 31 '19 13:07 ph4ntonn