强网拟态-web-easy-filter
代码
<?php ini_set("open_basedir","./"); if(!isset($_GET['action'])){ highlight_file(__FILE__); die(); } if($_GET['action'] == 'w'){ @mkdir("./files/"); $content = $_GET['c']; $file = bin2hex(random_bytes(5)); file_put_contents("./files/".$file,base64_encode($content)); echo "./files/".$file; }elseif($_GET['action'] == 'r'){ $r = $_GET['r']; $file = "./files/".$r; include("php://filter/resource=$file"); }
思路就是分为两部分,第一部分会base64写入你设定的内容,第二部分就是你输入文件名,并且用filter读取
同时这里不能任意文件读取,因为又basedir,因此思路是写入system语句,再include引入来包含想执行的语句
但是你只能输入文件名(或者目录),因此要想办法拼接出语句先对base64解码再包含
根据一番测试(没找到理论依据)
发现例如:
php://filter/resource=./files//convert.base64-decode/a/../=/../../56514a1d2f
发现只要过滤器字段含有convert.base64-decode即可,无论位置在哪,也不用read=
然后看目录:我们访问当前目录的files的子目录convert.base64-decode(虽然不存在,但是有这句话就会执行base64解码),然后去了不存在的子目录a,然后返回上一级,然后访问然后去了不存在的子目录等于号,然后返回上两级,访问56514a1d2f
当然根本不用这么麻烦,我这里演示一下就是resource后面的路径不会检测是否合法,同时里面有各种解析语句也会被执行。
简洁的payload: ?action=r&r=/convert.base64-decode/../56514a1d2f(md5)