之前写了一篇文章介绍序列化概念和两种常见进犯:1.魔法办法,2.session序列化引擎。
本篇文章持续深化,介绍别的办法:原生类序列化问题。
原生类同名函数
问题引进
什么是原生类同名函数进犯缝隙呢?咱们无妨看如下代码:
class UploadFile {
function upload($fakename, $content) {
..... // 你什么也不能做
}
function open($fakename, $realname) {
..... // 你什么也不能做
}
}
假设有这样一个上传类,可是由于有.htaccess文件的操控,上传文件夹被约束的很死,咱们很难上传咱们的一句话文件。仅有的突破口是运用类中的函数或许缝隙,删去.htaccess文件,不然即使上传了一句话文件,也不能被解析。
问题探求
可是纵观类中函数,没有一个具有删去或许掩盖功用,此刻应该怎么操作呢?此刻便应该考虑一下是否有原生类具有同名函数。比方此处的open函数,咱们能够经过php代码进行搜索:
$methodn";
}
}
?>
不难得到如下成果:
SQLite3->open
SessionHandler->open
XMLReader->open
ZipArchive->open
发现有4个php原生类带有open办法,咱们查阅每个办法的完成。
办法完成探求
关于SQLite3->open,咱们查阅官方手册:
其有3个参数,看到形式SQLITE3_OPEN_READWRITE,应该不难想到是否能够篡改.htaccess,咱们测验一下,得到报错:
显着这儿的open办法并不能直接调用,咱们持续往下看。
关于SessionHandler->open,咱们查阅官方手册:
其有两个参数,一个是保存session的方位,一个是session的姓名,很显着在这儿不太适用,咱们持续往下看。
关于XMLReader->open,咱们查阅官方手册:
该办法也有3个参数,但显着也与删去文件没有太大相关,对咱们的缝隙运用协助不大,所以也能够直接越过。
最终关于ZipArchive->open,咱们查阅官方手册:
发现其参数为2个,前者是文件名,后者是挑选形式,这儿有一个overwrite十分有目共睹,这正是咱们需求的形式。咱们跟进检查该形式描述:
本地测验一下:
发现运用该形式,能够成功删去指定文件。
那么假如方针操作序列化中,存在open调用,一起序列化可控,就有或许进行掩盖,到达删去指定文件的意图。例如题目中的:
function open($fakename, $realname) {
..... // 你什么也不能做
}
咱们能够让fakename为.htaccess,realname为ZipArchive::OVERWRITE,并操控序列化为ZipArchive目标,即可达到删去意图。
上述进程并非凭空想象出来的环境,在一次竞赛中便用到了这样的办法,在竞赛Insomnihack Teaser 2019中,File Vault一题的调查点便在于此。有爱好的能够看这篇文章:
https://corb3nik.github.io/blog/insomnihack-teaser-2019/file-vault
原生类魔法办法
咱们知道这种状况比较少量,由于需求程序去调用函数,而且其间同名的概率也是比较低的。所以不难联系到之前的魔法办法,这类办法能够在满意条件的状况下主动触发。假如咱们能发掘原生类中魔法办法的运用点,那么进犯规模必定是显着大于上述这种需求调用的同名办法的。
原生类探求
那么无妨列举出一切带有魔法办法的原生类:
运转后不难发现,这儿就有前一篇文章咱们说的原生类SoapClient魔法办法__call导致SSRF的问题:
当然这么多原生类中,必定不止这一个魔法办法能够运用。
SQLite3
例如原生类SQLite3,咱们在遍历的时分,发现其存在魔法办法:SQLite3::__construct。
咱们查阅一下官方手册:
此处能够发现,刚办法能够创立一个指定称号指定途径的空白文件:
[1][2]黑客接单网