什麼是 .htaccess 檔案?
全稱是Hypertext Access(超文本入口)。提供了針對目錄改變配置的方法,在一個特定的文檔目錄中放置一個包含一個或多個指令的檔案, 以作用于此目錄及其所有子目錄,概述來說,htaccess檔案是Apache伺服器中的一個配置檔案,它負責相關目錄下的網頁配置。
工作機制
Apache在所有上級的目錄中查找.htaccess檔案,以使所有有效的指令都起作用。是以,如果請求/www/htdocs/example中的頁面,Apache必須查找以下檔案:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
總共要通路4個額外的檔案,即使這些檔案都不存在。
用途
通過htaccess檔案,可以幫我們實作:網頁301重定向、自定義404錯誤頁面、改變檔案擴充名、允許/阻止特定的使用者或者目錄的通路、禁止目錄清單、配置預設文檔、防盜鍊等功能。
優缺點
- 優點:利用目前目錄的.htaccess檔案可以允許管理者靈活的随時按需改變目錄通路政策。
- 缺點:Apache必須在所有上級的目錄中查找.htaccess檔案,對每一個請求都需要讀取一次.htaccess檔案,降低伺服器性能,其次是安全。這樣會允許使用者自己修改伺服器的配置,這可能會導緻某些意想不到的修改。
基本文法
這裡整理了一下 .htaccess中經常出現的指令即字元含義
常用指令
指令 | 功能 | 示例 |
---|---|---|
AddType | 添加類型 | AddType application/x-httpd-php .php |
RewriteEngine | 用于開啟或停用rewrite功能。 | RewriteEngine On|Off |
RewriteBase | 用于設定重寫的基準URL | RewriteBase / |
RewriteCond | 定義了一個規則的條件 | RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ // %{伺服器變量名稱} 常用變量可參考表三 |
RewriteRule | 重寫規則 | RewriteRule /sss /ttt 将使用者的/sss目錄請求轉到/ttt目錄 |
ErrorDocument | 設定錯誤頁面 | ErrorDocument 400 /error_pages/400.html |
DirectoryIndex | 設定檔案夾首頁 | DirectoryIndex test.php |
Redirect | 設定重定向 | Redirect /old/ /new/ |
RewriteCond文法中字元含義
字元 | 含義 |
---|---|
-d | 視為一個路徑名并測試它是否為一個存在的目錄 |
-f | 視為一個路徑名并測試它是否為一個存在的正常檔案 |
-s | 視為一個路徑名并測試它是否為一個存在的、尺寸大于0的正常檔案 |
-l | 視為一個路徑名并測試它是否為一個存在的符号連接配接 |
-x | 視為一個路徑名并測試它是否為一個存在的、具有可執行權限的檔案。該權限由作業系統檢測 |
-F | 是否為一個有效的檔案,而且可以在伺服器目前的通路控制配置下被通路 |
-U | 是否為一個有效的URL,而且可以在伺服器目前的通路控制配置下被通路 |
RewriteRule文法中部分字元含義
一般使用方法為 RewriteRule + 規則 + [字元]
字元 | 含義 |
---|---|
E | 設定環境變量 |
L | 結尾規則 |
N | 從頭再來 |
NC | 比對忽略大小寫 |
NE | 在輸出中不對URI進行轉義 |
R | 強制重定向 |
F | 強制禁止URL |
常用的伺服器和執行環境資訊
參數名稱 | 樣例參考值 | 說明 |
---|---|---|
HTTP_USER_AGENT | - | 目前請求頭中 User-Agent: 項的内容,如果存在的話。 |
HTTP_REFERER | http://www.test.cn/test.php | 引導使用者代理到目前頁的前一頁的位址 |
HTTP_FORWARDED | 如果使用代理伺服器的話會是代理伺服器的IP位址, 本地不容易搭環境測試出值來. | 相當于PHP中的伺服器參數: $_SERVER["HTTP_FORWARDED"] |
HTTP_HOST | www.test.com | 相當于PHP中的伺服器參數: $_SERVER["HTTP_HOST"] |
REQUEST_URI | /test.html | 浏覽器請求的資源資訊. |
REQUEST_FILENAME | C:/webRoot/t/test.html | 被請求的資源的在磁盤的實體位址. |
SERVER_ADDR | 127.0.0.1 | 目前運作腳本所在的伺服器的 IP 位址。 |
SERVER_PORT | 80 | Web 伺服器使用的端口。 |
REMOTE_ADDR | 127.0.0.1 正在浏覽目前頁面使用者的 IP 位址。 | 浏覽目前頁面的使用者的 IP 位址。 |
REMOTE_HOST | 127.0.0.1 正在浏覽目前頁面使用者的主機名。反向域名解析基于該使用者的 REMOTE_ADDR | 相當于PHP中的伺服器參數: $_SERVER["REMOTE_HOST"] |
REMOTE_PORT | 2356 | 使用者連接配接到伺服器時所使用的端口 |
REQUEST_METHOD | GET | 請求方式 |
SCRIPT_FILENAME | /var/www/html/index.php | 相目前執行腳本的絕對路徑。 |
QUERY_STRING | a=b&c=d&e=f | query string(查詢字元串),如果有的話,通過它進行頁面通路。 |
更多值可以參考PHP手冊的 PHP Manual›預定義變量›伺服器和執行環境資訊 即$_SERVER 部分
.htaccess 常見用法
實作網站的重定向
RewriteEngine On #重寫引擎開啟RewriteBase / #設定重寫基準目錄為網站根目錄 預設為http://www.xxx.com/這種形式RewriteCond %{REQUEST_FILENAME} !-f #被請求的資源位址不是檔案RewriteCond %{REQUEST_FILENAME} !-d #被請求的資源位址不是目錄RewriteRule . /index.php [L] #滿足上述兩個條件,就将滿足的請求跳轉到index.php ,[L] 為last最後一條#-f -d含義參考表二
檔案防盜鍊
RewriteEngine onRewriteCond %{HTTP_REFERER} !^$ # 判斷HTTP_REFERER不空RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] # 判斷來源是否來自自己的域RewriteRule \.(gif|jpg|png)$ http://****//error.png [R,L]# 如果上面兩個條件,将滿足連結尾部為gif、jpg、png的定向到 http://****//error.png ,此處的R為redirect 意義為強制重定向 [NC]為忽略大小寫
限定IP位址通路
order allow,denydeny from 33.33.33.33 # 禁止指定IP 通路deny from 12.12.12. # 禁止12.12.12.0/24 的位址通路allow from all # 除禁止部分都可通路,不加都不能通路
檔案保護
order allow,denydeny from all
其他用法
ErrorDocument 404 /templates/404.html #将錯誤頁面定向到404.htmlAddType application/x-httpd-php .test #将字尾為test的檔案當做php腳本運作DirectoryIndex test.php # 設定首頁為test.phpOptions All -Indexes # 禁止目錄浏覽Options All +Indexes # 開放目錄浏覽
https://htaccess.iapolo.com/ 線上生成各種功能的htaccess檔案
.htaccess 在CTF中的作用
最開始接觸.htaccess檔案就是在CTF中接觸到的,而後用到的次數也逐漸增多。
最常用的就是檔案上傳.htaccess,繞過字尾限制(在.htaccess有執行權限時)使用方法:
1、.htaccess檔案内容為
AddType application/x-httpd-php .jpg
然後再上傳字尾為jpg的一句話即可。
2、 或者可以使用如下語句
php_value auto_prepend_file ".htaccess"# <?php phpinfo(); ?>
本地測試發現,會爆500錯誤
phpstudy_pro中php版本 測試無一成功,用phpstudy2018版本中,僅非nts版本測試成功,
成功結果如下
也就是說利用php_value時,存在失敗的可能,原因通過日志來看
Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration
nts含義就不在這裡說了。可能是PHP處理程式不同的原因,原因可以參考一下
https://forums.cpanel.net/threads/invalid-command-php_value-perhaps-mis-spelled-or-defined-by-a-module-not-included.184931/
PHP處理程式:http://www.voidcn.com/article/p-qfxtodcn-btz.html
3、如果檢測字尾的正規表達式,且php同上為非nts,則可以上傳.htaccess,内容如下
php_value pcre.backtrack_limit 0php_value pcre.jit 0
示範代碼
<?php $filename = "1.php";if (preg_match("/\.php/",$filename)) {echo "true";}else{echo "false";}?>
在不存在.htaccess時運作
存在時,且内容與上相符時
pcre.backtrack_limit 與 pcre.jit的解釋在PHP手冊的PHP Manual›php.ini 配置›php.ini 配置選項清單
目的是讓正則的回溯設定為0,進而讓比對失效
也就是說第一步先上傳.htaccess,然後再上傳php檔案。
4、更多用法可以參考php手冊的php.ini 配置選項清單
在這裡說一下 這裡的可修改範圍
一般尋找可利用點就從 PHP_INI_ALL、PHP_INI_PERDIR中查找
參考資料
.htaccess 檔案使用手冊
https://c7sky.com/htaccess-guide.html
.htaccess詳解及.htaccess參數說明
https://blog.csdn.net/cmzhuang/article/details/53537591
最完的htaccess檔案用法收集整理
https://www.jb51.net/article/30445.htm
.htaccess rewrite 規則詳細說明
https://www.jb51.net/article/82158.htm
.htaccess檔案說明大全
https://htaccess.iapolo.com/htaccess-daquan.php
Apache中.htaccess檔案功能
https://www.jb51.net/article/27304.htm
htaccess百度百科
https://baike.baidu.com/item/htaccess/1645473?fr=aladdin#2
php.ini配置選項可修改範圍
http://blog.itpub.net/29753604/viewspace-134041
- END -
SKSEC掃碼關注,學習更多