upload-labs(11)
%00截断的代码解析:
逛了一圈博客,对于00截断没有一个详细的截断作用解释,自己写了一点,和大家分享。
<?php
$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']; //获取上传文件名(无后缀)
//最关键的一步:将save_path的值提取(默认为../upload/)中间拼接了一个随机数和年月日时分秒再.上传文件的后缀
//exp: $img_path='../upload//9520220401035448.jpg'
$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类型文件!";
}
}
?>
%00截断在哪截断?
在默认传POST请求中,我们看到传了save_path,结合上面的代码注释,在save_path=…/upload/11.php**%00**做处理
截断原理就是%00置空,将后面的内容忽略,所以原来的:
$img_path='…/upload//9520220401035448.jpg’在加了截断之后就可以变成:
$img_path='…/upload//11.php
此时直接连接就行
对于不同格式的00截断,网上都有不同的教程
贴上抓jpg包的结果: