pass6
所有后缀都被列入黑名单
较之前发现没有trim函数,也就是没有对空格进行过滤
使用burp抓包进行名称的修改,更改为webshell.php .
发送到repeater,点击go,得到文件名称
pass7
所有后缀都被列入黑名单,但没有 $file_name = deldot($file_name);//删除文件名末尾的点
使用burp抓包,文件名更改为webshell.php.
即可绕过
pass8
对比之前发现没有 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
使用burp抓包进行修改,在文件名后添加::$DATA
:: D A T A : N T F S 文 件 系 统 包 括 对 备 用 数 据 流 的 支 持 。 主 要 包 括 提 供 与 M a c i n t o s h 文 件 系 统 中 的 文 件 的 兼 容 性 。 备 用 数 据 流 允 许 文 件 包 含 多 个 数 据 流 。 每 个 文 件 至 少 有 一 个 数 据 流 。 在 W i n d o w s 中 , 此 默 认 数 据 流 称 为 : DATA: NTFS文件系统包括对备用数据流的支持。主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为: DATA:NTFS文件系统包括对备用数据流的支持。主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:
DATA。
简单讲就是在php+windows的情况下:如果文件名+":: D A T A " 会 把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。
复制地址
之后在地址栏中删掉::data就好
pass9
与之前相比,少了
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
从源码中可以分析对文件名首先删除文件末尾的点,此时还有php. (点+空格),在进行首尾去空格php. .,然后就剩下了php.,此时就相当于第七关
所以img_path的路径直接由file_name构成
使用burp抓包修改文件名为webshell.php. .(点+空格+点)
在这里我们就可以发现3-9关都可以使用点+空格+点绕过
pass10
$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");
$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 . '文件夹不存在,请手工创建!';
}
}
源码中缺少::$DATA、转换为小写、删除末尾点、空格的函数,这里的意思是将文件名里面那些黑名单后缀转换为空格,str_ireplace不区分大小写,所以大小写绕过不行,尝试双写后缀名,比如pphphp,将php转换为空格后还存在另一个php
将webshell.php命名为webshell.pphphp
使用burp可以查看路径