PHP反序列化字符串逃逸

目录

发生场景:

作用:

两种情况的利用方法:

过滤后字符数增加:

 过滤后字符数减少:


发生场景:

 一般这类漏洞,都是在序列化之后,过滤,然后反序列化引起的。

作用:

假如我们想让数组里的某个变量为我们特定的值,但这个变量却被系统强制赋值,这时便可使用字符串逃逸

两种情况的利用方法:

过滤后字符数增加:

要求:一个及以上可控变量

思想:字符串变长后,正好把变长的那部分吞进去为第一个变量,把我们要修改的值排出来并作为第二个变量

例子:

<?php
function lemon($string)
{
    $lemon = '/p/i';
    return preg_replace($lemon,'qq',$string);//若匹配到p则换为qq
}
$cmd=$_GET["cmd"];
$a="20";        //显然cmd的值我们可以自定义,但a的值为系统固定的
if(!empty($cmd))
{
$s=array($cmd,$a);
$examp=lemon(serialize($s));
var_dump(unserialize($examp));         
}
?>
​

这里a默认为20,但我们可以在可控变量 cmd 里面构造想要的a变量序列化后的值和序列化的闭合 (目的是为了把系统默认的a给闭合在外面)

我们可以构造 cmd 为:

pppppppppppppppp";i:1;s:2:"18";}

长度为 32       //长度要求: 原长度=所有的p改为qq后的q的长度,也就是p长*2=总长

这里我们把系统默认a的值从20改为 18

 逃逸过程:

过滤前序列化结果:
a:2:{i:0;s:32:"*pppppppppppppppp";i:1;s:2:"18";}*";i:1;s:2:"50";}  //*号内为我们要观察的值
过滤后:
a:2:{i:0;s:32:"*qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";i:1;s:2:"18";}||截止*";i:1;s:2:"50";}   //变为了32个q
反序列化执行的值:
a:2:{i:0;s:32:"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";i:1;s:2:"18";}//由于反序列化时识别到第一个字符长度为32,所以会自动往后取完q,故系统默认的a会被排除在外

过滤后字符数减少:

要求:两个及以上可控变量

思想:第一个变量被变空后,往后取第二个变量的值,取到我们想改变的那个固定变量后为止

<?php
function lemon($string)
{
    $lemon = '/p/i';
    return preg_replace($lemon,'',$string);//若匹配到p则换为空
}
$cat=$_GET["cat"];
$cmd=$_GET["cmd"];
$a="20";        //显然a的值我们可以自定义,但cmd的值为系统固定的
if(!empty($cmd)&&!empty($cat))
{
$s=array($cat,$cmd,$a);         
$examp=lemon(serialize($s));
var_dump(unserialize($examp));
}
?>

这里我们同样把系统默认a的值从20改为 18 

令cat为:

ppppppppppp

第一个变量长度要求:p的个数=2+序列化后的第二个变量从头到第一个;号的长度

令cmd为:

;i:1;s:3:"dog";i:2;s:2:"18";}

由于过滤后第三个变量被闭合在外,但需要3个变量,所以我需要自拟一个dog变量,凑够3个 

 逃逸过程:

过滤前序列化结果:
a:3:{1:0;s:11:"ppppppppppp";i:1;s:29:"*;i:1;s:3:"dog";i:2;s:2:"18";}*";i:2;s:2:"20";}  //*号内为我们要观察的值
过滤后:
a:3:{1:0;s:11:"";i:1;s:29:"||吞到这*;i:1;s:3:"dog";i:2;s:2:"18";}||截止*";i:2;s:2:"20";}//p变为空后,仅剩:;两个字符,向后吞9个,正好到要修改的值的序列化值由于第二个变量消失了,但需要3个变量,所以我需要自拟一个dog变量,凑够3个
反序列化执行的值:
a:3:{1:0;s:11:"【";i:1;s:29:】";i:1;s:3:"dog";i:2;s:2:"18";} //【】便于理解,可忽略

更多相关内容请查看作者博客icon-default.png?t=N176http://blog.byzhb.top/

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Fastjson是一个Java语言编写的高性能JSON处理框架,它提供了丰富的功能和灵活的API,其中包括对反序列化字符串数组的支持。 要使用Fastjson进行反序列化字符串数组,可以按照以下步骤进行操作: 1. 导入Fastjson库:首先需要在项目中导入Fastjson库,可以通过Maven或手动下载并添加到项目的依赖中。 2. 创建JSON字符串:准备一个包含字符串数组的JSON字符串,例如:`["string1", "string2", "string3"]`。 3. 定义目标类型:创建一个Java类来表示目标类型,该类应该包含一个与JSON字符串中的数组对应的字段。 4. 进行反序列化:使用Fastjson提供的API进行反序列化操作。可以使用`JSON.parseObject()`方法将JSON字符串转换为Java对象,然后通过获取字段值来获取字符串数组。 下面是一个示例代码,演示了如何使用Fastjson反序列化字符串数组: ```java import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { String jsonString = "[\"string1\", \"string2\", \"string3\"]"; // 定义目标类型 class MyObject { private String[] strings; public String[] getStrings() { return strings; } public void setStrings(String[] strings) { this.strings = strings; } } // 反序列化 MyObject myObject = JSON.parseObject(jsonString, MyObject.class); String[] strings = myObject.getStrings(); // 打印结果 for (String str : strings) { System.out.println(str); } } } ``` 这样,你就可以使用Fastjson来反序列化字符串数组了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elitewa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值