漏洞原理---文件上传漏洞
# 文件上传漏洞
# 漏洞成因:
- 后端存在文件上传的功能,并且没有对上传的文件内容,大小,类型做严格的安全限制。导致攻击者可以使用恶意文件直接威胁服务器
# 挖掘点:
- 上传头像
- 上传文档
- 发表文章,发表评论中的插入图片
# 漏洞危害:
- 未限制文件内容或者类型
- 网站被
getshell
- 服务器被提权
- 网站被
- 未限制文件大小
- 服务器拒绝服务攻击
# 利用思路
# 1、Nginx 服务 (通常运行在 Linux 上,如果运行在 Windows 上,也可以使用 windows 特性绕过)
- 文件名解析逻辑漏洞
- 前提条件
- nginx 0.8.41-1.4.3 或 1.5.0-1.5.7
- 上传:
webshell.jpg空格
,访问:webshell.jpg.php
00
这里使用 HEX 编辑,不能使用空格
- 前提条件
- 00 截断:
- 前提条件
- 版本 0.5、0.6、0.7<=0.7.65,0.8<=0.8.37
- 上传:
webshell.jpg空格
,访问:webshell.jpg.php
00
这里使用 HEX 编辑,不能使用空格
- 前提条件
- 解析漏洞:
- 前提条件:
- PHP 配置
cgi.fix_pathinfo
开启 - 上传:
webshell.jpg
图片马,访问webshell,jpg/.php
- PHP 配置
- 前提条件:
# 2、IIS 服务 (IIS 服务部署在 windows 上,可以利用 windows 特性和 IIS 对应的解析漏洞绕过)
- 利用 windows 特性绕过
- 文件后面加空格 (%20) 会被忽略
webshell.php%20
- 文件后面加点会被忽略
webshell.php.
- 文件后面加
::$DATA::其他
,::$DATA
后的文件会识别为文件流webshell.php::$DATA::其他
- 会自动删除冒号后面的内容
webshell.php:.jpg
- 文件后面加空格 (%20) 会被忽略
# 3、Apache 服务 (通常运行在 windows 上,如果运行在 Windows 上,也可以使用 windows 特性绕过)
-
.htaccess
文件绕过.htaccess
文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置,通过.htaccess
可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许 / 阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能.htaccess
文件的主要功能包括使用密码保护文件夹,禁止或允许用户使用 IP 地址访问,禁止目录浏览,将用户自动重定向到另一个页面或目录,创建和使用自定义错误页面,改变具有特定扩展名的文件的使用方式,或者通过指定文件扩展名或特定文件作为主页。.htaccess(mod_rewrite)
中的 apache 的重写模块,这个模块允许重定向发生。- 前提条件:
mod_rewrite
模块开启AllowOverride ALL
- 先上传
.htaccess
文件,再上传jpg
图片文件AddType application/x-httpd-php .jpg
.htaccess
文件内容:
-
# 虽然好用,但是会误伤其他正常文件,容易被发现 <IfModule mime_module> AddHandler php5-script .gif #在当前目录下,只针对gif文件会解析成Php代码执行 SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行 </IfModule> # 精确控制能被解析成php代码的文件,不容易被发现 <FilesMatch "evil.gif"> SetHandler application/x-httpd-php #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行 AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行 </FilesMatch> # 同1没太大区别 <IfModule mime_module> AddType application/x-httpd-php .gif </IfModule>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
- 利用方式:上传覆盖`.htaccess`文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
- 0A换行绕过
- 前提条件:
- Apache版本号为2.4.0-2.4.29
- 服务器必须为Linux
- 获取文件名时不能用`$_FILES['file']['name']`,因为它会自动把换行去掉
- 使用:Burp抓包,在文件名后面增加字母`a`,在HEX编辑模式下,修改a的61为`0a`
- 访问文件使用:`**webshell.php%0a**`
- 多后缀上传
- 前提条件:Apache版本为1.x-2.x
- 上传多个后缀,如`webshell.php.qwe.swe`
- SSI命令执行漏洞
- 前提条件:目标服务器开启了SSI与CGI协议
- 上传`webshell.shtml`文件,即可执行`whoami`命令
#### 利用思路-通用方法
- 00截断(运行环境存在漏洞,并不是代码上存在的漏洞)
- 前提条件:
- PHP版本<5.3.4
- `magic_quotes_gpc=Off`
- 在Burp中抓上传包修改文件名为`webshell.php1`,在HEX编辑窗口,将1改为`00`;URL当中的00阶段需要使用`%00`
- 陌生后缀绕过
- 可以将陌生后缀保存为常用字典,在测试时使用burp进行爆破
- PHP站点:`php,php5,php4,php3,php2,html,htm,phtml,phar,pht,shtml`
- ASP站点:`asp,aspx,asa,asax,ascx,ashx,asmx,cer,cdx`
- JSP站点:`jsp,jspa,jspx,jsw,jsv,jspf,jtml`
- 大小写绕过
- 后端在设置的时候没有设置统一的大小写设置
- 先获取文件名,将文件名转为字符串,调用字符串当中转小写的方法,把文件名转为小写,然后再判断这个小写的字符串在不在黑名单中
- 双写后缀绕过
- `webshell.pphphp`剔除`php`后就是`webshell.php`
- `webshell.p.phphp`剔除`.php`后就是`webshell.php`
- CTFHub关键代码 `$name = str_ireplace($blacklist, "", $name);`
- `str_ireplace(find,replace,string,count)`替换字符串中的一些字符(不区分大小写)
- `replace:` 必需。规定替换
- `find:`中的值的值。
- `string:`必需。规定被搜索的字符串。
- `count:`可选。一个变量,对替换数进行计数。
- MIME类型绕过
- 上传`webshell.php`,只修改`Content-Type`为图片类型,如`image/jpeg`
- 后端只检测`Content-Type`,则只修改`Content-Type`即可绕过,无需修改后缀
- 将一句话木马压缩进图片中(尽可能小的图片)
命令:`copy 1.jpg/b+2.php 3.php`
- ```
ie 火狐
id 后缀名 php识别出的文件类型
0 gif image/gif
1 jpg image/jpeg
2 png image/png
3 bmp image/bmp
4 psd application/octet-stream
5 ico image/x-icon
6 rar application/octet-stream
7 zip application/zip
8 7z application/octet-stream
9 exe application/octet-stream
10 avi video/avi
11 rmvb application/vnd.rn-realmedia-vbr
12 3gp application/octet-stream
13 flv application/octet-stream
14 mp3 audio/mpeg
15 wav audio/wav
16 krc application/octet-stream
17 lrc application/octet-stream
18 txt text/plain
19 doc application/msword
20 xls application/vnd.ms-excel
21 ppt application/vnd.ms-powerpoint
22 pdf application/pdf
23 chm application/octet-stream
24 mdb application/msaccess
25 sql application/octet-stream
26 con application/octet-stream
27 log text/plain
28 dat application/octet-stream
29 ini application/octet-stream
30 php application/octet-stream
31 html text/html
32 htm text/html
33 ttf application/octet-stream
34 fon application/octet-stream
35 js application/x-javascript
36 xml text/xml
37 dll application/octet-stream
38 dll application/octet-stream
id 后缀名 php识别出的文件类型
0 gif image/gif
1 jpg image/pjpeg
2 png image/x-png
3 bmp image/bmp
4 psd application/octet-stream
5 ico image/x-icon
6 rar application/octet-stream
7 zip application/x-zip-compressed
8 7z application/octet-stream
9 exe application/octet-stream
10 avi video/avi
11 rmvb application/vnd.rn-realmedia-vbr
12 3gp application/octet-stream
13 flv application/octet-stream
14 mp3 audio/mpeg
15 wav audio/wav
16 krc application/octet-stream
17 lrc application/octet-stream
18 txt text/plain
19 doc application/msword
20 xls application/vnd.ms-excel
21 ppt application/vnd.ms-powerpoint
22 pdf application/pdf
23 chm application/octet-stream
24 mdb application/msaccess
25 sql text/plain
26 con application/octet-stream
27 log text/plain
28 dat text/plain
29 ini application/octet-stream
30 php application/octet-stream
31 html text/html
32 htm text/html
33 ttf application/octet-stream
34 fon application/octet-stream
35 js text/html
36 xml text/xml
37 dll application/octet-stream
38 class application/java
* application/octet-stream //应用程序
323 text/h323
acx application/internet-property-stream
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
asf video/x-ms-asf
asr video/x-ms-asf
asx video/x-ms-asf
au audio/basic
avi video/x-msvideo
axs application/olescript
bas text/plain
bcpio application/x-bcpio
bin application/octet-stream
bmp image/bmp
c text/plain
cat application/vnd.ms-pkiseccat
cdf application/x-cdf
cer application/x-x509-ca-cert
class application/octet-stream
clp application/x-msclip
cmx image/x-cmx
cod image/cis-cod
cpio application/x-cpio
crd application/x-mscardfile
crl application/pkix-crl
crt application/x-x509-ca-cert
csh application/x-csh
css text/css
dcr application/x-director
der application/x-x509-ca-cert
dir application/x-director
dll application/x-msdownload
dms application/octet-stream
doc application/msword
dot application/msword
dvi application/x-dvi
dxr application/x-director
eps application/postscript
etx text/x-setext
evy application/envoy
exe application/octet-stream
fif application/fractals
flr x-world/x-vrml
gif image/gif
gtar application/x-gtar
gz application/x-gzip
h text/plain
hdf application/x-hdf
hlp application/winhlp
hqx application/mac-binhex40
hta application/hta
htc text/x-component
htm text/html
html text/html
htt text/webviewhtml
ico image/x-icon
ief image/ief
iii application/x-iphone
ins application/x-internet-signup
isp application/x-internet-signup
jfif image/pipeg
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpg image/pjpeg
js application/x-javascript
latex application/x-latex
lha application/octet-stream
lsf video/x-la-asf
lsx video/x-la-asf
lzh application/octet-stream
m13 application/x-msmediaview
m14 application/x-msmediaview
m3u audio/x-mpegurl
man application/x-troff-man
mdb application/x-msaccess
me application/x-troff-me
mht message/rfc822
mhtml message/rfc822
mid audio/mid
mny application/x-msmoney
mov video/quicktime
movie video/x-sgi-movie
mp2 video/mpeg
mp3 audio/mpeg
mpa video/mpeg
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpp application/vnd.ms-project
mpv2 video/mpeg
ms application/x-troff-ms
mvb application/x-msmediaview
nws message/rfc822
oda application/oda
p10 application/pkcs10
p12 application/x-pkcs12
p7b application/x-pkcs7-certificates
p7c application/x-pkcs7-mime
p7m application/x-pkcs7-mime
p7r application/x-pkcs7-certreqresp
p7s application/x-pkcs7-signature
pbm image/x-portable-bitmap
pdf application/pdf
pfx application/x-pkcs12
pgm image/x-portable-graymap
pko application/ynd.ms-pkipko
pma application/x-perfmon
pmc application/x-perfmon
pml application/x-perfmon
pmr application/x-perfmon
pmw application/x-perfmon
png image/x-png
pnm image/x-portable-anymap
pot, application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
prf application/pics-rules
ps application/postscript
pub application/x-mspublisher
qt video/quicktime
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
ras image/x-cmu-raster
rgb image/x-rgb
rmi audio/mid
roff application/x-troff
rtf application/rtf
rtx text/richtext
scd application/x-msschedule
sct text/scriptlet
setpay application/set-payment-initiation
setreg application/set-registration-initiation
sh application/x-sh
shar application/x-shar
sit application/x-stuffit
snd audio/basic
spc application/x-pkcs7-certificates
spl application/futuresplash
src application/x-wais-source
sst application/vnd.ms-pkicertstore
stl application/vnd.ms-pkistl
stm text/html
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
t application/x-troff
tar application/x-tar
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-compressed
tif image/tiff
tiff image/tiff
tr application/x-troff
trm application/x-msterminal
tsv text/tab-separated-values
txt text/plain
uls text/iuls
ustar application/x-ustar
vcf text/x-vcard
vrml x-world/x-vrml
wav audio/x-wav
wcm application/vnd.ms-works
wdb application/vnd.ms-works
wks application/vnd.ms-works
wmf application/x-msmetafile
wps application/vnd.ms-works
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
xaf x-world/x-vrml
xbm image/x-xbitmap
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xof x-world/x-vrml
xpm image/x-xpixmap
xwd image/x-xwindowdump
z application/x-compress
zip application/zip -firefox
application/x-zip-compressed -IE
php上传压缩文件(rar,7z,zip)
php上传可执行文件(exe)
php上传视频文件,音乐文件,歌词文件(avi,rmvb,3gp,flv,mp3,wav,krc,lrc)
php上传文本文件和文档文件(word->doc,excel->xls,幻灯片->ppt,pdf,chm)
php上传数据库文件(access文件,sql文件,con文件,日志文件log, dat文件)
php上传网页文件,脚本文件,字体文件(ini,php,html,htm,字体文件:ttf,fon, js ,xml)
php上传其他文件(class类文件,dll动态加载库文件) -
上传图片马
- 上传图片马后利用文件包含点执行图片马
- 一般来说,如果先找到文件包含漏洞,才考虑使用图片马
- 上传图片马后利用文件包含点执行图片马
-
条件竞争
- 通常情况下,条件竞争漏洞不推荐使用,高并发请求容易对服务器造成影响
- 先获取上传文件,在保存文件到目录下,判断是否是 php 文件,如果是,删除。只有在在保存文件到目录下,判断是否是 php 文件这种逻辑情况下才能使用条件竞争
-
JavaScript 校验
- 禁用 js 前端验证
# 漏洞修复 - 加固与防御
-
使用最新版中间件
- 及时更新中间件版本,防止使用漏洞版本
-
正确配置中间件
- 错误中间件配置会导致解析漏洞
-
对保存上传文件的文件夹限制权限
- 配置中间件,不解析上传文件夹中的文件
-
使用白名单和 MIME 类型限制上传
- 在确保以上的情况下,使用白名单和 MIME 结合检测文件类型和内容,着重检查文件名称中的特殊字符串
-
增加安全设备,网站防火墙
- 为了安全保证,最好是加上防火墙和防护设备
-
限制文件大小
- 假设服务器有 4G 内存,直接上传 5G 内容,导致服务器内存爆满,从而造成拒绝服务攻击
-
OSS
- 将所有的静态资源托管到 OSS 平台上,这样只需要在加载资源时,防范文件包含漏洞即可
不暴露上传后的文件的保存路径
- 将所有的静态资源托管到 OSS 平台上,这样只需要在加载资源时,防范文件包含漏洞即可
漏洞原理---文件上传漏洞
https://rofgd.github.io/2022/10/14/漏洞原理---文件上传漏洞/