在渗透测试中,通过上传文件漏洞来getShell
是比较常见的方法,upload-labs这个靶场总结了各种常见的文件上传漏洞类型,下面是本人的每个关卡的bypass方法总结。
Pass-001
描述
直接上传weshell.php
会弹出只能上传图片后缀的提示,不能上传非图片文件
ByPass
用firefox查看下Network,弹出提示过程中并没有走Network,确定其只在JavaScript中进行后缀名判断,通过禁用JS或者修改JS即可bypass
Pass-002
描述
这题是服务端校验MIME类型
ByPass
用Burp Suite拦截HTTP请求报文,把Content-Type改成image/jpeg再forward就可以bypass了
Pass-003
描述
黑名单校验后缀名
ByPass
将webshell.php
改成webshell.php3
就能bypass。 像这种通过后缀黑名单的,可以通过改后缀来绕过,只能能触发解析即可,根据配置设定。
Pass-004
描述
基于后缀名黑名单的校验
ByPass1 - %00截断
将webshell.php
改名成webshell.php%00.jpg
即可bypass,利用时直接调用webshell.php
,忽略后面的%00.jpg
。 这个原理是PHP 5.2.x的一个%00截断漏洞,详情见这个
ByPass2 - 使用.htaccess
分两步:
- 先上传
.htaccess
,内容是SetHandler application/x-httpd-php
- 然后上传
test.jpg
图片木马,然后在url中请求图片木马地址即可getShell
Pass-005
描述
基于黑名单的校验
ByPass1 - %00截断
同004
ByPass2 -
暂时没想法
Pass-006
描述
基于黑名单,但是没对大小写进行校验
ByPass
将webshell.php
改名成webshell.phP
即可bypass
Pass-007
描述
基于黑名单,过滤大小写,但是没过滤后缀后空格
ByPass
用BP
拦截下,后缀php
后加空格即可绕过

Pass-008
描述
黑名单,所有可执行后缀都不可以上传,包括前后空格
ByPass
用BP
拦截下,后缀php
后加.
即可绕过,直接打开图片路径即可getshell

Pass-009
描述
黑名单,使用windows文件流特性
ByPass
用BP
拦截下,后缀php
后加::$data
即可绕过

Pass-010
描述
黑名单,骚操作
ByPass
用BP
拦截下,后缀php
后加. .
即可绕过

Pass-011
描述
还是黑名单,会使用替换来替换掉不合法的后缀名
ByPass
使用双写来绕过

Pass-012
描述
白名单,用%00
截断可绕过,注意路径可自定义
ByPass

Pass-013
描述
同上,只不过这次不同的是save_path在post包里面(不在路径里面),GET是可以把url自动转码的,但是POST方式不会自动将%00编码为空字符
ByPass
burp中选中%00右击-> convert selection ->url->urldecode 即可。
Pass-014
描述
上传图片木马,不考虑运行,代码显示只校验文件头
ByPass
使用copy a.jpg/b + a.txt c.jpg
生成图片木马,直接上传bypass
Pass-015
描述
使用getimagesize
判断真假图片
ByPass
用图片木马一样可以绕过
Pass-016
描述
使用exif_imagetype()
检查是否为图片文件
ByPass
用图片木马一样可以绕过
Pass-017
描述
重新渲染图片
ByPass
靶场有bug,上传正常图片也会挂掉…
Pass-018
描述
条件竞争,需要代码审计发现
ByPass
执行路径:上传文件刀server -> 检测文件 -> 不符合的话删除/符合的话重命名文件
问题发生在删除前,可通过条件竞争在删除前getShell
具体做法是上传文件后不断访问上传了(还没被删除)的文件路径,这样竞争成功(访问成功)后就能执行里面的代码。简单理解就是在文件被删除前尽快读取,读取成功后即可执行命令,然后这个文件就会被删除。打的就是时间差~(靠程序开多线程去打)
Pass-019
描述
条件竞争,需要代码审计
ByPass
跟18一样的存在条件竞争,短时大量上传图片图片马数据包,程序会来不及rename,图片马会在很短时间内路径不会被变更,可以打时间差来getShell
Pass-020
描述
两种解法,都是利用move_uploaded_file
函数
ByPass1 - %00截断
可以自定义文件名,但是直接定义为php是不行的。使用%00
截断改变save_name
参数即可
ByPass2 - 利用函数解析错误
将webshell.php
改成webshell.php/.
即bypass
Pass-021
描述
需要代码审计
ByPass
利用/.绕过