一、文件上传原理
文件上传是一个 WEB 站点的功能,但是因为开发人员的疏忽或者对文件上传检测不严格,造成 任意文件 都能 上传 。这时候才有了漏洞产生
二、成因
文件上传是一个 WEB 站点的功能,但是因为开发人员的疏忽或者对文件上传检测不严格,造成 任意文件 都能 上传 。这时候才有了漏洞产生
三、危害
1. 可以拿 webshell ,获取服务器最高权限2. 上传钓鱼或者木马3. 上传一些动态脚本 --
四、利用条件
1. 文件能够被上传到服务器里面2. 文件能够被后端服务器来解析 ( 执行 ) 。例如 : 咱们生成了一个 EXE 的文件,但是服务器是Linux 系统,那么服务器能够解析 EXE 吗3. 保证上传的文件能够被自己访问到
五、文件上传的流程
● 准备一个代码恶意程序的文件● 服务器接收这个文件● 网站都会做文件合法性检查,例如:上传头像功能,但是我们上传了一个jsp 的程序,上传的文件会做文件后缀名检测● 移动这个文件到服务器指定的存放路径, 大多数网站在接受了文件以后,都会将文件存储到指定的目录下面
六、如何利用漏洞
● 判断我们上传的文件是不是到了网站服务器里面● 网站会检测 文件是否符合网站的需求● 前端检测( 浏览器通过 JS 脚本来进行文件检测 )● 后端检测( 程序来检验文件 )● 判断文件是否能够被解析
1. 最简单的一句话木马
<?php eval($_POST['6']);?> <?php eval($_REQUEST['6']);?> 不能使用GET
2. 业务场景
注册/修改个人信息页面 ---- 上传头像填写资料 --- 上传一些自己的文件
3. 测试漏洞方式
黑盒测试----在站点进行疯狂的文件上传测试看看哪一种可以用白盒(灰盒) --- 能够看到网站源码,边修改源码边动态执行
七、网站如何防护
● 客户端检测(
前端检测
)
,依赖于
JS
● 服务端检测
● 黑名单:不允许某些类型的文件上传
● 白名单:只允许某些类型文件上传
网站通常使用的方式是后缀名检测文件类型
八、常见的文件类型
图片 :jpg png img gif音频 :war mp3视频 :mp4文档 : docx xlsx pptx txt pdf .php .py .c .exe注意 :win 系统对文件名大小写不敏感,但是不能使用空格等特殊字符
九、上传文件绕过类型
前端验证
修改验证的扩展名
后端验证
后端程序使用 $_FILES() 函数 [type] 获取文件类型,来验证文件是否符合要求
绕过方式
通过抓包的方式抓取请求包,将文件类型进行更改为图片类型
黑名单
修改文件后缀名绕过
通过黑名单限制指定后缀名的文件不能上传
● 使用.htaccess文件绕过
文件的作用:在文件中添加一个后缀名,那么站点当中的指定后缀名的文件会作为 PHP 程序来执行 文件中的内容 :AddType application/x-httpd-php .png (可以修改)
从源码状态分析,黑名单加强了, $deny_ext = array('.asp','.aspx','.php','.jsp'); 变 多了防御思路:添加更多的文件后缀名来做放绕过绕过思路 : 使用 .htaccess 文件来绕过先上传一个 .htaccess 文件 可以执行 jpg 格式的文件再上传一个 .jpg 的 php 木马文件
● .user.ini文件绕过
将指定的文件作为 php 程序来执行作用与 .htaccess 文件功能类似,区别是 .htaccess 文件是 apache 的特有文件, .user.ini 是nginx 的特有文件。文件利用条件 1 、开启 cgi 或者 fast-cgi 2 、上传路径下面存在一个 index.php 的文件,可以包含解析 .user.ini 文件
使用.user.ini php配置文件
php.ini需要将注释删除user_ini.filename = ".user.ini"
● 大小写绕过
● 空格绕过
● 后缀名空格点绕过
● 文件流绕过
● 双写点空格
● 后缀名双写
● 00截断绕过
00-- 截断 ,概念来自于电报,例如报文 --- 摩斯密码没发送一封电报,在电报的最后会加上 00 ( 电报结束 )在 PHP5.3 版本之后有一个函数 ---move_upload_file( 文件 , 路径 ) ,这是一个移动文件的函数,这个函数可以接收 00 截断,但是需要打开 gpc 魔术引号程序中必须有 move_upload_file 来移动文件才能触发 00 截断功能
防御思路
定义白名单,获取文件后缀名判断是否符合白名单条件,并且生成一个随机的文件名
● 图片马
使用一张图片,将图片中的内容改为 webshell 代码或者一句话木马,上传到服务器当中,必要条件 -> 服务器能够将图片作为 PHP 来执行。
准备一张图片,准备一个一句话木马的代码
注意:尽量更改图片中的.的位置,因.改完后基本不会影响图片的质量
● 二次渲染
某些图片上传功能,会将图片做二次处理,处理完成后,图片外观不变但是图片内容变了
通过源码可以分析出,上传一个图片格式的文件,程序会做二次渲染,然后将二次渲染后的图
片显示在浏览器或者文件里面。
二次渲染作用
针对上传图片马的情况,给图片马做了二次渲染后,造成原本图片中的木马程序损坏。
绕过思路
上传一个图片,二次渲染后,将图片下载回来。在下载后的图片上改木马。渲染过的图片基本上不会做二次渲染
条件竞争
两个条件判断之间 程序执行的时间差,实现上传木马的过程
文件上传的步骤
● 先检测 后上传● 先上传 后检测
条件竞争的流程
● 准备一个php
文件
<?phpfile_put_contents('333.php','< ̿ eval($_REQUEST[6]);?>'); ˾ 将字符串中的内容,生成到一个文件当中,如果文件不存在则直接生成新的文件?>
● 上传文件并抓包,将抓到的数据包发送给跑包模块
● 抓取一个访问上传的php文件的数据包,然后构造跑包