1.client check
第一步:上传正常文件
上传本地正常图片文件
这里提示上传成功,并且访问链接成功获取图片
第二步:上传木马脚本
选择上传wen.php,该文件中包含一句话木马
这里出现弹窗,说明是前端校验,不能上传php
以防万一,我们抓包一下,看看有没有经过后端,这里上传后,页面弹窗,但是未拦截到数据包
说明的确只是前端校验
第三步:尝试前端修改属性
F12调试页面,鼠标放在 选择文件 上,发现下方元素处有响应前端代码
并在input标签中发现有一个属性 οnchange="checkFileExt(this.value)"
猜测该属性就是校验上传的文件的属性
这里直接将这个属性删除
再次尝试上传木马文件,依旧是有弹窗
第四步:抓包修改参数
再次分析上传文件流程,发现,正常文件,选择后可以回到正常界面,并在选择文件按钮后显示文件名字,但是上传木马文件的时候,没有返回正常界面,而是直接弹窗。而且修改前端参数没有用。
所以这次尝试上传正常文件,然后抓包修改参数
1.传正常文件并抓包
上传png格式图片文件,开启拦截,抓包成功,并右键发送至重放器中
2.修改参数
尝试将文件后缀改成php并在图片文件内容下方插入一句话木马,点击发送
使用蚁剑去连接,输入密码cmd,测试成功连接
2.MIME type
基础知识
MIME Type(全称 Multipurpose Internet Mail Extensions Type),中文叫多用途互联网邮件扩展类型,日常就叫资源类型 / 文件类型标识。
简单说:就是给文件、网络资源打一个标准格式标签,告诉浏览器 / 服务器 / 程序:这是什么类型的数据,该怎么打开、怎么解析。
text/plain:纯文本text/html:网页 HTMLapplication/json:JSON 接口数据image/png/image/jpeg:png、jpg 图片application/pdf:PDF 文档video/mp4:mp4 视频
- 浏览器收到接口返回数据,靠 MIME Type 分辨是网页、图片、JSON 还是下载文件
- 后端接口设置响应头
Content-Type就是指定 MIME Type - 上传文件、校验文件类型,后台经常判断 MIME Type 防伪装
MIME Type 就是互联网通用的文件 / 数据格式身份证。
第一步:上传正常文件
上传本地正常图片文件
这里提示上传成功,并且访问链接成功获取图片
第二步:上传木马脚本
选择上传wen.php,该文件中包含一句话木马
这里未出现弹窗,能正常返回页面,接下来点击开始上传
提示图片只能是这三个格式的,应该是白名单过滤
这里上传随意后缀的文件,发现这里提示还是只能是这三种
说明这里不是只禁止php后缀的文件
第三步:抓包修改参数
1.传脚本文件并抓包
上传php文件,开启拦截,抓包成功,并右键发送至重放器中
2.修改参数
修改内容类型为image/png,点击发送
使用蚁剑连接,密码为wen,测试成功连接
3.getimagesize
第一步:上传正常文件
上传本地正常图片文件
这里提示上传成功,并且访问链接成功获取图片
第二步:上传木马脚本
提示文件只能是这三个格式的,应该是白名单过滤
第三步:抓包修改参数
1.传脚本文件并抓包
上传php文件,开启拦截,抓包成功,并右键发送至重放器中
2.修改参数
修改内容类型为image/png,点击发送
这里发现,提示仍然是没有上传成功
这里尝试,修改为png后缀格式的文件,发现这里提示,上传的是假图片
第四步:使用图片码
getimagesize()知识普及
getimagesize()不看文件后缀,也不看 Content-Type
它只看文件内部的真实数据(文件头 / 魔数)。
比判断后缀和 Content-Type 安全 100 倍。
它做这 3 件事:
- 打开文件,读取文件开头几个字节
- 对比图片格式的固定魔数(比如 PNG 开头固定是
89 50 4E 47) - 解析宽高、格式,返回数组;不是图片就返回
false
它完全无视:
- 文件名:
a.php/a.jpg/a.png→不看 - 请求头
Content-Type: image/png→完全不看 - 文件后缀 →不看
图片码知识普及
图片马 = 伪装成图片的一句话木马外表是图片
里面藏 PHP/ASP/JSP 后门代码,专门用来绕过文件上传检测。
1.手动制造图片码
在木马文件的内容上面加上GIF89a,检测的时候就会检测出来是图片文件
GIF 图片的固定文件头,合法 GIF 文件前 5 个字节就是:GIF89a
这是行业标准,所有 GIF 图片都以这串开头。
2.cmd命令制造图片码
在相应文件夹下,在路径框中输入cmd,输入如下图命令
上传时需要将png后缀改回来成php,不然无法解析木马
但是改回来后,他又无法上传
这里采用文件包含漏洞的方式进行利用
第五步:利用文件包含漏洞
这里我们可以使用第一题中上传的木马,使用蚁剑连接后,直接查看路径
也可以通过第一题获得phpinfo文件:上传文件后,在木马路径下,输入cmd=phpinfo();,会进行将代码传入后台执行,获得phpinfo文件
这里采用第二种方式
成功找到文件路径,并利用文件包含漏洞,成功触发该脚本
这里使用蚁剑连接,输入密码cmd,成功连接