| |
|
开发:
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 |
这是一道php序列化字符串逃逸的题,在做之前需要掌握一些知识,看了这篇文章:浅析php反序列化字符串逃逸_Lemon's blog-CSDN博客,再来看这篇会更加易懂 打开环境,点击source_code,得到源码:
很明显看到最后面有个提示:maybe you can find something in here! 所以应该给$fuction传入phpinfo,而$fuction的值是由 'f' GET传值得到的,所以直接GET传入:
执行了phpinfo();语句,在其中找到: 发现有个?d0g3_f1ag.php,直接访问失败。看到之前的源代码最后有file_get_contents函数,肯定就是要我们读取这个文件了。 现在我们就要base64_decode($userinfo[‘img’])=d0g3_f1ag.php, 那么就要$userinfo[‘img’]=ZDBnM19mMWFnLnBocA==, 而$userinfo又是通过$serialize_info反序列化来的, $serialize_info又是通过session序列化之后再过滤得来的,且经过了fliter函数处理。 session包含了三部分:user、function和img,session里面的img在这里赋值,我们指定的话会被sha1哈希,到时候就不能被base64解密了,它的值在extract的后面,是不可控的:
因为extract($_POST)在赋值的后面,也就是说这两个值是可以控制的,也就是可以给它们重新赋值。
那为什么会想到反序列化字符串逃逸呢? 接着看。他是将$_SESSION数组序列化后把'php','flag','php5','php4','fl1g'换为空然后再进行反序列化。最后把$_SESSION['img']的值base64解码后读取原码。 如果没有黑名单过滤的步骤,那么他序列化后再反序列化得到的就是他原来的值,再取$_SESSION['img']。 但是无论你传不传img_path的值,得到的$_SESSION['img']都不是我们想要的,虽然这里的base64加密对应了后面的解密,但是他多了一个sha1的加密。肯定要想办法绕过这里。再看黑名单过滤,重点是它会序列化后把敏感的词换为空,导致了字符串长度发生了改变,这就想到了字符串逃逸。 下面就想办法构造payload了: 首先,d0g3_f1ag.php的base64编码是ZDBnM19mMWFnLnBocA==,将其赋值给? ?$_SESSION['img'],再序列化后得到:a:1:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";},我们要想办法让红色的这段去代替原本“$_SESSION['img'] = base64_encode('guest_img.png');”序列化的值s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==" ,所以就要GET传值将其赋给$_SESSION['function'],提前闭合使后面原本的$_SESSION['img']无效:
再将$_SESSION序列化,就得到:? a:3:{s:4:"user";s:5:"guest";s:8:"function";s:46:"a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";} 但这样反序列化回去不会成功,这题的代码中还有替换,将一些敏感字符串替换为空。这里用的字符串逃逸中的第二种字符减少。 我们如果将user赋值为敏感字符串,且长度等于蓝色部分,替换后为空,从而让上边蓝色部分反序列化回去的值作为变量user的值,就能让后面红色部分反序列化正常。蓝色部分长度为28,我们就可以:
这样序列化后就是:a:3:{s:4:"user";s:28:"";s:8:"function";s:46:"a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";} 由于构造了闭合,";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}相当于不存在了,这样红色部分就能执行。 但是反序列化需要三个变量,经过上面的逃逸就失去了$_SESSION['function']这个变量,我们又不能改为a:2,那就只能在构造的function的时候多构造一个变量: $_SESSION['img'] = 'ZDBnM19mMWFnLnBocA=='; $_SESSION['zzz'] = 'coconut'; 序列化得:a:2:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";} 赋值: $_SESSION['user'] = 'flagflagflagflagflagflagflag'; 最后得到:
可以验证一下: ?没有问题,就传值: GET:f=show_image POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";} 源码发现: ?直接访问还是没成功,说明还是要读取/d0g3_fllllllag;/d0g3_fllllllag的base64编码为: L2QwZzNfZmxsbGxsbGFn 修改传值: GET:f=show_image POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:3:"zzz";s:7:"coconut";}? ? ? ? ? //注意编码长度 ?得到答案!!!! |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/27 1:47:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |