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知识库 -> [安洵杯 2019]easy_serialize_php (对象逃逸) -> 正文阅读

[PHP知识库][安洵杯 2019]easy_serialize_php (对象逃逸)

老规矩,分析代码,一般给你一大堆代码的题目肯定是其中某个函数有漏洞啥的

过滤函数filter,其中implode函数的作用是:将$filter_arr这个数组合并为一个字符串,并以|分割开来;所以这个正则表达式是preg_replace(/php|flag|php5|php4|f1lg/i,'',$img);filter函数作用就是过滤这五个字符串。

?

如果$_SESSION存在,则销毁它(unset)?,然后是字典的键值对的对应,extract这个函数重中之重!!!它会将你post传入的参数和值形成一个键值对:如:POST方法传入一个/?_SESSION[user]=flag,他会给你变为$_SESSION["user"]='flag',后面我们要用到;

接下来如果不给f参数传参的话,则会返回index.php?f=highlight_file这个界面;如果给img_path不传参数,他会将guest_img.png进行base64编码后赋值给img这个键,如果传参数,会将你传的值进行base64编码后在进行sha1赋值给img,这两种都会阻碍我们获得flag,因此img_path这个变量是我们要思考的地方了

将session数组序列化后进行过滤,然后是f变量的三个值,这里提示叫我们去phpinfo看看,因为这里没有其他条件,我们直接f=phpinfo即可。?

可以看到有d0g3_f1ag.php这个文件,再看到f=show_image的时候会输出file_get_contents读书文件内容函数,因此我们这里思路就是如何让?d0g3_f1ag.php这个文件传到这里面去。

逆向思维:

1:将$userinfo['img']的值进行base64编码(也就是将d0g3_f1ag.php进行编码成ZDBnM19mMWFnLnBocA==)

2:userinfo是由serialize_info反序列化得来的

3:serialize_info又是由$_SESSION这个数组经过序列化编码,再进行过滤得来

因此我们现在的目标就是如何让序列化后且过滤后的字符串img的值为ZDBnM19mMWFnLnBocA==

如果我们直接利用extract函数可以post传入/?_SESSION[img]=ZDBnM19mMWFnLnBocA==;从而可以让$_SESSION['img']='ZDBnM19mMWFnLnBocA==';

?但是由于这个if语句的存在,因为我们没有传入img_path,因此它会将base64编码后的一个字符串覆盖我们传入的img值,因为他是后天的,因此我们这一步算是失败了。所以这里考的是一个反序列化的时候字符逃逸

这里借鉴一下网上大佬的payload,我是理解但是写不出来哈哈哈

a:2{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}?

有没有发现有两个},但是会默认只算前面那个},跟if语句一样,哪里先括起来就哪里运行结束,后面的就不管了,后面的加的base64就被我们丢弃了,a:2{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

这里还会经过filter函数,从而变成a:2{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";},phpflag被过滤掉了,因此这里就是字符逃逸的地方了,s:7代表后面有七个字符,但是现在被过滤掉了怎么办呢,会直接继续往后面不管什么字符取七位给他用,意味着a:2{s:7:";s:48:;"s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}将后面的;s:48:;作为他的新键,这就是字符逃逸。将img的键值对藏在phpflag里面,反序列化的时候才会出现

?更改flag的名字L2QwZzNfZmxsbGxsbGFn记得带分号,也是20位,更替

记清楚这个思路,看到的时候真的感觉懂了好多哈哈

还是不太理解字符逃逸的,我讲的有点简单,可以看一下PHP反序列化字符逃逸详解 - SecPulse.COM | 安全脉搏
?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:13:32  更:2022-03-12 17:14:01 
 
开发: 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/23 11:04:11-

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