Pass-11 %00截断
0x01 过程
直接传php
得到提示,又是白名单了,扔到burpsutie
里面看。
发现了好东西,保存的路径出现在了url
中,可以直接采用%00
截断。
改好了文件后缀名和URL
中的路径后,仍然提示上传出错,这里应该就是php
版本的问题了。目录的版本是5.3.4
,而00截断
在5.3.4以后就修复了,同时magic_quotes_gpc
需要为Off
状态,所以我手动的将5.3.4
回退到5.2.17
了。不得不说,真的麻烦,花了我几个小时,再试一次。
这次成了,解析一下,注意,00
后面是被截断的,不要加在后面了。
太难了,太难了,今天早上5点才睡阿,还特么的没搞好,早上把phpstudy
的包拿出来改一下才好。。。
0x02 函数分析
$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类型文件!";
}
}
可以看到这里增加了sava_path
参数,给了我们截断绕过的机会。
Pass-12 0x00截断
0x01 过程
这题和上一题基本一样,只是save_path
不在URL
中了,而在POST
数据里面,由于POST
里面的数据不会被url自动解码
,所以要稍微改变一下,首先,先改好路径,然后再路径后面加上一个字符,什么字符都可以,这里我为了方便用+
号。
然后再点击Hex
,找到对应+
的十六进制数据2b
。
直接双击2b
改为00
,再切回到RAW
,查看报文。
直接GO,查看返回结果。
访问,解析成功。
因为是十六进制所以这种截断叫做是0x00截断
,其实是%00截断
最终被url解码
还是会变成0x00
的。在url
中%00
表示ascll
码中的0
,而ascii
中0
作为特殊字符保留,表示字符串结束,所以当url
中出现%00
时就会认为读取已结束。这是一样的道理,所以这里还有另外一种做法。
直接在后面加上%00
然后选中,右键如下图进行url解码
即可,或者直接按ctrl+shfit+u
。
效果会是一样的。
源码不用分析什么,就是将GET
换成了POST
而已。
$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 = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; //换成了POST
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传失败";
}
} else {
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}