Web学习笔记之phar反序列化喵~
[TOC]
是的,没错,我又在补作业……(心虚ing)
phar是什么喵?
phar文件是php里面一种打包文件(类似压缩包),在PHP5.3及更高版本默认开启,意思就是我们可以读取phar文件。这个特性使得PHP也可以像java文件一样实现应用程序打包和组件化。
如果要生成和使用phar文件时,是通过php代码来生成phar文件的, 在php.ini中需要设置phar.readonly=Off
生成phar文件代码类似如下:
1 |
|
1.0栗子梨子李子喵➡
审计一下喵╰(°▽°)╯
● 有一个类:Flag,存在一个变量password,值为2。当析构的时候,如果password的值为1,就可以得到flag
● 并且如果phar://upload/f15936d.phar/test.txt这个文件存在,就显示找到了,否则显示没有这个文件,这个文件是需要上传的(.phar文件)
解题步骤:利用其它看起来没什么危害的函数file_exists➡接收数据➡反序列化得到一个对象➡在反序列化的过程会触发一些危险函数
现在我们想触发析构函数,就要用到phar文件的一个特性,即setMetaData这个函数。
phar之所以可以能够在不显示调用unserialize()的情况下出发反序列化,是因为PHP内核在解析phar文件的metadata(元数据)的时候,会自动调用php_var-unserialize()。当使用phar://协议读取文件的时候,内核会自动加载并反序列化粗存在文件结构中的序列化数据,从而导致漏洞
$phar ->setMetaData();用来设置meta信息,这里的metadata其实是一个对象
1 |
|
如果服务端读取了phar://upload/f391f8f.phar/test.txt这个文件,就可能触发反序列化。
而metadata被设置为了一个对象,它是以序列化的形式储存在phar文件里面,在被反序列化的时候,就可以触发析构函数,以此得到flag
因此,我们运行一下,然后会发现得到了一个phar文件
然后我们将其下载,再上传到题目中
但是题目是需要上传phar://upload/f15936d.phar/test.txt这个文件才会触发后面的一系列环节,所以我们修改一下文件名重新上传即可
返回首页就得到flag
在读取phar文件时,可触发反序列化的函数
file
fileatime/filectime/filemtime➡用于读取文件的修改时间
stat/fileinode/fileowner/filegroup/fileperms➡用于读取文件的所有者或者所属组或文件的权限
file_exists/is_dir/is_executable/is_file/is_link/is_readable/is_writeable/is_writable➡判断文件是否存在,是否是目录,时候可执行,是否是文件,是否是链接等等等
file/file_get_contents/readfile/fopen➡用于读取文件
parse_ini_file➡读取ini配置文件
unlink➡删除一个文件
copy➡拷贝一个文件
image
exif_thumbnail
exif_imagetype
imageloadfont
imagecreatefrom***
getimagesize
getimagesizefromstring
hash
hash_hmac_file
hash_file
hash_update_file
md5_file
sha1_file
file/url
get_meta_tags
get_headers
phar绕过
➡图片检查
如果网站不允许上传phar这种危险文件,只允许上传图片,我们可以修改phar文件的后缀,a.phar可以修改为a.png、a.gif或者a.jpg
如果他要读取文件内容检查的话,可以选择在文件开头添加GIF89a,伪装成gif图片,如
$phar ->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
➡不允许phar://开头
php://filter/resource=phar://a.phar/test1.txt
php://filter/read=convert.base64-encode/resource=phar://a.phar/test1.txt
压缩协议
compress.zlib://phar://a.phar/test1.txt
compress.bzip://phar://a.phar/test1.txt
compress.bzip2://phar://a.phar/test1.txt
2.0例题喵喵喵
好吧好吧,一眼看上去,后缀过滤还有一个计算哈希值的函数,但是具体代码是什么,使用f12未查看到
想要源代码的话,可以尝试看看是否有源码泄露(扫一下或者手动尝试,如index.php~、www.zip之类的)
这里的是www.zip
查看hash.php
得到源码
1 |
|
审计➡
依旧flag类,析构时password值为1时得到flag
检测phar://头,存在sha1_file函数,依旧触发反序列化
1 |
|
这里修改文件开头防止检查,下载下来,修改后缀为.gif,再上传
但是会发现依旧在计算哈希值,没有触发hash.php里的代码,原因是需要使用phar://协议触发,但是又有检测,所以我们稍微绕过,这里我选择的php://filter协议
得到flag
Leave a comment