zoukankan      html  css  js  c++  java
  • 远程函数执行简单的

    PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web开发框架thinkPHP;Web应用程序Discuz!、DedeCMS、PHPcms、帝国cms等都曾经存在过该类型高危漏洞。

    0x2.1 实验1:不安全的功能实现方式

    这里这个和DVWA的远程命令执行差不多 我们看看源码

    <?php
        // IP(域名)
        $host = isset($_GET['url']) ? $_GET['url'] : '';
        // 判断$host是否为空
        if(empty($host)){
            $result = '';
            $target = '';
        } else {
            // 获取$host值
            $target = $host;
    
            // 判断当前系统类型,执行对应函数
            if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
                // Windows系统
                $cmd = shell_exec( 'ping  ' . $target ); // 未过滤函数
                // $cmd = shell_exec('ping '. escapeshellcmd($target)); // escapshellcmd过滤
            } else {
                // *nix系统
                $cmd = shell_exec( 'ping  -c 4 ' . $target ); // 未过滤函数
                // $cmd = shell_exec('ping  -c 4 '. escapeshellcmd($target)); // escapshellcmd过滤
            }
    
            // 格式化输出结果,将$cmd字符串中的“
    ”替换为“<br>”
            $result = str_replace("
    ","<br>",$cmd);
        }
    ?>

    可以看见 ping功能直接使用了shell_exec来执行 且未对输入参数进行任何的过滤,那么远程代码执行就这样产生了

    我们执行看看  (这里要注意 cmd的分隔符 那些是第一个执行成功第二个执行 ,第一个执行失败第二个也执行)

    |ls

    证实,只要是Linux的shell命令,都可以通过该payload的构造出想要去执行的shell命令,等同于给你一台可以操作的Linux服务器,你想怎么操作就怎么操作!这就是远程函数执行命令的高危漏洞

    0x2.2 漏洞产生与攻击原理分析

    漏洞的产生:
    1、需求开发时候使用了shell_exec()危险函数来快速实现功能;
    2、即使使用了危险函数也没有做过滤处理;
    3、没有绕开危险函数来实现业务需求相同的功能。

    攻击的原理:

    shell_exec()

    通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。也就是说, PHP先运行一个shell环境, 然后让shell进程运行你的命令, 并且把所有输出已字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回null。

        //函数用法
        shell_exec ( string $cmd ) : string

    命令执行顺序:
    payload 顺序执行

    1. baidu.com|ls|di

    |命令链接符的执行顺序命令1、命令2、命令3;所以最终显示最后执行的命令3dir

    payload 批量执行

    1. baidu.com;ls;di

    ;命令链接符是命令1、命令2、命令3依次一起执行,所以显示了全部命令的执行结果。

    0x2.3 总结

    为什么构造payload时候用到|;字符呢?
    |;是命令的链接符,同时&可以用做命令链接符,但&与别的链接符不同的是,它不能直接放在url上访问执行,只能通过提交get/post表单;如果需要直接放在url上访问,那么需要有url编码%26,不然会被当成参数分隔符;

    另外&&ll也可以使用,但他们运行原理又不是很相近。

    所有的命令分割符如何构造payload呢?
    在实验过程中我们我们得知在url链接上可以使用|;进行构造payload;其实他们也可以和&一样,用url编码进行访问。另外当我们在get表单提交数据的时候,提交的参数会被转成url编码。
    | url编码 %7C
    ; url编码 %3B
    & url编码 %26
    空格url编码 %20
    符号与url编码在构建payload时候很重要,建议大家在实际实验过程中去理解。

  • 相关阅读:
    网络通信之 字节序转换原理与网络字节序、大端和小端模式
    [C/C++]大小端字节序转换程序
    面向对象和面向过程的区别
    编译libjpeg
    地形系统lod
    c/c++ 代码中使用sse指令集加速
    个人作品- 蘑菇大战
    个人作品- 几何战争
    Obj格式模型 读取
    各大引擎矩阵的矩阵存储方式 ----行矩阵 or 列矩阵
  • 原文地址:https://www.cnblogs.com/-zhong/p/11193835.html
Copyright © 2011-2022 走看看