文章目录
- 前言
 - Pass-01
 - Pass-02
 - Pass-03
 - Pass-04
 - Pass-05
 - Pass-06
 - Pass-07
 - Pass-08
 - Pass-09
 - Pass-10
 - Pass-11
 - Pass-12
 - Pass-13
 - Pass-14
 - Pass-15
 - Pass-16
 - 解题感悟
 
前言
美好的一天从刷题开始
Pass-01

 
 我淦20道题???一道一道来吧
先看第一道题
 先在home里搞一个图片和一个php文件
 上传个图片试试
 再上传个php文件试试
 翻一翻检查发现了一个checkFile函数
 直接删掉return checkFile()试试
 
 
 上传成功
 
 看看提示吧
 很好,和咱们的尝试一样
Pass-02
界面和第一题的一样
 
用第一题的方法试试,发现不行意料之中
 抓包试试,burp启动!启动后切换代理
先新建一个模拟的php,扩展名伪装成jpg
拦截打开然后上传伪装成图片的php文件
把.jpg改成.php,然后放包
 
拿下
 
 看一看提示叭
emmmmm差不多,那咱们根据提示的方法再做一遍叭
拦截,上传php
Content-Type中改成image/jpeg
改完后放包
搞定
 
Pass-03
第三题先看提示
 禁止asp,aspx,php,jsp后缀,这是不是意味着其他的都可以,咱们试一下
因为我懒得建文件了,所以我就直接用burp模拟了
改成php5试试
成功
Pass-04

 这道题有点像第三题的升级版
 细节的朋友立马就会想到.htaccess。没错和第三题的方法一样拦截,抓包,修改,放包。尝试一下
 
成功
Pass-05

 6…这下连.htaccess也禁了,这就过分了
既然这样咱们就只能直接代码审计了
$is_upload = false;  // 初始化上传标志,默认为false
$msg = null;  // 初始化消息变量,默认为null
// 检查是否有表单提交
if (isset($_POST['submit'])) {
    // 检查上传路径是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件扩展名
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", 
            ".html", ".htm", ".phtml", ".pht", ".pHp", 
            ".phP", ".pHP", ".PhP", ".pHp3", ".pHp2", 
            ".Html", ".Htm"
        );
        
        // 获取上传文件的原始名称并去除空白
        $file_name = trim($_FILES['upload_file']['name']);
        // 删除文件名末尾的点
        $file_name = deldot($file_name);
        // 获取文件扩展名
        $file_ext = strrchr($file_name, '.');
        // 去除扩展名中的特殊字符串
        $file_ext = str_ireplace(':$DATA', '', $file_ext);
        // 去除空白字符
        $file_ext = trim($file_ext);
        // 检查文件扩展名是否在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            // 获取上传文件的临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 生成保存路径和文件名,包含当前日期和随机数
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            
            // 尝试将文件从临时目录移动到目标目录
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;  // 上传成功,设置标志为true
            } else {
                $msg = '上传出错!';  // 移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件类型不允许上传!';  // 文件扩展名在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . ' 文件夹不存在,请手工创建!';  // 上传路径不存在,设置错误消息
    }
}
 
通过分析咱们可以发现他并没有对扩展名的大小写进行统一转换,这不就意味着我把.php改成。PHP或者PHp就ok了,尝试一下
还是那套步骤试一下
 
 成功
Pass-06

目测可以用第四题的方法破解,试一试.htaccess
 好吧不行…
那就浅浅审计一下代码叭
$is_upload = false;  // 初始化上传标志,默认情况下设置为false
$msg = null;  // 初始化消息变量,默认情况下设置为null
// 检查表单是否通过POST方法提交
if (isset($_POST['submit'])) {
    // 检查上传路径是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件扩展名数组
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",
            ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", 
            ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", 
            ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", 
            ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"
        );
        // 获取上传文件的原始名称
        $file_name = $_FILES['upload_file']['name'];
        // 删除文件名末尾的点
        $file_name = deldot($file_name);
        // 获取文件扩展名
        $file_ext = strrchr($file_name, '.');
        // 将扩展名转换为小写
        $file_ext = strtolower($file_ext);
        // 去除字符串::$DATA
        $file_ext = str_ireplace('::$DATA', '', $file_ext);
        // 检查文件扩展名是否在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            // 获取上传文件的临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 生成保存路径和文件名,包含当前日期和随机数
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            // 尝试将文件从临时目录移动到目标目录
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;  // 上传成功,设置标志为true
            } else {
                $msg = '上传出错!';  // 移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件不允许上传';  // 文件扩展名在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';  // 上传路径不存在,设置错误消息
    }
}
 
分析可发现限制了大小写,但是没有对空格进行过滤,那咱们加个空格不就行了。试一试
 
 成功
 
Pass-07

 全禁止了?尊嘟假嘟,不信。我就要找一找试试先不看源码
 信了…
老老实实审计代码吧
$is_upload = false;  // 初始化上传标志,默认情况下设置为false
$msg = null;  // 初始化消息变量,默认情况下设置为null
// 检查表单是否通过POST方法提交
if (isset($_POST['submit'])) {
    // 检查上传路径是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件扩展名数组
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",
            ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", 
            ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", 
            ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", 
            ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"
        );
        // 获取上传文件的原始名称并去除空白
        $file_name = trim($_FILES['upload_file']['name']);
        // 获取文件扩展名
        $file_ext = strrchr($file_name, '.');
        // 将扩展名转换为小写
        $file_ext = strtolower($file_ext);
        // 去除扩展名中的特殊字符串
        $file_ext = str_ireplace('::$DATA', '', $file_ext);
        // 去除空白字符
        $file_ext = trim($file_ext);
        // 检查文件扩展名是否在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            // 获取上传文件的临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 生成保存路径和文件名
            $img_path = UPLOAD_PATH . '/' . $file_name;
            // 尝试将文件从临时目录移动到目标目录
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;  // 上传成功,设置标志为true
            } else {
                $msg = '上传出错!';  // 移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件类型不允许上传!';  // 文件扩展名在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';  // 上传路径不存在,设置错误消息
    }
}
 
分析后可以发现他没有过滤末尾的.。也就是说在扩展名的末尾加个.就好了。
试一下
成功
Pass-08

咋和第五题的提示一样,话不多说直接上源码
$is_upload = false;  // 初始化上传标志,默认情况下设置为false
$msg = null;  // 初始化消息变量,默认情况下设置为null
// 检查表单是否通过POST方法提交
if (isset($_POST['submit'])) {
    // 检查上传路径是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件扩展名数组
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",
            ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", 
            ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", 
            ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", 
            ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"
        );
        // 获取上传文件的原始名称并去除空白
        $file_name = trim($_FILES['upload_file']['name']);
        // 删除文件名末尾的点
        $file_name = deldot($file_name);
        // 获取文件扩展名
        $file_ext = strrchr($file_name, '.');
        // 将扩展名转换为小写
        $file_ext = strtolower($file_ext);
        // 去除空白字符
        $file_ext = trim($file_ext);
        // 检查文件扩展名是否在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            // 获取上传文件的临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 生成保存路径和文件名,包含当前日期和随机数
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            // 尝试将文件从临时目录移动到目标目录
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;  // 上传成功,设置标志为true
            } else {
                $msg = '上传出错!';  // 移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件类型不允许上传!';  // 文件扩展名在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';  // 上传路径不存在,设置错误消息
    }
}
 
可以发现本题没有去除字符串::$DATA,那咱们就加上试一试
 
 成功
 
Pass-09

 代码审计
$is_upload = false;  // 初始化上传标志,默认情况下设置为false
$msg = null;  // 初始化消息变量,默认情况下设置为null
// 检查表单是否通过POST方法提交
if (isset($_POST['submit'])) {
    // 检查上传路径是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件扩展名数组
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",
            ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", 
            ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", 
            ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", 
            ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"
        );
        // 获取上传文件的原始名称并去除空白
        $file_name = trim($_FILES['upload_file']['name']);
        // 删除文件名末尾的点
        $file_name = deldot($file_name);
        // 获取文件扩展名
        $file_ext = strrchr($file_name, '.');
        // 将扩展名转换为小写
        $file_ext = strtolower($file_ext);
        // 去除特殊字符串 '::$DATA'
        $file_ext = str_ireplace('::$DATA', '', $file_ext);
        // 去除扩展名首尾的空白字符
        $file_ext = trim($file_ext);
        // 检查文件扩展名是否在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            // 获取上传文件的临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 生成保存路径和文件名,包含当前日期和随机数
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            // 尝试将文件从临时目录移动到目标目录
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;  // 上传成功,设置标志为true
            } else {
                $msg = '上传出错!';  // 移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件类型不允许上传!';  // 文件扩展名在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';  // 上传路径不存在,设置错误消息
    }
}
 
分析发现过滤了大小写,空格,点以及数据流 , 但只过滤了一遍点和空格 , 我们在文件后缀名添加空格点空格点 ,或者是点空格点来绕过黑名单
 搞定
 
Pass-10

 会去除扩展名的话直接双写试试
成功
Pass-11

 路径,大概率是直接%00截断
看一看源码叭
用的是白名单那咱们就直接试一试
 
 本题要求php版本小于等于5.3.4,否则会显示上传失败
Pass-12

 emmm直接代码审计吧
 
 依旧是白名单,只不过这个是post,和上一个操作方式一样。
 
 
 版本问题所以会显示上传失败
Pass-13

 先建一个php文件输入内容
<?php 
	echo "Are you OK";
?>
 
先自己生成一个图片马在Linux上需要用cat指令
cat 222.jpg 111.php > 333.jpg
cat 222.jpg 111.php > 333.png
cat 222.jpg 111.php > 333.gif
 

 直接上传图片然后可以进入burp看一看抓到的这个post包进行分析,可以看到我在php里写的内容
 完成
Pass-14

和上一题一样直接上传图片马
 检验方法和上题一样
 结案下一题
Pass-15

 和上题一样,直接上传图片马
 检验方法和上题一样
 这三题虽然步骤一样,但是考点是不一样
Pass-16

 代码审计

 
 
$is_upload = false;  // 初始化上传标志,默认情况下设置为false
$msg = null;  // 初始化消息变量,默认情况下设置为null
if (isset($_POST['submit'])){  // 检查表单是否通过POST方法提交
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];
    // 定义目标路径
    $target_path = UPLOAD_PATH . '/' . basename($filename);
    // 获得上传文件的扩展名
    $fileext = substr(strrchr($filename, "."), 1);
    // 判断文件后缀与类型,合法才进行上传操作
    if (($fileext == "jpg") && ($filetype == "image/jpeg")) {
        if (move_uploaded_file($tmpname, $target_path)) {
            // 使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);
            if ($im == false) {
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            } else {
                // 给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()) . ".jpg";
                // 显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH . '/' . $newfilename;
                imagejpeg($im, $img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    } else if (($fileext == "png") && ($filetype == "image/png")) {
        if (move_uploaded_file($tmpname, $target_path)) {
            // 使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);
            if ($im == false) {
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            } else {
                // 给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()) . ".png";
                // 显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH . '/' . $newfilename;
                imagepng($im, $img_path);
                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }
    } else if (($fileext == "gif") && ($filetype == "image/gif")) {
        if (move_uploaded_file($tmpname, $target_path)) {
            // 使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if ($im == false) {
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            } else {
                // 给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()) . ".gif";
                // 显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH . '/' . $newfilename;
                imagegif($im, $img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    } else {
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}
 
图片进行二次渲染处理,这样的话就算上传图片马内容也会被重写啊…
 是我太菜了没有一点思路
 于是我在网上找了一些相关文章发现两篇不错的教程:
 https://www.cnblogs.com/forforever/p/13191999.html
https://xz.aliyun.com/t/2657?time__1311=n4%2BxnieDw4uneG%3DD%2FWT4BKg34fobDGqIhD
初学者能力有限请见谅
解题感悟
掌握了很多思路与方法,这个靶场涵盖了常见的漏洞,就算我不理解网上的教程咋都是在本地部署的环境,让我这个在kali上进行解题的格格不入。。。。


















