pass-11

同样观察源码,发现一串有意思的代码,$file_name = str_ireplace($deny_ext,””, $file_name),这里就要提到这个函数的用法

$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","ini");

        $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 . '文件夹不存在,请手工创建!';
    }
}

str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写),该函数从前向后搜索,将搜索到的后缀删除

这里我第一次不知道是啥函数,先上传了一个.PHP文件尝试,发现上传路径中PHP后缀没了,这时候我就觉得可能是某些函数检查后缀并删除。百度搜索了一下关果然找到了这个函数,那这就简单了。

同样上传jpg文件,burpsuite抓包修改后缀,不过这次特殊,要改为.pphphp,让该函数删除中间的php,然后前方剩下的p和后方的hp合成php后缀,尝试一下

改好后Forward,在浏览器控制台查看文件上传是否成功

可以看到上传文件路径,上传成功,后缀也像我们想的那样正常,在地址栏输入看到的路径,php代码执行,绕过成功。

pass-12

观察源码,先上传一个.jpg文件尝试一下,发现根本不行。

$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类型文件!";
    }
}

这关就要考验我们的基础知识和php知识,这一关说实话我也没看明白,上网搜索了许多师傅的文章才看明白。

这里涉及到的%00截断,大家可以看一下这篇文章:https://www.codercto.com/a/61763.html

比如数据包中存在 path: uploads/ ,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00 ,如果程序中检测的是文件的后缀名合法性,而且通过拼接路径和文件名来保存上传的文件,那么攻击者修改了path以后的拼接结果为: uploads/aaa.php%00/2018051413370000.php ,移动文件的时候会将文件保存为 uploads/aaa.php ,这样我们的php文件就成功上传到服务器了,从而达到我们的目的。这里就尝试一下。

注意:move_uploaded_file这个函数遇到%00会截断,这也是我们修改path后面加这个字符的原因。

首先上传php后缀的一句话代码,同样是phpinfo()函数,下图是修改前

下面进行修改,path后面加上3-3.php%00,下方改后缀为允许的文件,修改path后当你上传的文件为允许文件后,程序会将合法的文件后缀,即.jpg切换为.php,达到了我们的效果

修改好后,Fprward,浏览器控制台查看,上传成功,并且查看带到路径

浏览器输入路径,只需要输入经过path修改后的php路径即可

成功绕过。

pass-13

观察源码,这关为post00截断,这里粘贴一位师傅的文章,解释的很清楚。

https://blog.csdn.net/m0_52432374/article/details/114776849

$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;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

相较于上一关的get,post不会自动对%00解码,这时候就需要我们自己进行关于解码的操作。

上传一个.ipg文件,用burpsuite抓包分析吗,需要修改箭头位置

将箭头位置加上3.php%00,同时使用burpsuite进行url解码

得到的数据包就为下图

forward,同时查看浏览器控制台,上传成功

同样在地址栏输入,要输入经过修改后的php文件路径

php代码执行,绕过过滤成功。

pass-14

同样还是观察源码,还有提示,可以看到这是要求我们上传图片马,关于文件包含大家可以自行百度,很简单的原理,被包含的文件可以被环境正常解析。例如这关我们上传的gif文件被党走php成功解析。

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

这关其实可以用图片马来进行绕过,首先就是准备一个一句话木马和一个正常的图片,用以下命令来进行制作,当然也可以用其他工具在不损坏图片的前提下制作。

制作成功后,进行上传,并在浏览器控制台查看路径,

然后来到文件包含界面,将上述路径放到这个地址栏来测试文件是否能执行成功,很显然看来我的图片马出错了无法执行。这里就用文件头绕过,采用GIF89a文件头来绕过检查。

gif绕过。这样程序就会认为这个文件是gif文件。允许上传

图片文件头以及解码:https://blog.csdn.net/LiuBuZhuDeFanHua/article/details/82949144··

上传成功,同时php文件变成了gif文件,不过并没有影响。

再文件包含界面尝试一下,发现php代码执行成功

成功绕过。

图片马的方法大家可以去尝试一下,这里只是我电脑有问腿,用cmd合成的图片马老是出现问题。就不再演示图片马的方法。

pass-15

查看源码,发现getimagesize()函数,通过观察源码发现,这一关通过该函数检查是否为图片文件,上网查看一下资料,发现该函数也是对文件开头进行检查,跟上一关一样,不过换了个函数,那就简单了。

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

使用上一关的方法,我就不重复了。这一关主要是让大家了解php中有关图片格式检查的方法以及函数。

接下篇