Pass-11
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
感觉上源代码和之前少了很多。关键在trim函数身上,它是将指定的字符串移除。这里就可以用双写的方式绕过。
访问上传的文件
接下来就可以蚁剑或者菜刀连接搞事情。
Pass-12
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
还是分析一下源码,发现这里出现白名单过滤。关键在于这条语句
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
对上传的文件名进行重构,可以使用%00截断绕过,但是这个方法对phpstudy有两个要求,一个是版本必须小于5.3.4,另一个是修改php的配置文件php-ini,将magic_quotes_gpc设置为Off。
我的版本是5.4,尝试过修改但是一旦修改靶场就访问不了了。但是在网上找了到一个大佬的文章,是关于这个关卡的。
https://blog.csdn.net/weixin_43571641/article/details/83832578
Pass-13
这道题关键点同样在这里。
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
和上一关的不同就是变成了POST方式,看了下wp,还是需要版本在5.3.4以下,😒,糟心。记录下思路吧,以后回来弄。
抓包,修改信息。
然后点Hex,找到php+的对应位置,修改为00。
Pass-14
直接给出了思路,图片马和文件包含都要用到。而且文件包含漏洞是可以点击跳转的。
制作图片马然后上传。
然后在文件包含漏洞页面访问上传的文件。
蚁剑连接。
Pass-15
Pass-16
这两关卡原理和14关相同,如果有兴趣可以尝试.png和.gif的方式。
Pass-17
说起来有点汗颜,最开始我以为同样和前三关一样的方法,但是后来看别人的解题记录时候才知道,并不是,看来还是有点毛躁了,学艺不精啊。
关键点在这句语法里面。
rename($upload_file, $img_path);
结合整体源码意思就是先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件。
这里通过条件竞争的方式在删除文件之前达到目的。
Burp抓包发送到intruder模块,然后设置payload为Null payloads,然后设置线程,开启爆破,同时访问上传文件,同样抓包发送intruder,操作一样,同时爆破。就可能会成功。
说起来简单,但是对我这种菜鸟,试了好几次也没成功,😒,学艺不精啊 。导致下一关也难受了,和这关一样的方法。
Pass-19
这一关好像被修改了,别人的十九关是这样子的。
emmmmmmm,菜鸟本菜了,留存,以后再做。
Pass-20
此题采用一个大佬的思路。
分析源码,上传save_name为一个数组,数组第一个元素为*.php,第二个元素为空,第三个元素为jpg。此时利用jpg通过判断,将空拼接到.php后文件仍为.php。
上传成功。
Pass-21
和上一关有共同之处。
$file_name = reset($file) . '.' . $file[count($file) - 1];
可以发现$ file_name经过reset($ file) . ‘.’ . $ file[count($file) – 1];处理。
至此,二十一关都写完了,但是对于我这种菜鸟来说其中有很多地方还是模棱两可,而这个博客只是我个人总结用,所以出现的方法并不十分保证能成功。
以后的时间,我还会经常练习这个上传关卡,弥补自己的不足之处,尝试不同的解法。
诸君共勉。