张小白的渗透之路(五)——上传漏洞及解析漏洞详解

article/2025/10/1 0:11:37

前言

web应用程序通常会有文件上传的功能,例如在BBS发布图片、在个人网站发布压缩包,只要web应用程序允许上传文件,就有可能存在文件上传漏洞。
上传漏洞与sql注射相比,风险更大,如果web应用程序存在上传漏洞,攻击者甚至可以直接上传一个webshell到服务器上。
那么如何确认web应用程序是否存在上传漏洞呢?比如,我的CSDN博客,由php编写,允许上传头像,但是文件上传时并没有对图片格式做验证,导致用户可以上传任意文件,那么这就是一个上传漏洞。

解析漏洞

攻击者在利用上传漏洞时,通常会与web容器的解析漏洞配合在一起。所以我们首先来了解一下解析漏洞,这样才能更深入地了解上传漏洞,并加以防范。
常见的web容器有IIS、Ngnix、Apache、Tomcat等,下面以Apache容器为例讲解。(IIS6.0也是解析漏洞比较经典的一个容器实例,大家可以自行学习,小白比较喜欢敲命令,不喜欢点来点去找,就没咋研究……)
Apache解析漏洞
在Apache 1.x 和Apache 2.x中存在解析漏洞,但他们与IIS解析漏洞不同。比如,一下就是典型的Apache解析漏洞。(别盯了,看url……)
解析漏洞
可以看到,上图的url中的文件名为1.php.rar,正常情况下,应该会弹出一个文件下载的提示框,但此时却没有,而是显示了phpinfo()的内容,这就是Apache的解析漏洞。1.php.rar的内容如下:

<?phpphpinfo();
?>

Apache在解析文件时有一个原则:当碰上不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。比如:

1.php.rar.xs.aa

Apache首先会解析aa扩展名,如果不认识,将会解析xs扩展名,这样一直遍历到认识的扩展名为止,然后再将其进行解析。
ps:Apache支持的扩展名可以在Apache的安装目录“/conf/mime.types”文件中有详细的扩展名列表,如下图所示。
文件类型
有些程序开发人员在上传文件的设计时,要判断文件名是否是php、asp、aspx、asa、cer等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到webshell。

解析漏洞之PHP CGI解析漏洞
Nginx是一款高性能的web服务器,通常用来作为php的解析容器,Nginx也曾经被曝光过两个“解析漏洞”,比如访问

http://www.litbai.com/1.jpg/1.php

此时的1.php是不存在的,却可以看到1.jpg已经按照php脚本来解析了,问题就出现在这个“1.php”上。这就意味着攻击者可以上传合法的“图片”(图片木马),然后在URL后面加上“/xxx.php”,就可以获得网站的Webshell。
在2008年5月,国内著名的安全团队80SEC发现了此漏洞,,漏洞描述网址为: http://www.80sec.com/nginx-securit-securit.html
但是后来人们却发现,这不是Nginx特有的漏洞,在IIS7.0、IIS7.5、Lighttpd等Web容器中也经常会出现这样的解析漏洞。
后来人们慢慢发现,这种解析漏洞其实是PHP CGI的漏洞。在php的配置文件中有一个关键的选项:cgi.fi:x_pathinfo
这个选项在某些版本中默认是开启的,在开启时访问URL,比如:

http://www.litbai.com/x.txt/x.php

x.php是不存在的文件,所以php将会向前递归解析,于是造成了解析漏洞,可以说此漏洞与Nginx关系并不是很大,但由于Nginx与PHP配合很容易造成这种解析漏洞,所以PHP CGI漏洞经常被认为是Nginx解析漏洞。

绕过上传漏洞

程序员在开发web应用程序时,一般都会涉及文件上传,比如:上传文档并提供下载,上传图片增加客户体验。文件上传的基本流程相同,客户端使用Javascript验证,服务器端采用随机数来重命名文件,以防止文件重复。
程序员在防止上传漏洞时可以分为以下两种。

  • 客户端检测:客户端使用javascript检测,在文件未上传时,就对文件进行验证。
  • 服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,甚至有些程序员检测文件中是否嵌入恶意代码。
    在研究上传漏洞之前,首先来看两个小工具:中国菜刀和一句话图片木马。
    中国菜刀
    这款软件是用来管理网站文件的,非常小巧灵活,他仅仅需要一段简短的代码就可以方便地管理网站。中国菜刀现已经成为安全研究者手中必备地利器,其官网网站为:http://www,maicaidao.com
    该软件提供地服务器端文件仅有一行代码。目前支持地服务器端脚本包括:PHP、ASP、ASP.NET、JSP等,并且支持HTTPS安全连接地网站。常见的代码如下:
ASP:        
<%eval request("Cknife")%>ASP.NET:    
<%@ Page Language="Jscript"%><%eval(Request.Item["Cknife"],"unsafe");%>PHP:        
<?php @eval($_POST['Cknife']);?>

正因为代码短小精悍,所以被黑客称为一句话木马(一句话后门)
<?php @eval($_POST['Cknife']);?>保存为shell.php,上传至PHP主机空间中,配置菜刀进行连接。详情请参阅 https://blog.csdn.net/Litbai_zhang/article/details/82984795

一般对上传漏洞有两种方式:客户端检测和服务器端检测

客户端检测

很多程序员仅仅通过javascript来非法拒绝文件上传。这样验证对一些普通用户防止上传错误还可以,对专业的技术人员来说,这是非常低级的验证。攻击者可以通过非常多的方法来突破客户端验证。下面是一个非常简单的文件上传示例,使用javascript验证。
Upload.html页面使用javascript对文件扩展名验证,如果不是白名单中的扩展名,那么Form表单将不会提交至服务器,代码如下:

  <html><head><title>图片上传<title><script type="text/javascript">function checkFile() {var flag =false;                                  //是否可以上传的标志位var str =document.getElementById("file").value;   //获取文件名str = str.substring(str.lastIndexOf('.')+1);      //得到扩展名var arr = new Array('png','bmp','gif','jpg');    //允许上传的扩展名for(var i=0 ; i<arr.length;i++){if(str==arr[i]){flag = true;                         //循环判断文件名是否合法}}if(!flag){alert('文件不合法!!');}return flag;}</script></head><body><form action="upload.php" method="post" onsubmit="checkFile" enctype = "multipart/form-data"><input type="file"  name="file" id="file" /><br/><input type="submit" value="提交" name="submit"/></form></body>
</html>

Upload.php用来接受文件,在接收文件后,将文件重命名,然后放到本目录下,如下代码所示:

<?phpif(isset($_POST["submit"])){$name = $_FILES['file']['name'];                       //接收文件名$name = md5(data('Y-m-d h:m:s')).strrchr($name,".");   //文件重命名操作,保留原有扩展名$size = $_FILES['file']['size'];                       //接收文件大小$tmp = $_FILES['file']['tmp_name'];                    //临时路径move_uploaded_file($tmp,$name);                        //移动临时文件到当前文件目录echo "文件上传成功!path:".$name;}
?>

针对客户端验证有非常多的绕过方法(即前端绕过),小白比较喜欢(只会)用burpsuite来抓包实现“中间人攻击”(还有一种是通过调试工具例如Firebug(不过Firebug停更了就没去研究了)直接删除客户端的验证),burpsuit的实现原理是按照正常的流程通过javascript验证,然后在传输中的HTTP层做手脚。简单说一下实现思路,首先把木马文件扩展名改为一张正常图片的扩展名,比如JPG扩展名,在上传时使用Burpsuit拦截上传数据,再将其中的扩展名JPG修改为PHP,就可以绕过客户端验证。
这里需要注意一点:在HTTP协议中有请求头Content-Length,代表实体正文长度,如果此时的filename修改也就意味着实体正文长度增加或者减少了,这时就应该修改Content-Length请求头,如:Content-Length长度为200,把文件流中的filename="xxxxx.jpg"修改为filename=“1.php”。更改后,实体正文少了4个字符,所以需要把Content-Length长度修改为196.如果不修改上传可能会失败。
ps:
强调:任何客户端验证都是不安全的。客户端验证是防止用户输入错误,减少服务器的开销,而服务器端验证才可以真正防御攻击者。

服务器端检测

随着开发人员安全意识的提高,用前端验证攻击行为越来越少,一般放在服务器端做验证。而服务器端验证分为很多种,因为每个程序员的思路不一样,所以过滤的方式也不一样。但主要包含以下几点:白名单与黑名单扩展名过滤、文件类型检测、文件重命名等操作。这样看起来似乎无懈可击,但不要忘记一点,那就是解析漏洞。如果开发人员不考虑解析问题,上传漏洞配合解析漏洞,可以绕过大多数上传验证。
1.白名单与黑名单验证
在上传文件时,大多数程序员会对文件扩展名检测,验证文件扩展名通常有两种方式:白名单与黑名单。(那么简单的两个词就不解释啥意思了)

  1. 假设设置了黑名单,攻击者可以从黑名单中找到web开发人员忽略的扩展名,如:cer
  2. 在windows系统下,如果文件名以".“或者空格作为结尾,系统会自动去除”."与空格,利用此特性也可以绕过黑名单验证。例如上传“asp.”或者“asp_”(该处下划线为空格)扩展名程序,服务器端接收文件后接收文件名后在写文件操作,windows将会自动去除小数点和空格。
    上述例子不难看出,仅靠黑名单过滤是无法防御上传漏洞的,因为未知的风险太多,我们无法预测。
    3.然而白名单拥有比黑名单更好的防御机制。如:$WhiteList=array('rar','jpg','png','gif','mp4','doc');在获取到文件扩展名后对$WhiteList数组里的扩展名迭代判断,如果文件扩展名被命中,程序将认为文件是合法的,否则不允许上传。
    虽然采用白名单的过滤方式可以防御未知风险,但是不能完全依赖白名单,因为白名单并不能完全防御上传漏洞,例如IIS6.0,攻击者把木马文件名改为pentest.asp;1.jpg上传,此时文件为jpg格式,从而可以顺利通过认证,而IIS却会把pentest.asp;1.jpg当作ASP脚本程序来执行,最终攻击者可以绕过白名单的检测,并且执行木马程序。
    所以,白名单机制仅仅是防御上传漏洞的第一步。

2.MIME验证
MIME类型用来设定某种扩展名文件的打开方式,当具有扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开。如GIF图片MIME为image/gif,CSS文件的MIME类型为text/css。
通过抓包我们可以看到MIME类型一般在Content-Type这一属性中可以看到。

当上传一个php文档(MIME值为application/php)时,假设我们的服务器只允许image/jpeg类型的通过,那么直接上传肯定会失败,我们通过burpsuit将HTTP请求中的Content-Type更改为image/jpeg类型,这样即可通过程序验证。
3.目录验证
在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些web开发人员为了让代码更“健壮”,通常会做一个操作,如果指定的目录存在,就将文件写入目录中,不存在则先建立目录,然后写入。

文本编辑器上传漏洞

由于小白能力有限,文本编辑器种类又很多,例如CKEditor、Ewebeditor、UEditor、KindEditor、XHeditor等,暂时还没有一 一了解,简单的说一下,这类编辑器的功能是非常类似的,比如都有图片上传、视频上传、远程下载等功能,这类文本编辑器也成为富文本编辑器。使用此类编辑器减少了程序开发的时间,但是却增加了许多安全隐患,比如:使用CKEditor编辑器有10万个网站,如果CKEditor爆出一个Getshell漏洞,那么这10万个网站都因此受到牵连。


http://chatgpt.dhexx.cn/article/qRyksPBg.shtml

相关文章

Kali下常见webshell管理工具汇总

转 自 https://www.ohlinge.cn/kali/kali_webshell.html 0x01 前言 Kali Linux作为一款专为渗透测试而生的Linux操作系统&#xff0c;在安全界的影响广泛。一般的webshell在Windows下面经常使用Chopper(中国菜刀)来管理&#xff0c;那么在Linux下面&#xff0c;有没有类似的工…

菜刀渗透

快速搭建discuz论坛 使用kali下BurpSuite对discuz后台注入php木马 使用Cknife“菜刀”.上传webshell木马到网站 使用Webshell查看mysql数据库密码并盗取数据库 快速搭建discuz论坛 攻击思路 想要拿下一台主机A的权限&#xff1a; 1、了解一下这个服务器:端口,服务器版本…

无法直接打开jar文件,提示“你要以何种方式打开.jar文件”(已解决)

问题引入&#xff1a; 网络安全&CTF竞赛中有很多封装好的工具类似Cknife/CTFcrackTools.jar/Stegsolve.jar需要java环境打开 问题描述&#xff1a; .jar文件只能通过dos命令打开&#xff0c;点击jar文件提示你要以何种方式打开.jar文件&#xff0c;并且选中jdk/bin/java…

开源渗透测试工具合集

子域名枚举工具 子域枚举和信息收集工具 Anubis 项目地址&#xff1a;https://github.com/jonluca/Anubis使用名为 Hacking with search engine 的技术列出有关主域的子域 N4xD0rk 项目地址&#xff1a;https://github.com/n4xh4ck5/N4xD0rk子域名爆破枚举工具 subDomainsBrut…

DVWA的upload文件上传漏洞(全难度)(小白向)

提示&#xff1a;只是为了方便理解&#xff0c;但不一定符合您的要求 文章目录 一、等级&#xff1a;low 二、等级&#xff1a;medium 三、等级&#xff1a;high 四&#xff1a;等级&#xff1a;impossible 前言 靶机ip&#xff1a;192.168.229.145 DVWA版本&#xff1a;v1.…

c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码

在现在满大街菜刀都存在后门问题的时候,Cknife横空出世了。因为开源&#xff0c;所以安全。因为可操作的空间挺大的&#xff0c;也十分适合过各种WAF。下面就是解决两个常见问题的过程。希望可以帮到各位白帽子。 但是使用过程中也遇到了一些小问题&#xff0c;被吐槽最多的就是…

致远OA_0day批量植Cknife马一步到位

最近各位师傅都在刷这个嘛&#xff0c;原本的exp是上传一个test123456.jsp的命令执行的马子&#xff0c;不过我在试的时候发现替换成C刀一句话出错,原因未知&#xff0c;并且test123456.jsp如果存在的话用原来exp是无法覆盖的。参考改进了t00ls师傅的代码(https://www.t00ls.ne…

linux 安全狗 乱码,打狗棒法之:Cknife(C刀)自定义模式秒过安全狗

免责声明&#xff1a;本站提供安全工具、程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;风险自负! 相关阅读&#xff1a; 0x00 前言 很多朋友在使用Cknife时都误以为她只是菜刀的跨平台升级版&#xff0c;仅仅多了跨平台的功能&#xff0c;其实小伙伴…

Cknife流量分析

本文首发&#xff1a;https://<img src1 οnerrοr\u006coc\u0061tionj\x61v\x61script:\x61lert\x281\x29>testdemo 0x01 环境 <?php eval($_REQUEST[shell] ?> 0x02 命令执行 执行命令结果如下图所示 POST的数据如下图所示 对POST的数据解码 #shell eval(base6…

渗透工具环境篇——Cknife中国菜刀的使用

提要 在学习上传漏洞的时候研究到了Cknife这个软件。下面来介绍一下菜刀的使用方法。 使用 1.下载菜刀&#xff0c;打开Cknife.jar软件 2.右键点击添加 3.输入上传的php文件&#xff0c;php文件密码&#xff0c;脚本类型选择PHP&#xff0c;字符编码GB2312&#xff0c;点…

关于cknife与burpsuite对java的版本需求的冲突机器解决办法

之前安装burpsuite时候使用的是jdk11,一直使用的没有问题&#xff0c;后来接触到了cknife,但在使用时却发现cknife需要jre1.7以上版本&#xff0c;但这有是burpsuit无法兼容的&#xff0c;翻来覆去整了半天&#xff0c;终于搞定了。。 1.先删除jdk-11 2.下载jdk-7u80,这里面是…

打狗棒法之:Cknife(C刀)自定义模式秒过安全狗(二)

免责声明&#xff1a;本站提供安全工具、程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;风险自负! 000 前言 亲爱的Chora小伙伴在上文说过&#xff0c;他是一个有责任心的基佬&#xff0c;要手把手为大家&#xff08;不&#xff09;负责任的讲解如何…

图像位运算、掩模

图像位运算、掩模 原图 添加的RGB图像 1. 选取原图中的感兴趣的区域&#xff0c;即ROI&#xff08;region of interest&#xff09; 2. 将要添加的RGB图像转换成灰度图像 img2gray cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)3. 将灰度图像进一步转成二值图像&#xff0c;即…

【图像锐化】非锐化掩模 USM(Unsharpen Mask)与锐化掩模 SM(Sharpen Mask)

非锐化掩模USM&#xff08;Unsharpen Mask&#xff09;与锐化掩模 SM&#xff08;Sharpen Mask&#xff09; 掩膜操作可以提高图像对比度&#xff0c;对比度提高可以增加图像感官度、锐化&#xff0c;让看起来有点模糊的图像更清晰。 原理&#xff1a;提取图像的高频分量&#…

2021年中国光掩模玻璃基板行业市场需求量分析:IC、FPD领域快速发展带动光掩模玻璃基板需求量不断增长[图]

一、概述 光刻掩膜版,简称掩膜版,是微纳加工技术常用的光刻工艺所使用的图形母版。由不透明的遮光薄膜在透明基板上形成掩膜图形结构,再通过曝光过程将图形信息转移到产品基片上。 光学掩模板是在薄膜、塑料或玻璃基体材料上制作各种功能图形并精确定位,以便用于光致抗蚀…

【OpenCV 】图像掩模

图像掩模&#xff08;image mask&#xff09;&#xff1a;用选定的图像、图形或物体&#xff0c;对待处理的图像&#xff08;局部或全部&#xff09;进行遮挡来控制图像处理的区域或处理过程。由于覆盖的特定图像或物体称为掩模或模板。 数字图像处理中&#xff0c;掩模为二维…

【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

OpenCV python 掩模处理学习笔记

OpenCV python 掩模处理 前言1.1 掩模是什么1.2 掩模的原理1.3 构造掩模图像总结 前言 接上篇OpenCV Python 直方图的使用。在opencv中使用掩模对图像进行处理是一个十分常用的方法。本篇是记录掩模操作的原理及使用。小白入门&#xff0c;如有不正确的地方希望大佬指正。 提示…

OpenCV基于Python图像掩模处理

图像掩模 目标1. 图像掩模的概念2. 图像掩模的作用3. 示例演示 目标 本篇文章主要介绍图像掩模的概念、作用、及其简单实现。 1. 图像掩模的概念 图像掩模&#xff08;image mask&#xff09;是用选定的图像、图形或物体&#xff0c;对待处理的图像&#xff08;局部或全部&a…

CodedStereo:大尺度景深双目视觉的相位掩模学习(CVPR2021)

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 来源丨泡泡机器人SLAM 作者丨泡泡机器人 标题&#xff1a;CodedStereo: Learned Phase Masks for LargeDepth-of-Field Stereo 作者:Shiyu Tan, Yicheng Wu, Shoou-I Yu&#xff0c; Ashok Veeraraghavan 机构…