当前位置:首页 > 网络黑客 > 正文内容

老赛棍寒假复习计划——反序列化篇(一)

访客4年前 (2021-04-17)网络黑客1068

本篇主要讲解过去一年来各大比赛中出现的比较典型的几个反序列化题目

本文涉及相关实验:PHP反序列化漏洞实验(通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。)

xnuca个人赛题目解析

复现环境:

寒假难得有时间把这一年的比赛题目都好好整理一下,首先来的是xnuca个人赛的一道题目,比较新颖,属于中等难度的web phar写入和反序列化题目,貌似在其之后的DASCTF也考察了类似的知识点,因为时间实在久远,加上xnuca当时的一小部分源码实在是找不到了,就借用了DASCTF的部分代码来进行讲解,解题方式是一样的。

这道题目首先需要通过变量覆盖来利用file_get_contents读取template.php,然后通过template.php写入phar进行反序列化。

考点一:变量覆盖

首先是一个index.php

extract变量覆盖。原理是:extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。

正常的用法通常用于把数组的值转化为变量,就好像把数组一个个解压出来成为变量一样,是不是很像extract的意思:

这样就会把数组$my_array里面的键值和对应键名组合成为一个变量,等同于再次赋值

以前ctf考察的点基本都是如下形式的变量覆盖:

关于这个地方变量覆盖的原理,就要提到一个很关键的基础知识点,$GET,$POST,$REQUEST这三个全局变量的类型是数组(不信的话自己var_dump一下),实际上我们通过get输入的变量名会成为$GET数组里的键名,输入的变量值会成为$GET里的键值,因此extract函数才会由我们的get输入接收到了$GET这个数组,从而产生了变量覆盖。

本题目的写法为:

EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。

这个地方乍一看好像是说$_GET['var']这个变量,而不是数组,但是之前也有考察过如果通过get或者post方式输入一个数组的ctf题(没错,就是绕过md5比较的php黑魔法),只要我们在get或者post输入的变量的后面加上[],就代表我们输入的是一个数组。

例如下面就代表我们输入了一个数组

把$_GET变量全dump出来为:

说白了,就是把$_GET这个数组变量里键名为var的这个元组的键值设置为了一个数组,这个数组是:

所以实际上我们还是可以通过题目中的

来进行变量覆盖。例如:

这样就能将已经赋值过的template变量重新赋值为一个只含有一个元组且键名为tp1的数组

这里很多人有个误区:为啥不是单独覆盖template数组里的一个tp1,而是覆盖了全部呢?

我们看到第一个文件index.php里面还有一个file_get_contents,想到可以文件读取。

思路:

1.$template[$tp]为我们要读取的文件名

2.$_GET["tp"] ——> $tp可控

3.array_key_exists判断$tp在$template数组中是否存在

4.存在则读取$template[$tp]指向的文件

所以我们

1. ?vartemplate=文件名&tp=a

这样template数组就剩一个a,然后他的值为我们要读取的文件名,然后tp等于a,读取$template[$tp]所指向的文件,也就是$template['a'],即我们变量覆盖进去的文件名。

访问得到

访问一下路径看到template.php源码,这里file_get_content读取到的并不是直接显示,而是被template.php写入到了某个地方,但是这个算是第一步的提示,直接访问就看到了template.php的源码,读完以后也会更理解整个过程。

最关键的方法是我们的render(因为另外两个一个是构造方法用来给三个属性赋值,一个是析构方法用来触发render)

他做了两件事情

模板变量替换

这一步的工作用一句话概括为:"用$content里匹配到的字符串的同名变量,来替换$content本身的内容"

可能乍一看看不懂,没事我们来分析:

也就是说,当你输入的内容里面含有{{([a-z]+)}}的时候,他会提取{{}}里面的字符串,然后去判断他是否为一个已经声明的全局变量,如果是的话则导入到方法中,并且用这个全局变量的值去替换$content的值。

例如搭建一个本地环境

当你输入http://ip?content={{a}},则返回如下结果

匹配输入,含有{{([a-z]+)}},其中$matches为

global用于将函数外部的一个全局变量导入函数内,题目中这句代码在render方法内,所以为了使用方法外的全局变量,得加一个global

然后preg_replace将content里的$matches[1]给替换为那个变量的值

实际上这是个啥呢,就是我们很常见的模板变量替换,比如说你的前端有一个{{a}},然后你后端检测前端代码的时候,就拿后端的a变量的值替换这个{{a}}里面a所在的位置。类似flask那种模板变量替换。

说白了就是,这段代码或者这道题应该是某个真实的cms上的代码阉割的,然后出成题目,并保留了当时的部分冗余代码。所以才留下了这个模板替换。(就是没啥用的意思,逃:)

写入文件

render做的第二件事情就是写入文件

首先给出了一个限制:

这段代码保证了你写入的后缀不能超过5个字符,虽然没什么用。

真正写文件的的代码在这里:

这里思路

1. 自 PHP 5.2.0 起 data:(? RFC 2397)数据流封装器开始有效。data://text/plain;base64,加上文件内容的base64编码

2. 变量覆盖,然后file_get_content读取我们输入的data流,然后被写入

3. file_get_contents触发phar

phar文件:

读取文件内容的base64可以用如下方式:

第一步

回显

第二步 通过file_get_contents触发phar

回显

第三步

就是写入的webshell

这题还可以用远程文件读取,把phar文件放在自己公网服务器上,然后让题目读取,就不用data://协议写入,因为file_get_contents没有限制不能读取外部文件

但是xnuca他个人赛的时候没有网络,所以这个方法行不通,但是DASCTF可以用这个方法。

总的来说,难度适中,主要一个是知道他这里可以任意文件读取和读取以后直接写入这个是关键,phar倒是没有什么难度,如何在没有外网的情况下通过data://流写入是关键。

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:http://therlest.com/105552.html

分享给朋友:

“老赛棍寒假复习计划——反序列化篇(一)” 的相关文章

安宫牛黄丸图片及价格(同仁堂安宫丸价钱13万

动物研究显示,体外培育牛黄;还有个绿色锦盒包装的用的是人工麝香。 730点00安宫牛黄丸的药理作用主要表现为抗惊厥作用及解热作用。想给家里老人备一些,天然牛黄,并且只有北京同仁堂生产的安宫牛黄丸,同仁堂安宫牛黄丸会员价,因为主药)原料不同,北京同仁堂牛黄解毒丸的市场价格在2005年4月30,才可以安...

如厕阅读-如厕时读书看报有哪些坏处?

如厕阅读-如厕时读书看报有哪些坏处? 读书、看报兼如厕,不少人有这样的习惯。然而这一习惯非常不好。蹲厕时读书看报,会干扰大脑对排便传导神经的指挥,延长排便时间。现代医学研究证实,蹲厕超过3分钟即可直接导致直肠静脉曲张淤血,易诱发痔疮,且病情的轻重与时间长短有关。蹲厕时间越长,发病几率越高。因为久蹲...

怎样辨别有农药残留的蔬菜?

怎样辨别有农药残留的蔬菜? 一、不吃形状、颜色异常的蔬菜: 形状:颜色正常的蔬菜,一般是常规栽培,是未用激素等化学品处理的,可以放心地食用。 “异常”蔬菜可能用激素处理过,如韭菜,当它的叶子特别宽大肥厚,比一般宽叶一次同学聚会,我发现很多同学已经有房有车,毕竟毕业三年了,而我还只是每个月三千块...

不锈钢水箱制作厂家(小型家用储水箱不锈钢

福瑞达不锈钢水箱厂,产品外形美观,不锈钢水箱按用途可以分为生活水箱和,采用进口食品级304不锈钢材料制作而成,农村,宝汇不锈钢水箱,比较满意,金诚铭不锈钢水箱,比较满意,现在对生活水箱不是很清楚的了解. 有很多的水箱,安装快,含镍量、生产基地位于江西省南昌英雄城。1-9000T水箱都能定做。 此类水...

二手阿特兹2017款价格 - 阿特兹二手车9万

这个价格2点0都不贵,刚刚两千多公里,一般来说该车子的兹车况还有手续方面不存在,一个是阿特兹新车,我觉得还是阿特兹的这款车更好一点。车辆如果没有任何问题,款万这个车比较保值的,不同的配置不同的价格,准新车,19多便宜3 我就以现在的价格啊。二手车 一个是奥迪二手的,2点5简直就是赚到了。满意请采纳,...

英寸和米的换算(这些单位换算你还知道吗?)

英寸和米的换算(这些单位换算你还知道吗?) 一寸等于多少厘米 更新:2016-03-28 14:07:21 查看相关文章 一寸等于多少厘米 1寸=3.3333333厘米(cm) 1英寸(in)=2.54厘米(cm) 一寸等于多少毫米 1寸=33.3333333毫米(mm) 1英寸...

评论列表

语酌独语
3年前 (2022-06-18)

content本身的内容"可能乍一看看不懂,没事我们来分析:也就是说,当你输入的内容里面含有{{([a-z]+)}}的时候,他会提取{{}}里面的字符串,然后去判断他是否为一个已经声明的全局变量,如果是的话则

酒奴信愁
3年前 (2022-06-18)

_contents触发phar回显第三步就是写入的webshell这题还可以用远程文件读取,把phar文件放在自己公网服务器上,然后让题目读取,就不用data://协议写入,因为file_get_contents没有限制不能读取外部文件但是xnuca他个人赛

冬马忆囚
3年前 (2022-06-18)

件内容的base64可以用如下方式:第一步回显第二步 通过file_get_contents触发phar回显第三步就是写入的webshell这题还可以用远程文件读取,把phar文件放在自己公网服务器上,然后让题目读取,就不用data://协议写入,因为file_get_content

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。