文件上传:

常见安全问题:

  • 1、上传脚本文件,服务器web容器解释并执行了脚本,导致代码执行
  • 2、上传病毒、木马文件、引诱用户或管理员下载执行
  • 3、上传钓鱼图片、或者包含了脚本的文件,在某些版本的浏览器中作为脚本执行,或者钓鱼欺诈

客户端检测+绕过:

前端验证文件后缀:shell.php.png
但是可以直接修改前端验证代码(png改成php),或者抓包修改文件后缀->shell.php.png->shell.pnp

后端验证:

1、白名单校对——%00截断:
在C或者PHP语言中0x00被认为是终止符。后缀名可以修改为xxx.php%00.jpg,绕过文件类型验证判断
但在服务器中是xxx.php 因为jpg没有被执行解释。[\0]16进制
原理:URL中%00转换为ASCII字符是0,而ASCII中的0作为特殊字符保留,表示字符串结束。

2、Content-Type:判断类型,也可以抓包直接修改为image/png

3、MIME Sniff功能:读取文件前256个字节判断文件类型

4、黑名单:

  • 4.1 可以文件后缀替换
    asp 可以用 asa 、 cer

  • 4.2 过滤了大部分后缀,无法上传可以找有没有过滤htaccess文件(apache 的配置文件,在网站的根目录下)

http.conf文件(前提条件)
在此文件中设置 AllowOverried All ,才能使用.htaccess文件

如果在一个黑名单中添加了很多后缀名,唯独没有对htaccess过滤,可以直接上传.htaccess来设置使用php解析任意文件。

1
2
3
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

任意文件都可以被PHP执行

可以直接上传一句话木马
保存为 stack.jpg 文件

<?php eval($_POST['a']); ?>

  • 4.3 空格绕过黑名单

抓包后修改后缀,加一个空格 test.ph p

  • 4.4 大小写绕过

Apache文件解析问题(存在于Apache1.x Apache2.x中)

apache 是从后面向前解析文件名的。可以通过mime.types查看Apache认识什么类型的文件。
xxx.php.jar.jar 从后往前解析,如果jar 不能解析,再往左,直到解析到php 后缀,此文件就作为PHP文件执行了

IIS文件解析漏洞:

IIS5.x/6.0在处理含有特殊符号的文件路径时会出现逻辑漏洞,从而造成文件解析漏洞
/test.asp/shell.jpg 会新建一个文件夹,该文件夹中所有文件都被当做asp执行
shell.asp;.jpg 类似%00截断,解析后为shell.asp 执行

Nginx 文件解析

上传图片马后,在访问图片路径后加/x.php,找不到x.php文件时,会向上继续寻找,我们构造的图片马,导致代码执行。
条件是配置文件中 CGI默认开启 影响版本IIS7.0/7.5

如果CGI关闭,还存在截断解析,上传图片马访问时/shell.jpg%00.php 解析为PHP文件

另一种利用可以在图片中写入生成shell文件的代码
‘);?>
访问test.jpg/.php会在该目录生成一句话木马

文件上传

防御措施:

1、文件上传后的目录设置为不可执行的文件,可以放在独立的存储器上,作为静态文件处理
2、使用随机数改写文件名和文件路径,不对外展示存储路径和文件名
3、图片二次渲染,使用压缩函数处理图片
4、黑白名单

实战利用:

1、查看前端是否有验证
有验证直接修改
没有验证直接抓包

2、抓到包修改Content-Disposition filename = ‘xxx.php’
Content-Type: image/png

内容:xxxxxxxxxxxxxx(可插入后门代码)

如果直接上传成功,则直接利用

3、有内容字符过滤

  • 转换后门代码格式

  • 图片中内容字符中可以插入后门代码

  • 图片有二次渲染则保存二次渲染的图片

    • 在二次渲染的图片中插入后门代码
  • 突破 . 过滤

    • 利用远程ip转换地址调用执行
      .user.ini 文件 auto_prepend_file=xxx.png
      xxx.png
      远程地址文件中添加后门,可以远程调用

调用:
post:x=执行文件

面试:

文件上传利用Windows特性绕过?

1、Windows大小写不敏感,可以利用后缀大小写绕过

2、修改后缀绕过,Windows特性文件命名不允许 .或 空格 会自动去掉,利用这个特性绕过

黑名单过滤了大部分后缀,没有过滤加点后的后缀shell.php.
抓包改后缀加一个. 或者 _(下划线为空格),上传绕过
抓包修改后缀名
Windows不允许这种命名,所以会自动去掉空格和点

大小写绕过-window特性对大小写不敏感
截断绕过
同义后缀替换绕过
中间件文件后缀解析绕过
IIS/5/6/7
Nginx
Apache
Windows特性绕过

  • 大小写不敏感
  • 特殊符号解析时过滤

上传图片如何解析?
有一个shell,如何利用xss实现长久控制?