免责声明
本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。
作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责任。包括但不限于因使用本文所述技术而可能导致的法律诉讼、财产损失、隐私泄露或其他任何形式的责任。
在进行任何渗透测试或安全研究之前,请确保您已获得所有必要的授权,并遵守适用的法律和道德准则。未经授权的安全测试可能违反法律,并可能导致严重的法律后果。
本文中的内容仅供参考,不应被视为专业建议。在进行任何安全相关活动之前,建议咨询具有相应资质的专业人士。
作者保留对本博客文章的所有权利,并有权在未经通知的情况下进行修改或删除。
正文部分
前期准备:
目标:学习文件上传漏洞并利用
系统环境:
攻击机:Windows 10
靶机:192.168.162.100:8085(Ubuntu)
工具:
Google浏览器、BurpSuite
01-前端 JS 过滤绕过
这一关还是比较好绕过的,如果上传白名单以外的文件类型,就会有一个提示弹窗出现。如果没有题目的提示,那么可以猜测上传文件时的验证在前端。F12 打开开发者工具看看上传按钮那块有没有调用什么函数

那么找一下这个函数

验证果然是在前端,那么直接禁用浏览器端的 JavaScript,不同浏览器禁用方式不同,自行学习

上传成功,去靶机中看看

靶机的时间对不上,没什么大碍,访问一下 phpinfo.php 页面

02-文件名过滤绕过
这一关还是给了弹窗,看了一下网页源代码,发现只针对 PHP 类型做了防护,不过可以当作 php 进行解析的文件后缀不止 .php 一个,还有 phtml、php3、php4、Php、phP、PHP...题目让上传 PHP 文件,那么就在 txt 中编辑一段 PHP 代码,点击上传,使用 bp 抓包,在数据包中修改文件后缀


放包上传成功,看一下上传目录

访问一下这个文件看看效果

嗯,效果不错
03-Content-Type 过滤绕过
这一关需要绕过文件类型,也就是说,上传一个 PHP 文件,在数据包中修改文件类型,使其变为服务器所能接收的文件类型。先上传一个 PHP 文件,看看会给出什么提示

只让上传图像类型文件,那么在数据包中修改一下文件的 MIME,修改为 image/xxx(xxx=["jpeg","gif","tiff","png","......"])

根据白名单中的文件类型进行修改

放包后可以看到文件上传成功,完成了绕过

访问一下文件确保上传成功

04-文件头过滤绕过
这一关看起来需要使用图片马进行绕过了,不过如果没有配置文件的辅助,图片马也没有办法当作PHP 进行解析。不过先试试看

上传成功了,访问一下看看有没有解析,好吧,失败+1

题目说的时文件头过滤绕过,猜测是检查文件中的头部信息是否为图片文件的头部信息,那么考虑在数据包中修改图片后缀为 PHP,不仅上传了 PHP 文件,而且 PHP 文件中的头部信息也是图片格式的,试试看......好吧,失败+1。

后面经过测试,不知道怎么回事,直接上传 PHP 文件却直接上传成功了,可能是后端只检测文件头部信息是否为图片格式。

后面发现了比较奇怪的地方

文件的 MIME 也不是图片类型的,居然上传成功了,离谱......不过好在文件解析成功

05-.htaccess 文件上传
这一关需要用到 .htaccess 文件,那么这一关就可以用图片马了,至于什么是 .htaccess 文件,这里不做详述,反正里面写的是一些服务配置。先创建一个 .htaccess 文件,里面写上一些配置信息

这里配置的意思是当前目录下的所有 jpg、png、jpeg文件都作为 PHP 文件执行。接下来就上传 .htaccess 配置文件和图片马
上传 .htaccess

上传图片马

图片马的路径也是在 up 目录下,使用蚁剑连接,确保木马上传成功

06-文件截断上传
文件截断上传是一种利用文件上传过程中的漏洞,通过截断文件的方式来绕过安全检查,从而上传恶意文件的技术。这种技术通常涉及到在文件名或文件内容中插入特殊的字符序列(如%00),以欺骗服务器允许上传不符合规定的文件。
那么,文件名可以起一个 xxx.php%00,然后上传一个 PHP 文件,在数据包中把文件后缀改为 .jpg 达到白名单绕过的效果。

这里的提交方式为 POST,所以这里需要手动对 %00 进行解码。选中 %00,右键,然后选中 URL-decode

最后变为这个样子,19 行那块有一坨空白,按住左键选中一下就可以看到

放包看看效果

上传成功!虽然文件名后面还有一堆其他的字符,不过有 %00 的截取,后面的内容没什么用,直接访问 phpinfo.php 即可。如果上传的一直是同一个文件,没有改文件名的话,访问前需要删掉之前上传的那些文件,确保这一关访问的是刚才上传的文件,不然会访问到另一个文件

07-竞争条件文件上传
这一关就比较有意思了,只要上传了非白名单内的文件就被直接删掉

看看源码

先保存文件,后检测,那么程序的运行时需要时间的。那就可以不断地上传这个文件,趁着还没有被删除,抓紧时间访问文件。
首先上传一个 php 文件,使用 bp 抓包,发给 Intruder 模块,到 Payloads 模块,修改下面两个选项

这一关没有用到 payload,并且无时间限制的持续进行攻击。也就是说,不断地向服务器发出同一请求,趁着服务器还没有反应过来(文件保存的路径网页上已经显示出来了),换个浏览器抓紧时间访问上传的文件,没访问到就刷新网页,总有访问到的时候。
为啥要换浏览器,因为上传文件的浏览器被抓着包。不过发到 Intruder 后也可以关闭拦截,用当前浏览器访问上传的文件也可以,我这里图个方便就换了个浏览器,看个人喜好吧

那么,是不是可以考虑上传一个子母马,在母马没有被杀的时候,访问母马,从而生成子马。废话不多说,先写一个子母马

接下来就该上传了,操作步骤和上面一样

功夫不负有心人,让我访问到了。那么接下来访问一下子马

没什么问题,那么就召唤蚁剑连接一下
