Pass-01
先查看提示:
在客户端使用JS对图片进行检查然后上传。
解决方法:在客户端向服务端发送请求时抓包,对包进行修改,然后发送给服务端。
使用burp进行抓包,抓包内容如下:
把一个php文件的后缀改成jpg上传,在抓包时把filename的参数重新更换为1.php
,然后放包。
返回之后,在控制台可以看到,上传的就是我们的php文件,点击过去就能访问。
Pass-02
看提示:本pass在服务端对数据包的MIME进行检查!
查看源码可以知道,他支持的MIME类型只有:
1. image/jpeg
2. image/png
3. image/gif
解决方法:我们可以上传一个php文件,在抓包之后,对文件MIME进行修改就可以。
将圈起来的部分更换为image/png
,然后放包即可。
可以看到上传成功。
Pass-03
查看提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
光从提示上无法明白是从什么地方去进行防护的,再查看一下源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
可以看到这是一个黑名单进行防护,这个时候,我们可以把上传的php文件后缀名更改为php3
活着php5
去进行一个绕过。原因是因为php语言除了可以解析以php为后缀的文件,还可以解析php2,php3、php4、php5这些后缀的文件。
Pass-04(未解决)
查看提示:本pass禁止上传 .php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!
可以看到,他的黑名单防护是更加严谨了,不仅防止php2~php5,而且对大小写也进行了一个防范。
这里我是使用PHP study
中的apache进行的一个靶场搭建,这个时候我们可以正对apache去上传一个htaccess文件对jpg去做一个重新解析。
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
这个文件是当文件后缀名为jpg的时候,会对其进行php解析。
新建记事本写入,另存为,文件名为.htaccess
,文件类型为所有文件。
然后先上传这个.htaccess
文件,再去上传一个php脚本(重新修改文件名为1.jpg
)
这个时候我去访问http://localhost/upload-labs/upload/1.jpg
即我上传的jpg时,jpg依旧没有解析成php。
原因是在Windows系统中,apache是默认不去执行.htaccess文件的,如果是在Linux系统中就没有问题了。
我们去修改一下apache的配置文件:
这个None改为All就行。
重新执行可以访问。但是结果依旧是失败,无法访问,所有先放着,解决了再说。
Pass-05(失败)
查看提示:上传目录存在php文件(readme.php)
基本是什么信息都没有
查看源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",