精华内容
下载资源
问答
  • 原标题:Java命令注入原理并结合Java Instrument技术一、前言命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果。二、演示环境搭建这里采用springboot+swagger搭建...

    原标题:Java命令注入原理并结合Java Instrument技术

    一、前言

    命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果。

    二、演示环境搭建

    这里采用springboot+swagger搭建一个模拟的web环境:启动成功后访问:http://localhost:8090/swagger-ui.html#/commandi

    a1746bf82e28879c55ab227ffe645ef6.png

    主要有三个接口:

    1 /command/exec/string 主要实现Runtime.getRuntime.exec 入参为String 2 /command/exec/array 主要实现Runtime.getRuntime.exec 入参为String[] 3 /command/processbuilder 主要实现ProcessBuilder 入参为List

    源码:https://gitee.com/cor0ps/java-range.git这里取访问一个栗子:

    84eb6bd2d30bd24ec0813360650dc4a7.png

    三、java执行系统命令的方法 - java.lang.Runtime.getRuntime.exec - java.lang.ProcessBuilder - com.jcraft.jsch.ChannelExec

    特殊情况下method.invoke也是执行命令,后续反序列化会细说。前置条件:如果我们需要执行系统管道(|)、;、&&等,我们必须要创建shell来执行命令。java shell

    符号&形式 说明 cmd1|cmd2 |管道表示前一个命令执行的结果重定向给后一个命令,不管cmd1是否成功,cmd2都会执行 cmd1;cmd2 多语句的分隔符 cmd2&&cmd2 逻辑操作符,两个为真时返回真 cmd1||cmd2 逻辑操作符,测试条件有一个为真返回真 {cmd2,cmd2} 花括号扩展,扩展参数列表,命令依次进行扩展 `cmd2,cmd2` 反引号的功能是命令替换,将反引号中的字符串做为命令来执行 $(cmd2,cmd2) 用于变量替换,换句话说就是取变量的值 3 Runtime

    30e59c07796827569f9c038045f625db.png

    主要分为两大类,第一类入参为String类型,第二类入参为String[]类型

    public Process exec(String command); public Process exec(String cmdarray[]);

    我们先分析第一种情况,入参String:

    @ApiOperation(value = "命令执行", notes = "exec接受string参数") @PostMapping(value = "/exec/string", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseResult execString(@RequestBody PathInfo path) throws IOException { String cmdStr; //1.日志注入 2.path本身校验防跨目录等等 logger.info("Runtime.getRuntime.exec args:" + path); if(path.getType==1) { cmdStr = "/bin/sh -c" + path; }else { cmdStr = "ping " + path; } String result=ShellExcute.Exec(cmdStr); // p.getInputStream; if (result != null) { return new ResponseResult<>(result, "执行成功", 200); } //System.out.println(result); return new ResponseResult<>("result is null", "执行成功", 200); }

    这里先分析下源码,分析发现代码会进入到exec(String command, String[] envp, File dir)函数中:

    public Process exec(String command, String[] envp, File dir) throws IOException { if (command.length == 0) throw new IllegalArgumentException("Empty command"); StringTokenizer st = new StringTokenizer(command); String[] cmdarray = new String[st.countTokens]; for (int i = 0; st.hasMoreTokens; i++) cmdarray[i] = st.nextToken; return exec(cmdarray, envp, dir); }

    这里关注下StringTokenizer类及skipDelimiters方法

    public StringTokenizer(String str) { this(str, " \t\n\r\f", false); }

    这里会对传入的字符串进行处理,重点处理空格,\t\n\r\f字符,然后调用exec(cmdarray, envp, dir),继续跟踪发现最终调用ProcessBuilder:

    public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException { return new ProcessBuilder(cmdarray) .environment(envp) .directory(dir) .start; }

    从这上面两段代码中我们可以知道:

    1、string入参被转化成string[];^_^ 2、Runtime最终执行在ProcessBuilder中,参数为String可变类型 四、ProcessBuilder

    025801c43f09869e1a1bd9a8af159092.png

    主要也分为两大类,第一类入参为List类型,第二类入参为String可变参数类型(可以0到多个Object对象,或者一个Object[])

    public ProcessBuilder(List command); public ProcessBuilder(String... command);

    跟踪ProcessBuilder(String… command),发现入参将转化为List类型

    public ProcessBuilder(String... command) { this.command = new ArrayList<>(command.length); for (String arg : command) this.command.add(arg); }

    进入start方法中,发现存在prog变量,为cmdarray[0]的值,就是/bin/sh或者ping;如果security不为null,就会进入checkExec。最终进入ProcessImpl。

    return ProcessImpl.start(cmdarray, environment, dir, redirects, redirectErrorStream);

    进入之后发现可以看到最终调用的java.lang.UNIXProcess这个类执行命令,(和windows下的代码不相同),这里执行什么命令根据cmdarray[0] 来判断,最后调用forkAndExec ^3,来为命令创建环境等操作。从3和 4知道,Linux环境最终的执行都是java.lang.UNIXProcess类,那么我们可以使用类似百度OpenRASP的java Instrument技术,监控cmdarray参数,不用每次调试。百度的或者某为的都比较庞大复杂,可以使用我这个轻巧简单,可拓展。

    if ("java.lang.UNIXProcess".equals(className)) { try { ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer)); CtBehavior[] ctBehaviors = ctClass.getDeclaredConstructors; for (CtBehavior cb : ctBehaviors) { //System.out.println("UNIXProcess:" + cb.getName); if (cb.getName.equals("UNIXProcess")) { String src="{" + "String prog_1=new String($1);" + "String cmd_1=new String($2);" + "System.out.println(\"unixprocess_result:\"+prog_1+\" \"+cmd_1);" + "}"; cb.insertBefore(src); } } bytesCode = ctClass.toBytecode; } catch (IOException e) { e.printStackTrace; } catch (CannotCompileException e) { e.printStackTrace; } }

    unixprocess_result为识别关键字,方便后续搜索用户执行的命令。开启方式,在VM Options添加如下语句:-javaagent:”/path/agent.jar” 一定要加下双引号,不然会出现异常

    0ba9d326ade4551e4a1a3f6a9cdb40af.png

    运行结果如下:

    Instrument Agent start!

    日志出现上面字段,表示我们成功运行,那么可以继续下步测试。

    五、分析结果

    Runtime.getRuntime.exec入参String和String[]对比:/command/exec/string请求对应的入参是String类型,发送如下body:

    {"path":"echo \"xxxx\t\n\r\f\">/tmp/xxx" ,"type":1}

    /command/exec/array请求对应的入参是String[]类型,发送如下body:

    {"path":"echo \"xxx\">/tmp/yyy" ,"type":1}

    依次发送上面的请求,得到的结果如下:

    #string类型会被StringTokenizer过滤 unixprocess_result:prog:/bin/sh cmd:-cecho"xxxx">/tmp/xxx 未执行成功 #string[]类型没有过滤 unixprocess_result:prog:/bin/sh cmd:-cecho "xxx">/tmp/yyy 执行成功

    java instrument使用运行结果:

    ae4df5bb8de4cb21e8b4ae10c5d0c700.png

    看了 l1nk3r关于使用编码,linux下可以用bash的base64编码来解决这个特殊字符的问题。这里的利用条件一定要是这个入参String完全可控,或者存在参数注入。

    /bin/sh -c {echo,dG91Y2glMjAvdG1wL3p6eno=}|{base64,-d}|{bash,-i}

    我们运行下这个绕过的方法:运行结果如下:成功执行:

    参考

    *本文作者:buglab,转载请注明来自FreeBuf.COM返回搜狐,查看更多

    责任编辑:

    展开全文
  • 命令注入漏洞

    2021-10-06 11:44:10
    命令注入漏洞原理示例代码命令注入的局限无法进行命令注入的原因 原理 命令注入是指在某种开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当未对可控输入的参数进行严格的过滤时,则有可能发生命令...

    原理

    命令注入是指在某种开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当未对可控输入的参数进行严格的过滤时,则有可能发生命令注入。攻击者可以使用命令注入来执行系统终端命令,直接接管服务器的控制权限。

    在开发过程中,开发人员可能需要对系统文件进行移动、删除或者执行一些系统命令。Java的Runtime类可以提供调用系统命令的功能。如下代码可根据用户输入的指令执行系统命令。由于cmd参数可控,用户可以在服务器上执行任意系统命令,相当于获得了服务器权限。

    示例代码

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.lang.reflect.Proxy;
    
    
    @WebServlet(name="Command",urlPatterns = "/Command")
    public class Command extends HttpServlet {
    
        @Override
        public void init() throws ServletException{
    
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            String cmd = req.getParameter("cmd");
            Process process = Runtime.getRuntime().exec(cmd);
            InputStream in = process.getInputStream();
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int i = -1;
            while ((i = in.read(b))!=-1){
                byteArrayOutputStream.write(b,0,i);
            }
            PrintWriter out = resp.getWriter();
            out.print(byteArrayOutputStream.toString());
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    
        @Override
        public void destroy() {
            super.destroy();
        }
    }
    

    命令注入的执行结果如图
    在这里插入图片描述

    命令注入的局限

    系统命令支持使用连接符来执行多条语句,常见的连接符有|、||、&、&&,其含义为

    符号含义
    |前面命令输出结果作为后面命令的输入内容
    ||前面命令执行失败时才执行后面的命令
    &前面命令执行后继续执行后面的命令
    &&前面命令执行成功后才执行后面的命令

    例如命令ping www.baidu.com&ipconfig的执行效果如图所示,先执行完ping命令,后执行ipconfig命令
    在这里插入图片描述
    对于Java环境中的命令注入,连接符的使用存在一些局限。例如如下代码,利用ping命令来诊断网络。其中url参数为用户可控,当恶意用户输入www.baidu.com&ipconfig时,系统可以成功执行,但是Java运行环境中就不行,因为www.baidu.com&ipconfig被当作一个完整的字符串而非两条命令,因此如下代码不存在命令执行漏洞。

    protected ByteArrayOutputStream ping(String url) throws IOException{
    	Process process = Runtime.getRuntime().exec("ping " + url);
    	InputStream in = process.getInputStream();
    	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    	byte[] b = new byte[1024];
    	int i = -1;
    	while((i = in.read(b)) != -1){
    		byteArrayOutputStream.write(b,0,i);
    	}
    	return byteArrayOutputStream;
    }
    

    无法进行命令注入的原因

    Runtime类中exec方法存在如下几种实现,显而易见,要执行的命令可以通过字符串和数组的方式传入。

    public Process exec(String command) throws IOException {
            return exec(command, null, null);
        }
    public Process exec(String command, String[] envp) throws IOException {
            return exec(command, envp, null);
        }
    public Process exec(String cmdarray[]) throws IOException {
            return exec(cmdarray, null, null);
        }
    public Process exec(String[] cmdarray, String[] envp, File dir)
            throws IOException {
            return new ProcessBuilder(cmdarray)
                .environment(envp)
                .directory(dir)
                .start();
        }
    

    当传入的参数类型为字符串时,会先经过StringTokenizer的处理,主要是针对空格以及换行符等空白字符进行处理,后续会分割出一个cmdarray数组保存分割后的命令参数,其中cmdarray的第一个元素为所要执行的命令。经过处理后的参数www.baidu.com&ipconfig成为ping命令的参数,因此此时的连接符&并不生效,从而无法注入系统命令。

    展开全文
  • linux服务器;(分号)命令按照顺序(从左到右)被...sleep 6 //test无效命令,即执行失败,sleep一样执行|(管道符)通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行...

    linux服务器

    ;(分号)

    命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。

    eg:ping -c 4 127.0.0.1;sleep 6  //两条都是有效命令

    test;sleep 6 //test无效命令,即执行失败,sleep一样执行

    |(管道符)

    通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行第二条命令

    eg:ping -c 4 127.0.0.1|sleep 6

    test|sleep 6

    &(后台任务符号)

    命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作

    root@ubuntu: d & e & f

    [1] 14271

    [2] 14272

    后台执行任务d和e,而在前台执行任务f. shell将作业数目显示在方括号[ ]中,同时还显示了在后台运行的每个进程的PID(process identification,进程标识)编号。在f结束后就  会立即得到一个shell提示符

    &&(逻辑与)

    前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面的命令才被执行

    eg:ping -c 4 127.0.0.1&&sleep 6  //sleep不执行

    test&&sleep 6  //test无效命令,则sleep执行

    ||(逻辑或)

    前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的命令才被执行;

    eg:ping -c 4 127.0.0.1||sleep 6  //都执行

    test||sleep 6  //test无效命令,则sleep不执行

    `(反引号)

    当一个命令被解析时,它首先会执行反引号之间的操作。例如执行echo `ls -a` 将会首先执行ls并捕获其输出信息。然后再将它传递给echo,并将ls的输出结果打印在屏幕上,这被称为命令替换

    eg:ping -c 4 127.0.0.1`sleep 6`

    $(command)

    这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效

    eg:ping -c 4 127.0.0.1 $(sleep 6)

    windows服务器

    | & || && 跟linux一样

    展开全文
  • 命令注入

    2021-04-13 14:29:09
    os命令注入漏洞(command) 1.大致介绍: 如果我们开发的应用,特别是一些企业级的一些应用需要去调用一些外部程序(系统命令或者exe等可执行文件)。当应用需要调用一些外部程序时就会用到一些系统命令的函数。应用...

    os命令注入漏洞(command)

    1.大致介绍:
    如果我们开发的应用,特别是一些企业级的一些应用需要去调用一些外部程序(系统命令或者exe等可执行文件)。当应用需要调用一些外部程序时就会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入情况下,就会造成命令执行漏洞。

    2.形成原因:
    –用户输入作为拼接
    –没有足够的过滤

    3.漏洞危害:
    –继承web服务器程序权限(web用户权限),去执行系统命令
    –继承web服务器权限,读写文件
    –反弹shell
    –控制整个网站
    –控制整个服务器

    4.函数(比较典型的)
    —system:能够将字符串作为os 命令执行,自带输出功能
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
       system($str);
    }
    ?>
    

    —exec:能够将字符串作为os 命令执行,需要输出执行结果(输出需要输入print)
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
     print exec($str);
    }
    ?>
    

    —shell_exec:和上边的一样
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
    print   shell_exec($str);
    }
    ?>
    

    —passthru:和上边的一样 自带输出
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
       passthru($str);
    }
    ?>
    

    —popen:和上边一样 但是需要导入一个新的文件中 不会返回结果 会返回一个文件指针
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
       popen($str);
    }
    ?>
    

    在上边的url地址框上末尾加上>>1.txt (意思是将结果导入1.txt文件中)
    —反引号``:和上边一样
    简单例子:

     <?php
    if($_GET['cmd']){
     $str=$_GET['cmd'];
     print  `$str`;
    }
    ?>
    

    5.漏洞利用
    —查看系统文件:?cmd=type c:\windows\system32\drivers\etc\hosts
    —显示当前路径:?cmd=cd
    写文件:?cmd=echo" <?php phpinfo();?>">D:\php\www\shell.php(页面没有报错说明 文件写入成功).可以直接访问shelll.php查看)

    6.防御方法:
    —尽量减少命令执行函数的使用,并在disable_functions 中禁用
    ----在进入命令执行的函数或方法之前,对参数进行过滤
    —参数的值尽量使用引号包裹,并在拼接前调用adds lashes进行转义

    6.DVWA实例:
    ----low:

    127.0.0.1|  whoami    
    127.0.0.1|whoami      
    127.0.0.1&&whoami
    127.0.0.0.1||  whoami     (这是或的意思当前边出错时就会执行后边的命令) 
    

    在这里插入图片描述

    ----medium:

     127.0.0.1|  whoami   
     127.0.0.1|whoami   
     127.0.0.0.1||  whoami  
    

    ----high

    127.0.0.1|whoami   
    
    展开全文
  • 常见操作系统命令注入思路

    千次阅读 2021-12-16 10:31:15
    渗透测试技能:命令注入思路总结
  • 什么是命令注入? 在开发者开发程序过程中,一些高级应用可能需要调用一些外部程序:比如命令行获取信息、exe可执行文件等等。调用的时候会用到一些系统命令函数,通过这些函数,可以在其中注入一些恶意代码 命令...
  • 简介命令注入(也称为shell注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用OS命令注入漏洞来破坏宿主基础设施的...
  • 不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码。千万要记得执行命令的时候,不要信任其他传入...
  • 命令注入:是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤...
  • September 27, 2018– 6 mins0x01 简介Java 执行系统命令的方法易导致命令注入的危险写法以及如何避免0x02 注意点首先要注意的是,通过 Java 来执行系统命令时,并不是通过 shell 来执行 (Linux下),因此如果需要...
  • 命令注入漏洞注:命令注入漏洞的分析,及含有命令注入漏洞的函数解析含有命令注入漏洞的函数:system()、exec()、passthru()、shell_exec()、``(与shell_exec()功能相同)一、 基于DVWA环境的命令注入漏洞(shell_exec...
  • 命令注入总结

    2021-08-05 11:25:05
    远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的...
  • 命令注入 当应用程序需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数,如php中的system, exec, shell_exec等,当用户可以控制名利执行函数中的参数是,将可注入系统名利到正常名利中,造成...
  • 代码注入与命令注入

    2021-03-24 17:33:21
    代码注入(代码执行) 漏洞简介 代码执行漏洞是指应用程序本身过滤不严格,攻击者可以通过请求将代码注入到应用中,最终在wen服务器中执行。...3、命令执行 4、任意文件读取 5、权限提升 代码注入
  • PHP命令注入***

    2021-04-23 08:51:03
    PHP命令注入***漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。...Command Injection,即命令注入***,是指由于Web应用程序对用户提交的数据过滤不严格,...
  • RCE之命令注入

    2021-06-27 16:23:37
    什么是命令注入 命令注入就是能够通过控制外部参数可以达到执行系统命令的效果 命令注入产生的原因 服务器对一些函数参数未进行过滤或者过滤不严格,导致可以注入执行额外的命令 例如,&,&&,|,||...
  • 命令注入成因小谈

    2020-12-19 18:00:43
    最近做测试的时候,发现不同平台/语言下命令注入的结果会有一定的不同,于是尝试对命令注入的成因做了一个更细致的探索。语言实现PHPPHP命令执行的函数很多,其中大部分函数的实现都在 php-src/ext/standard/exec.c ...
  • 文章目录注入SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入不安全的反射命令注入代码注入表达式注入Spel表达式注入OGNL表达式注入模板注入 注入 SQL注入 JDBC拼接不当造成SQL注入 JDBC有两种方法执行SQL...
  • 因为您负责创建模块实例,所以您可以将它们传递给您想要的任何构造函数参数.您在此处所要做的就是创建一个模块,将您的配置作为构造函数参数,然后在该模块中绑定它.class YourMainModule() {public static void main...
  • Linux kernel本地命令注入漏洞2005-10-19eNet&CiweekLinux kernel 2.2.6Linux kernel 2.2.5Linux kernel 2.2.4Linux kernel 2.2.3Linux kernel 2.2.2Linux kernel 2.2.1Linux kernel 2.2 .x+ RedHat Linux 6.2 ...
  • web漏洞之命令注入

    2021-04-08 09:58:23
    命令注入与远程代码执行(RCE)不一样。它们的区别是 ,通过RCE,执行的是代码 ;而在命令注入的时 ,执行的是一个(OS)命令。 漏洞成因 将用户输入作为拼接 没有对用户输入过滤 漏洞危害 继承Web服务器
  • OS命令注入什么是OS命令注入漏洞危害在DVWA靶场中尝试命令行注入难度:low源码常见的拼接命令:常见的系统命令:难度:Medium源码payload:难度:high源码### payload:难度:impossible源码进阶 什么是OS命令注入  ...
  • SQL注入常用命令

    2021-01-19 20:28:31
    1. 数据库查询版本Mssql select @@versionMysql select vresion()/select @@versionoracle select banner from ¥... 数据库常用命令库操作连接数据库 mysql -u 用户名 -p创建数据库:create databa...
  • 代码&命令注入漏洞

    2021-04-26 16:14:30
    代码注入漏洞简介 漏洞成因 由于服务端存在执行的函数,在使用的过程中没有做好一个严格的控制,造成了实际的参数在客户端中可控。 漏洞危害 敏感信息泄露 webshell获取 命令执行 任意文件读取 权限提升 … 代码执行...
  • 什么是 OS 命令注入上周我们分享了一篇在 Node.js 中可以使用 exec() 执行命令。以基于 tar 命令去解压文件,大致代码如下:const { exec } = require('child_process');const extractPath = path.join(think....
  • 命令注入漏洞(1)

    2021-01-14 00:41:39
    命令注入漏洞原理 其实命令注入漏洞也叫命令行注入漏洞,此漏洞是指web应用程序中调用了系统可执行命令的函数,而且输入的参数是可控的,如果黑客拼接了注入命令,就可以进行非法操作了。 靶机搭建 链接:...
  • 不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码,千万要记得执行命令的时候,不要信任其他传入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,531
精华内容 55,012
关键字:

命令注入是什么