点击第十一关,并点击选择显示源码:
$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类型文件!";
}
}
对代码进行分析,在服务器获取到文件名时,首先使用substr函数和strrpos函数获取文件的后缀名。
- strrpos(str,"findstr",num):用于查找一个字符串在另一个字符串中最后一次出现的位置。(num指明从哪里开始查找,默认值为0)
- substr(string,int a ,int b) :用于从字符串中截取子字符串。(a:开始截取的位置,b:截取长度,当不指定b参数时,默认截取到最后一位字符串)
如果我们获得的后缀名在ext_arr中,那么开始文件上传,我们发现上传图片的保存路径img_path中的save_path是从get请求中得到的($_GET['save_path']):
那么我们可以考虑根据这一点进行文件上传,打开burpsuite监听,然后上传info.php木马文件
在请求头中,发现了savepath的值默认为../upload。
这时,我们使用00截断的方式进行文件上传,00 截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。
对文件路径save_path 和文件名filename进行修改,然后点击forward发送包:
发现文件成功上传,此时右键单击复制文件地址链接,并在浏览器访问:
直接回车会报错,这是因为我们需要删除链接php后的字符串:
然后再次回车,成功获取服务器php信息: