2 WriteUP
2.1 PASS - 01
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
前端禁用 JS,直接上传 Webshell
2.2 PASS - 02
绕过 MIME 检测,通过 BurpSuite 修改 Content-Type 即可
2.3 PASS - 03
$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); //收尾去空
后端过滤了 .php
,通过使用 .php3
、 php5
、 php7
、 phtml
、 pht
等后缀绕过检测
2.4 PASS - 04
重写文件解析规则绕过。上传先上传一个名为 .htaccess
文件,内容如下
<FiileMatch "04.jpg">
SetHandler application/x-httpd-php
</FiileMatch>
再上传一个 03.jpg
,访问 03.jpg,即以 PHP 文件进行解析。
2.5 PASS - 05
还是黑名单,加上了 .htaccess
,但是没有将后缀进行大小写统一,于是可以通过大小写绕过。
2.6 PASS - 06
利用 Windows 系统的文件名特性。文件名最后增加点和空格,写成 06.php[空格] ,
上传后保存在 Windows 系统上的文件名最后的一个 .
会被去掉,实际上保存的文件名就是 06.php
2.7 PASS - 07
原理同 Pass-06,文件名后加点,改成 07.php.
2.8 PASS - 08
Windows 文件流特性绕过,文件名改成 08.php::$DATA
,上传成功后保存的文件名其实是 08.php
php 在 window 环境下,如果文件名 + ::$DATA
会把 ::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持 ::$DATA
之前的文件名
2.9 PASS - 09
原理同 Pass-06,上传文件名后加上点 + 空格+ 点,改为 09.php. .
2.10 PASS - 10
双写文件名绕过,文件名改成 10.pphphp
2.11 PASS - 11
上传路径名 %00 截断绕过。上传的文件名写成 11.jpg,save_path 改成 ../upload/11.php%00
,最后保存下来的文件就是 11.php
2.12 PASS - 12
原理同 Pass-11,上传路径 0x00 绕过。这次的 save_path 是通过 post 传进来的,还是利用 00 截断,但这次需要在二进制中进行修改,因为 post 不会像 get 对 %00 进行自动解码
利用 Burpsuite 的 Hex 功能将 save_path 改成 ../upload/12.php[二进制 00]
形式
2.13 PASS - 13
绕过文件头检查,添加 GIF 图片的文件头 GIF89a,绕过 GIF 图片检查。
2.14 PASS - 14
这里用 getimagesize 获取文件类型,还是直接就可以利用图片马就可进行绕过
2.15 PASS - 15
这里用到 php_exif 模块来判断文件类型,还是直接就可以利用图片马就可进行绕过
2.16 PASS - 16
原理:将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,
将 Webshell 代码插在该部分,然后上传。具体实现需要自己编写 Python 程序,人工尝试基本是不可能构造出能绕过渲染函数的图片 webshell 的。
参考:
2.17 PASS - 17
- 利用条件竞争删除文件时间差绕过。
- 在脚本运行的时候,访问 Webshell
2.18 PASS - 18
- 利用上传重命名竞争 + Apache 解析漏洞,成功绕过。
- 上传名字为 18.php.7Z 的文件,快速重复提交该数据包,会提示文件已经被上传,但没有被重命名。
2.19 PASS - 19
本关考察 CVE-2015-2348 move_uploaded_file() 00 截断,原理同 Pass-11,上传的文件名用 0x00 绕过。改成 19.php[二进制 00].1.jpg
2.20 PASS - 20
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
首先 end 函数取所 post 参数数组中的最后一个值, $file_name = reset($file) . '.' . $file[count($file) - 1]
。我们可以 post 一个参数名为一个 [0]一个 [2],然后 $file[count($file) - 1] 就为空,$file_name 最终就为 reset($file) 即 $file[0],就可以绕过判断
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论