文件上传攻击

文件上传攻击是攻击者利用Web应用对上传文件过滤不严的漏洞,攻击者将木马上传成功后即可获得当前的webshell。

1.攻击原理

假设目标web服务器为Apache+PHP的架构,攻击者通过上传功能上传 “木马”.PHP 到服务器,再访问 “木马”.PHP 所在的目录,由此 “木马”.PHP 会被当做PHP文件执行,进而木马生效。(需要注意网页用什么语言编写,就要用该语言的木马来上传)

2.文件上传流程

整个过程分为三大步骤:

  1. 客户端上传:用户提交上传表单,利用HTML格式实现上传格式的编制(**通过HTML格式中的**),再封装到HTTP包中,开始传输。
  2. 中间件上传:接受客户端提交的HTML表单;将表单内容存储为临时文件;根据安全规范,将临时文件保存为正式文件。
  3. 服务器存储及调用:服务器存储正式文件,并将其存放在中间件规定的真实路径。

3.上传攻击的条件

  1. 目标网站具有上传功能
  2. 上传的目标文件能被Web服务器解析执行
  3. 知道文件上传到服务器后的存放路径与文件名称
  4. 目标文件可以被用户访问

4.上传检测绕过技术

4.1.客户端JavaScript检测及绕过

4.1.1 JS防护

在网站中部署JS脚本,在用户访问时,脚本随同网页一起到达客户端浏览器,当用户进行文件上传时,JS脚本对用户表单提交的数据进行检查,如果发现非法后缀则直接终止上传。(一般在上传表单中,例如利用

中的onsubmit,onchange事件激活防护代码)

4.1.2 JS防护绕过方式

  1. 浏览器F12打开开发者工具后删除代码里激活防护代码的事件
  2. 直接更改JS脚本,加入木马的扩展名。
  3. 用户浏览器禁用JS功能,导致过滤功能失效

pikachu练习平台实例

1.客户端JS检测

image-20220315161852078

image-20220315161911659

直接删除onchange事件即可完成文件上传

4.2 服务器端MIME检测及绕过

4.2.1 MIME防护

MIME值就是HTTP协议中的Content-Type类型,其防护思路是客户端的浏览器根据上传的文件的后缀名自动生成Content-Type类型,服务器收到HTTP包后,会判断Content-Type是否合法,如果非法则阻断本次上传。

image-20220315164052339

4.2.2 MIME防护绕过方式

  • HTTP抓包后修改Content-Type类型进而绕过防护,实现木马的上传。

pikachu练习平台实例

image-20220315163840463

直接将Content-Type类型改为image/jpg 就可以完成绕过。

4.3 服务器端文件扩展名检测及绕过

4.3.1 防护思路

通过服务器对上传的文件扩展名进行检测来判断是否合法,防护手段有白名单(允许)过滤,黑名单(限制)过滤,文件后缀和文件名重命名

4.3.2 绕过方式

针对黑名单绕过方式:

  • 多重测试过滤文件名:可以尝试php4, php5、cer等后缀,此类后缀名不受黑名单限制,同时仍然按照php文件执行。
  • 判断是否存在大小写绕过:中间件会区分文件名的大小写,但是操作系统不会区分,所以可以修改大小写查看是否可以绕过。
  • windows下特殊文件名构造:构造shell.php.和shell.php_,由于windows不识别上述后缀机制会自动去掉 ._ ,从而绕过。

5.文件上传靶场

Pass-1

前端进行后缀名检测,尝试将一句话木马后缀改为file.jpg,抓包后将后缀名再修改为file.php。

image-20220610202058186

Pass-2

HTTP抓包后修改Content-Type类型进而绕过防护,实现木马的上传

image-20220610202647022

Pass-3

服务器检测文件后缀名

image-20220610203139857

image-20220610203931785

尝试修改后缀名来绕过检测,例如大小写绕过,