本文章提供的工具、教程、学习路线等均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如有侵权请联系小编处理。
环境准备:
1.靶场搭建
下载地址:GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
下载完成后将zip包复制进phpstudy的软件目录下/—>D:\phpstudy_pro\WWW 在进行解压
解压安装完成后在该文件夹内新建一个upload的空文件 用来后续靶场上传文件使用
2.一句话木马
# 1.php → 一句话木马
<?php @eval($_POST['cmd']); ?>
# 666.php → 测试所用的phpinfo
<?php phpinfo(); ?>
————————————————————分割线————————————————————
Pass-01
选择一个php文件,发现无法上传。然后抓包发现是抓不到 说明数据没有进入后端 说明是前端验证拦截
然后我们将一句话木马1.php文件改成1.jpg格式后缀的上传然后进行抓包
然后回显页面有这个图像就说明成功上传了 去upload文件下也能看到我们上传的木马文件
Pass-02
上传一个1.php 抓包发现限制了 上传类型 Content-Type: application/octet-stream
所以我们更改其验证类型为 image/jpeg、image/png、image/gif 其中任意一种就可以 成功上传
Pass-03
提示不让上传 所以我们改一下文件后缀名成功上传
某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml
Pass-04
这关提示中后缀名黑名单有很多 所以我们换一种方式:.htaccess文件上传
.htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
首先创建一个.htaccess文件(文件名就为.htaccess)内容如下
AddType application/x-httpd-php .png
通常用于配置 Apache Web 服务器。这条命令会让服务器将
.png
图片文件识别为 PHP 脚本,并尝试使用 PHP 引擎来执行这些文件。
Pass-05
查看源码,和第四关对比,发现这关没有转换大小写的代码
这样我们就可以上传大小写混合的后缀名来进行绕过。上传一个phpinfo.Php文件,直接上传成功。
Pass-06
老样子 看一下源码 发现 少了一行尾部去空
所以我们只需要抓包的时候在尾部加一个空格即可
Pass-07
通过源码发现,本关并未对结尾点进行检测。那么这里就可以通过在后缀加上点进行绕过,其实点绕过和空格绕过是一样的,都是利用操作系统的特性来进行解析绕过
Pass-08
过源码发现并未对::$DATA进行检测。可以在后面添加::$DATA进行绕过
在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
Pass-09
通过源码发现本关之前所有的绕过思路都被过滤了,但是通过源码发现,所有的过滤都是一次的,并未对其进行循环过滤。也就是说源码中提到的删除空格,删除点都是只删除一次,那么可以在数据包中将php后缀添加. .,形成.php. .,由于只验证一次,所以删除一个点和一个空格后就不在删除了。
Pass-10
过源码发现,若上传的文件后缀在禁止的列中,那么就将后缀替换为空,而这里又是只过滤一次,那么就可以通过双写进行绕过。在php中再写一个php
这样 即使删掉中间的php 外层php也会自动拼接成一个新的php
Pass-11
我们可以看到img_path是通过get传参传递的,那么我们不妨在这块将路径改掉,改为upload/web.php%00,那么后面不管是什么东西都会被截断掉,然后经过move_uploaded_file函数将临时文件重新复制给我们的截断之前的文件路径,当然,我们还是要上传jpg文件的,使得我们可以进行下面程序的运行
Pass-12
本关接受值从get变成了post,它两的区别就是get会自行解码,而post不会解码,所以需要对%00进行解码。所以在这一关我们就需要在web.php后面加一个占位符,将其16进制改为00,这样控制符就出现了,最后在上传文件的时候就会触发\00截断
在BS抓包中选中%00右键选择URL其次选择网址解码。
Pass-13
因为网站根目录下存在include.php 文件(文件包含漏洞) 没有的可以自行添加一下
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
然后我们制作一个图片马 进行上传
然后我们去链接一下我们的图片马 注意语法格式
http://192.168.3.222/upload-labs/include.php?file=upload//8520240728175046.gif
Pass-14
和13关一样直接上传图片马即可
Pass-15
和13关一样
Pass-16
这关存在imagecreatefromjpeg()函数将我们的图片打散进行二次渲染,这就会导致我们的一句话木马消失,所以我们就要想办法在他没有打散的对方将我们的一句话写进去 针对不同格式的图片马 有不同的对应方式
这里我找的现成的gif 中间存在一句话木马的地方不会被函数打散 所以就按照图片马 的思路去做
Pass-17
条件竞争
也就是说如果我们上传php文件,他会删除我们上传的木马。
这么看来如果我们还是上传一个图片马的话,网站依旧存在文件包含漏洞我们还是可以进行利用。但是如果没有文件包含漏洞的话,我们就只能上传一个php木马来解析运行了。
先上传再删除,在上传到删除之间这几十毫秒之内我们的文件还是在的,我们就可以访问我们上传的文件。这种就就叫条件竞争漏洞(时间竞争漏洞),这道题干好符合条件我们就利用时间竞争来做
其实就是文件套娃 我们上传文件A 让文件A被检测删除之前 去运行生成一个木马文件B 木马文件B成功生成后 文件A也被检测到然后删除 此时只留下我们要用的木马文件B了
文件A内容:
<?php file_put_contents('./web.php', '<?php phpinfo(); ?>'); ?>
这段代码的作用是创建或覆盖位于当前目录下的web.php
文件,并在其中写入了一个简单的 PHP 脚本,该脚本将输出 PHP 的配置信息
我们抓到包后 发送到攻击模块 清除所有payload
我们要不断重复的去上传文件 然后去访问 因为要在系统删掉之前去访问到我们的web.php 让文件在当前目录下生成我们要的木马文件
Pass-18
跟图片马一个步骤
Pass-19
上传文件时候可以选择上传文件名称 我们只需要 将上传文件名称后缀名加一个点即可成功访问 前提是靶场环境是Windows