首页 > 编程语言 >PHP反序列化 字符逃逸

PHP反序列化 字符逃逸

时间:2023-10-05 13:33:07浏览次数:28  
标签:2211 PHP tangyuan name age echo 逃逸 序列化

产生条件:

  • 需要存在两个可控点
  • 给的"正则匹配"或过滤存在改变字符数量的规则

利用方法:

  1. 先找到两个可控点,进行简单的序列化输出,以便进行比对
  2. 找到序列化值中可控点位置,并判断需要吞掉或挤掉的字符
    • 吞掉字符数:从第一个可控点的最后一个单引号或双引号吞到第二个可控点的第一个单引号或双引号,最后通过 ;"进行序列化payload
    • 挤掉字符数:从第一个可控点的最后一个单引号或双引号到最后

(1).过滤后字符增多

<?php
function change($str){
    return str_replace("-","--",$str);
}
$name = $_GET['name'];
$age = "tangyuan";
$arr = array($name,$age);
echo "反序列化字符串:";
echo serialize($arr);
echo "<br/>";
echo "过滤后:";
$old = change(serialize($arr));
$new = unserialize($old);
var_dump($new);
echo "<br/>此时,age=$new[1]";

传入name=-2211,这时未经过滤的序列化值为:a:2:{i:0;s:5:"-2211";i:1;s:8:"tangyuan";}
经过change过滤后:a:2:{i:0;s:5:"--2211";i:1;s:8:"tangyuan";}
原本的-就变成了--,但长度还是5,所以没找到闭合导致反系列化错误
image.png
当我们传入name=--------------------mao";i:1;s:6:"woaini";}
产生的原序列化值为:a:2:{i:0;s:43:"--------------------mao";i:1;s:6:"woaini";}";i:1;s:8:"tangyuan";}
过滤后的序列化值为:a:2:{i:0;s:43:"----------------------------------------mao";i:1;s:6:"woaini";}";i:1;s:8:"tangyuan";}
因为长度只有43,所以最后的要反序列化后的值变为:
a:2:{i:0;s:43:"----------------------------------------mao";i:1;s:6:"woaini";}
image.png
当我们将可控点引号后的值变为带有危险的payload时就实现了

(2).过滤字符减少
<?php
function change($str){
    return str_replace("--","-",$str);
}
$arr['name'] = $_GET['name'];
$arr['age'] = $_GET['age'];
echo "反序列化字符串:";
echo serialize($arr);
echo "<br/>";
echo "过滤后:";
$old = change(serialize($arr));
echo $old;
echo "<br/>";
$new = unserialize($old);
echo $new;
echo "<br/>此时,age=";
echo $new['age'];

传入name=--2211&age=tangyuan时,未经过滤的序列化值为:
a:2:{s:4:"name";s:6:"--2211";s:3:"age";s:8:"tangyuan";}
经过序列化过滤后的序列化值为: {s:4:"name";s:6:"-2211";s:3:"age";s:8:"tangyuan";}
原本的--就变成了-,但长度还是6,所以没找到闭合导致反系列化错误
image.png
当传入:name=2211&age=";s:3:"age";s:8:"tangyuan";} 时,
我们要想让 a:2:{s:4:"name";s:4:"2211";s:3:"age";s:28:"";s:3:"age";s:8:"tangyuan";}";} 红色字体逃逸就需要吞掉紫色部分:
当传入:name=------------------------------------2211&age=";s:3:"age";s:8:"tangyuan";}
产生的原序列化值为:
a:2:{s:4:"name";s:40:"------------------------------------2211";s:3:"age";s:28:"";s:3:"age";s:8:"tangyuan";}";}
过滤后的序列化值为:
a:2:{s:4:"name";s:40:"------------------2211";s:3:"age";s:28:"";s:3:"age";s:8:"tangyuan";}";}
最终要反序列化的值变为了a:2:{s:4:"name";s:40:"{xxx红色部分}";s:3:"age";s:8:"tangyuan";}";}
image.png
我们只要把我们想要的危险部分放到第二个可控点上就行了

标签:2211,PHP,tangyuan,name,age,echo,逃逸,序列化
From: https://www.cnblogs.com/tangyuan2211/p/17743253.html

相关文章

  • PHP配置文件详解php.ini
    [PHP];PHP还是一个不断发展的工具,其功能还在不断地删减;而php.ini的设置更改可以反映出相当的变化,;在使用新的PHP版本前,研究一下php.ini会有好处的;;;;;;;;;;;;;;;;;;;;关于这个文件;;;;;;;;;;;;;;;;;;;;;这个文件控制了PHP许多方面的观点。为了让PHP读取这个文件,它必须被......
  • 映射和序列化
    映射数据库映射(ORM):将数据库表和对象模型之间进行映射,方便开发人员进行对象操作和数据库访问。优点是可以简化数据库操作、提高开发效率,缺点是对于复杂查询和性能要求较高的场景可能会有性能问题。适用于大部分需要与数据库打交道的应用场景。关系映射:将关系型数据库中的表和......
  • webman:worker exit with status 139(Webman-framework v1.5.7/PHP 8.1.1)
    一,报错信息:worker[webman:225916]exitwithstatus139进程会退出二,解决:禁用opcache模块:在php.ini中注释掉opcache,使它不生效,如下:[opcache];opcache.enable=1;opcache.enable_cli=1;opcache.jit_buffer_size=128M;opcache.jit=tracing;zend_extension=opcache......
  • PHP_POP链
    POP链审计做一题简单的POP链的题目来学习一下POP链的构造。<?php//flagisinflag.phphighlight_file(__FILE__);error_reporting(0);classModifier{private$var;publicfunctionappend($value){include($value);echo$flag;}......
  • C PHP Go.md
    C语言1.visualStudiolnstaller安装去官网下载后点击exe文件,在弹出的窗口中点击继续后,选择c++桌面开发并点击安装。注册账号登录vsl的时候需要登录账号,所以需要试用邮箱创建一个账号。新建项目点击新建项目后,再点击控制台应用并下一步,输入项目名称、路径......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除数......
  • vulhub thinphp 5.0.23 学习复现
     靶场是基于vulhub的靶场docker-composeup-d 启动靶场并且漏洞环境是thinkphp5.0.23 现在验证漏洞列出了当前目录文件 可以,验证完了,看到漏洞存在 现在想尝试弹一个shell,开启监听  ok!bp可以,但是,查看服务器并未得到shell不清楚是为什么,等下再看,先拿web......
  • Begin of PHP
    打开直接就是一份php代码,分析代码发现需要闯关,一共有五关 直接用ai给我翻译一下Level1:用户需要提供名为'key1'和'key2'的GET参数。这两个参数的内容不应相同,但它们的MD5哈希值应该相同。如果条件满足,将设置变量$flag1为True,否则会显示"nope,thisislevel1"。......
  • 《Java编程思想第四版》学习笔记32--关于static字段的序列化
    //:CADState.java//Savingandrestoringthestateofa//pretendCADsystem.importjava.io.*;importjava.util.*;abstractclassShapeimplementsSerializable{publicstaticfinalintRED=1,BLUE=2,GREEN=3;privateintxPos,yPos,dimension;p......