PHP反序列化漏洞详解

访客4年前关于黑客接单1072

PHP反序列化

因笔者水平有限,若某处有误,还请斧正。

一、基础

为方便存储、转移对象,将对象转化为字符串的操作叫做序列化;将对象转化的字符串恢复成对象的过程叫做反序列化。

php中的序列化与反序列化函数分别为:serialize()、unserialize()

序列化后的结果可分为几类

php的session存储的也是序列化后的结果

image-20201203150820032.png

二、序列化引擎

php对session的处理有三种引擎分别为php、php_serialize、php_binary.经过这三者处理后的session结构都不相同。

使用php引擎的结果见上图

使用php_serialize引擎的结果如下

image-20201203151424144.png

使用php_binary引擎的结果如下

image-20201203151730170.png

其中存在不可见字符,将结果进行URL编码如下

image-20201203151632906.png

在session文件可写的情况下,可手动写入我们想要的内容,例如

该题目中可任意文件写,故写入session文件构造name=admin.

image-20201203160827416.png

简单说一下payload.

banner和payload拼接在一起后变为经php序列化引擎反序列化后就成为了

三、魔术 ***

满足一定条件自动调用的 *** 即为魔术 *** ,常见魔术 *** 及触发条件如下

四、反序列化漏洞

当程序中存在反序列化可控点时,造成该漏洞,可通过程序中存在的类和php原生类构造pop链达成攻击。

image-20201203165333534.png

又例如

pop链为hit->__destruct() ----> wow->__toString() ----> fine->__call(),构造payload

image-20201203170818126.png

image-20201203171003157.png

4.1 原生类利用

l3m0n文章

原生类即是php内置类,查看拥有所需魔术 *** 的类如下

结果如下

Error

image-20201214152136459.png

将Error对象以字符串输出时会触发__toString,构造message可xss

image-20201214152517793.png

异常类大多都可以如此利用

SoapClient

__call *** 可用

image-20201218162513078.png

4.2 反序列化字符逃逸

序列化字符串内容可控情况下,若服务端存在替换序列化字符串中敏感字符操作,则可能造成反序列化字符逃逸。

序列化字符串字符增加

被限定为100,但是可控并且对象被序列化后会经过filter函数处理,将敏感词QAQ替换为wuwu,而我们需要使最后的.

image-20201204103126385.png

payload为

序列化字符串字符减少

序列化字符串减少的情况,需要序列化字符串有至少两处可控点.这里是将敏感词wuwu替换为QAQ。

image-20201204111022672.png

payload为

4.3 PHAR协议利用

phar文件是php的打包文件,在php.ini中可以通过设置phar.readonly来控制phar文件是否为只读,若非只读(phar.readonly=Off)则可以生成phar文件.

image-20201207140100560.png

phar文件结构

四部分,stub、manifest、contents、signature

image-20201207142905752.png

phar反序列化触发函数

php中的大部分与文件操作相关函数在通过phar协议获取数据时会将phar文件的meta-data部分反序列化

生成phar文件例子如下

image-20201207150309783.png

4.4 PHP引用

在php中是位运算符也是引用符(为逻辑运算符).可以使不同名变量指向同一个值,类似于C中的地址。

image-20201214194911842.png

image-20201214195353291.png

倘若出现下述情况,即可使用引用符

image-20201214200551279.png

这里的是不需要绕过的,引用了后这两者的值一定会相等,不管谁做了改变。

序列化结果中的即是引用.

五、BUGKU

安慰奖

算是反序列化入门题吧

index.php中发现提示

image-20201214155509815.png

下载备份文件index.php.bak,审计

直接编写exp
image-20201217173605047.png

禁用了一些文件读取命令,曲线救国如下

image-20201217173810194.png

六、BUUCTF

ZJCTF 2019 NiZhuanSiWei

源码

之一层if通过php://input满足,file通过php://filter读取useless.php

image-20201204165520066.png

payload构造

image-20201204165807234.png

image-20201204165925994.png

MRCTF2020 Ezpop

payload构造

image-20201204173628765.png

image-20201204173743279.png

CISCN2019 Day1 Web1 Dropbox

注册账号登录后,在下载功能处发现任意文件下载,扒取源码如下

先分析类文件,User类存在魔术 *** ,并且在其中调用,再一看File类,刚好有 *** ,但是User的中并未输出结果。再看FileList类,其中存在与. *** 首先将调用的不存在函数放至数组尾部,而后遍历并且调用,执行结果会被赋值给.FileList->__destruct *** 输出result的结果。

很常规,该题POP链很好构造。

在delete.php中找到程序反序列化触发点

image-20201219144333372.png

跟进detele ***

image-20201219144358048.png

unlink是个文件操作函数,可以通过phar协议进行反序列化。程序可以上传图片,故生成phar文件修改后缀上传,在删除功能处触发反序列化即可(经测试,flag文件为/flag.txt)。

exp如下

image-20201219144749745.png

网鼎杯 2020 青龙组 AreUSerialz

程序只允许使用ascii码在32-125范围内的字符,满足条件就反序列化。

process *** 中规定,当op=="2"时可以读取文件,op=="1"时可以写入文件.

析构函数中规定,当op==="2"时使得op="1".

综上可知,当使得op !=="2"但op=="2"时,可以读取文件。构造op=2可满足条件

image-20201204163638719.png

payload构造

image-20201204164749136.png

image-20201204164810942.png

0CTF 2016 piapiapia

发现www.zip,获得源码

代码审计过后,发现序列化(update.php)与反序列化(profile.php)的点

image-20201204151953054.png

image-20201204151934353.png

过滤函数filter(class.php)如下

image-20201204155641997.png

在profile.php第16行代码中,可以看到有读取文件的操作,结合前面的序列化,可以知道这里可以逃逸photo,控制photo为想要读取的文件名再访问profile.php文件即可。

phone与email的限制很严,无法绕过,可以看见在nickname参数中我们能够输入一切我们想输入的字符(";:等).只要能够使得后半段if判断通过,即可。

strlen函数在判断数组时会返回null,而null在与整型数字判断时会返回false,故构造nickname为数组即可绕过nickname的if判断

image-20201204160307923.png

payload构造

image-20201204161216184.png

提交payload

image-20201204161316382.png

访问profile.php

image-20201204161341774.png

解码

image-20201204161407037.png

安洵杯 2019 easy_serialize_php

源码

通过extract可覆盖全局变量进一步可控制序列化结果中的user与function,两处可控并且filter会减少序列化字符串字符数,进一步逃逸对象

payload为

image-20201204145752374.png

bestphp's revenge

访问flag.php,发现

image-20201214142511580.png

虽然call_user_func各个参数皆可控,但由于第二个参数类型不可控(定死为数组),无法做到任意代码执行。我们需要通过ssrf使服务器访问到flag.php即可获得flag.在没有可见的ssrf利用处时,可考虑php自身的ssrf,也即是php原生类SoapClient.如下

image-20201214143145996.png

所以,现在如何使程序去SSRF成为首要问题。

我们知道,php在保存session之时,会将session进行序列化,而在使用session时则会进行反序列化,可控的session值导致了序列化的内容可控。

结合php序列化引擎的知识可知,默认序列化引擎为php,该方式序列化后的结果为,如下

image-20201214143927184.png

而php_serialize引擎存储的结果则仅为序列化结果,如下

image-20201214144049780.png

在php引擎中,之前的内容会被当作session的键,后的内容会在执行反序列化操作后作为session键对应的值,比如里的name就成为了$_SESSION['name'],而在执行反序列化操作后则变成了字符串4ut15m,二者结合即是$_SESSION['name']="4ut15m"

因为call_user_func的参数可控,故我们可以调用函数ini_set或者session_start来修改序列化引擎。一系列操作如下

先生成所需的序列化字符串

image-20201214144711258.png

需要在序列化结果前添加一个,也即是

尝试修改题目序列化引擎,ini_set无法处理数组,故用session_start("serialize_handler")

image-20201214145354713.png

再访问一次该页面,则变为了默认引擎(php),可以看到序列化结果键已经不再是name,值也不再是,而是SoapClient对象

image-20201214145656279.png

接下来,想要使该SoapClient对象能够发起请求,就需要调用该对象的 *** .

这一行代码在执行后,$a的值就成为了

我们知道,call_user_func函数的之一个参数为数组时,它会将数组的之一个值作为类,第二个值作为 *** 去调用该类的 *** ,如下

image-20201214150455757.png

而魔术 *** 会在调用不存在 *** 的时候自动调用,故,如果能构造到,则可以达到执行的效果,由于SoapClient不存在 *** ,那么这里就会自动调用 *** ,如下

image-20201214150932801.png

在bp中重放攻击一次,得到session

image-20201214151017047.png

修改session并刷新

image-20201214151135579.png

参考文献

1.N1BOOK反序列化部分

相关文章

七彩虹显卡怎么超频(七彩虹一键超频伤显卡吗)

七彩虹显卡怎么超频(七彩虹一键超频伤显卡吗)

最新小糖在群里和大伙聊了一下关于超频的问题,结果发现懂的人啥都懂,不懂的人啥都不懂,可见超频的分水岭把小白和老司机分的很明确。小糖翻了一些网上的一些超频教程,发现很多都是讲了和没有讲一样,还有一些讲是...

通讯地址怎么填写才正确(填表时家庭成员称谓)

通讯地址怎么填写才正确(填表时家庭成员称谓)

第一作者和通讯作者之间一直是缠缱绻绵到天涯的干系,许多人对这两者并不生疏,可是在一些细节上的问题又感受较量绕,小编本日特意收集了平时各人提到的关于两者之间的一些问题,做成问答集锦,你想知道的,都在内里...

泰国女星遭网暴起诉索赔21万-Matt遭网暴起诉索赔21万

泰国女星遭网暴起诉索赔21万-Matt遭网暴起诉索赔21万许多 大牌明星和明星的公众人物都是会遭受大家过多的关心,很有可能一些不大的个人行为都是会被大伙儿变大 ,因而遭到到网暴的大牌明星十分多,一些大...

怎么定位手机在哪里(教你手机定位找人)

想定位媳妇/老公/欠钱不还的/小三儿/情敌,不少人都有这样的需求,在应用商城里也有很多定位软件,有微信定位,手机定位,但是这些都有一个共同的缺点,需要对方同意,或者点击链接才可以。 定位别人,都是...

谁知道哪有靠谱的黑客?在哪找正规的黑客

Google Sitemap看起来只是一个简单的XML文档,它列出了你网站上所有页面,但是实际上Google Sitemap所做的远远比列出页面要重要的多。实际上, 通过这东东你能够瞥见一点Googl...

怎么查我老公手机上跟别人的微信聊天记录

<-- --> 宝宝空腹吃水果会伤胃?烂掉的水果切掉坏的还能吃?果汁比水果更有营养?这些常见的水果谣言误导了很多人,不利于身体健康,下面友谊长存小编带来关于水果的谣言有哪些?水果谣言辟谣...