免责声明
本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。
作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责任。包括但不限于因使用本文所述技术而可能导致的法律诉讼、财产损失、隐私泄露或其他任何形式的责任。
在进行任何渗透测试或安全研究之前,请确保您已获得所有必要的授权,并遵守适用的法律和道德准则。未经授权的安全测试可能违反法律,并可能导致严重的法律后果。
本文中的内容仅供参考,不应被视为专业建议。在进行任何安全相关活动之前,建议咨询具有相应资质的专业人士。
作者保留对本博客文章的所有权利,并有权在未经通知的情况下进行修改或删除。
正文部分
前期准备:
目标:学习文件上传漏洞的绕过
系统环境:
攻击机:Windows 10
靶机:192.168.162.22(Windows 10 ==> phpStudy 2018)
工具:
Google浏览器、BurpSuite、Behinder、蚁剑
Pass-11
从源码可以看出,这一关会过滤掉黑名单中的文件后缀,那么关键字嵌入一下是不是就过了?
放包
没问题,冰蝎连🐎
Pass-12
看源码,貌似是可以使用文件名截断的方法,前提是需要把 PHP 版本改一下
抓包改数据,在路径后面加上文件名,用 %00 截断
放包
虽然文件名后面还有一大堆东西,不过无伤大雅,只访问🐎文件名就行了,召唤冰蝎连🐎,连接之前先将 PHP 的版本调回 5.4.45
Pass-13
看源码,这关好像跟上一关差不多,先把 PHP 版本改一下,跟上一关一样,抓个包
文件名后面依旧是 %00,只不过这里需要手段解一下码,快捷键是 Ctrl + Shift + U,具体操作还是看我另一篇文章吧,这里不太想截图了 ==> iwebsec 靶场——06-文件截断上传
改回 PHP 版本,冰蝎连🐎
Pass-14
看源码,看情况是要写图片🐎,然后用文件包含漏洞执行🐎,包含文件点击链接了解
制作图片🐎方法就不说了,没什么难的。这一关就上传一个 jpg 格式的文件吧,召唤冰蝎连🐎
Pass-15
看源码,跟上一关一样,这关上传 png 格式的文件
Pass-16
看源码,还是一样的操作,这关上传 gif 格式的文件
可爱吧,哈哈哈哈哈哈
Pass-17
看源码,这关要对图片进行二次渲染,也就是说服务器把刚才上传的文件稍做了修改,那么我们就要在被服务器已经改改掉的图片中插入🐎,把服务器返回的图片保存下来进行对比,用工具改一下,将🐎写进去
将匹配的地方改成🐎,然后再次上传,这关换作蚁剑连接
Pass-18
先代码审计,发现这个逻辑问题还是有很大的问题。先接收上传的文件,然后判断保留还是删除
由于代码的执行需要时间,那么就利用代码执行的时间差访问上传的文件,使文件做一些事,比如创建一个🐎,思路整合完成,开始操作
首先,先写一个子母🐎
zmm.php 文件是要上传的文件,文件中的 shell.php 是要生成的文件,里面的内容就是后面那一段 php 代码。由于文件上传上去后存留的时间太短,根本来不及访问 zmm.php 文件,那么就需要不断地发,然后不断地访问 zmm.php 文件,使其执行生成🐎。这个时候就要用到 bp 协助上传和访问
上传一个文件做测试,看看文件会被上传到哪个目录中
接下来先提前开一个网页访问 zmm.php 文件,然后上传 zmm.php,用 bp 抓包,具体操作就到另一篇文章看 ==> iwesec 靶场——07-竞争条件文件上传
完事后召唤蚁剑连接🐎
Pass-19
这一关有两种方式,也都是前面操作过的
方法 1 => 上传图片🐎文件包含
将子母🐎插入到图片中,然后文件包含,生成子🐎
我这里的路径有点问题,不过无伤大雅
方法 2 => bp 无限访问文件包含
这个方法是用 bp 无限上传文件,趁着文件名还没有被换掉,然后包含到子母🐎生成子🐎
这个是上传子母🐎的数据包
这个是访问包含子母🐎的数据包
接下来就开始无限上传了
子🐎生成成功,用蚁剑连接一下
Pass-20
这一关思路就比较多了,毕竟上面都多了那么多关卡了
思路 1 => 文件截断上传
这一关要改一下 PHP 版本
将文件的保存名称后面截断,放包看看效果
恢复 PHP 版本,然后……有请冰蝎连🐎
思路 2 => 文件包含
上传一个图片🐎,然后文件包含解析 PHP,最后用蚁剑连🐎
思路 3 => 大小写绕过
冰蝎连接🐎
Pass-21
看源码,发现这关还是挺复杂的,不过有两行核心代码,搞定核心就相当于搞定了控制权
代码中使用 explode('.', strtolower($file)) 来获取文件后缀,但没有处理文件名中包含多个点的情况。例如,上传一个名为 file.php.jpg 的文件,后缀会被错误地识别为 jpg
reset($file) . '.' . $file[count($file) - 1] 这种方式重命名文件名并不安全,可能会导致文件名冲突或路径遍历漏洞
所以在数据包中修改内容
由于explode() 函数会将文件名按照点拆分为一个数组,那么在修改后数据包中,第一个数组元素就是文件名,第三个就是后缀,第二个就放空,也没限制后缀不能是空
放包
冰蝎连🐎
收工
17、18、19 关要生成子🐎,冰蝎🐎不知道怎么回事老报错,就用蚁剑连接了