web-CheckIn
打开题目,给了github上面的源码地址
可以看到/var/目录下的一些文件,注意这并不是在网站的根目录
查看一下clean.sh的内容
清理php中的seesions下的目录文件和uploads下的文件
第二个default文件里面没有什么内容
第三flag文件
看着像flag,实则不是,就逗逗你!
打开html文件件下的index.php文件
发现就是index.php文件的源码,直接审计一波
<?php
// error_reporting(0);
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
mkdir($userdir, 0777, true);//上传根据远程md5ip创建一个文件夹
}
file_put_contents($userdir . "/index.php", "");//然后在此文件夹下创建一个index.php的文件,内容为空
if (isset($_POST["upload"])) {
$tmp_name = $_FILES["fileUpload"]["tmp_name"];
$name = $_FILES["fileUpload"]["name"];
if (!$tmp_name) {
die("filesize too big!");
}
if (!$name) {
die("filename cannot be empty!");
}//进行正常文件判断,大小和不能为空
$extension = substr($name, strrpos($name, ".") + 1);//取出上传文件的后缀名
if (preg_match("/ph|htacess/i", $extension)) {//正则匹配,/i是不区分大小写,所有什么大小写绕过,后面加数字都不行了
die("illegal suffix!");
}
if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {//对文件内容进行正则匹配,<?php 会被检测到
die("<? in contents!");
}
$image_type = exif_imagetype($tmp_name);//判断是否为图片,这个函数,可以在文件里加一个图片幻术的头绕过
if (!$image_type) {
die("exif_imagetype:not image!");
}
$upload_file_path = $userdir . "/" . $name;
move_uploaded_file($tmp_name, $upload_file_path);//上传
echo "Your dir " . $userdir. ' <br>';
echo 'Your files : <br>';
var_dump(scandir($userdir));//打印出上传路径下的有那些文件
}
基本理清思路,这里思考一下,为啥要在上传路径下生成一个index.php文件?
而且不能上传htacess
这里我想到了.user.ini文件
此文件作用和htacess一样,都能对当下的文件设置环境变量
直接构造.user.ini文件内容为
GIF89a
auto_append_file=c.jpg
然后构造图片马
GIF89a?
然后上传图片马,上传.user.ini,然后访问上传路径下的index.php
发现本来为空的index.php有了我图片马的文件头,执行了php马
然后菜刀,怎么都连不上,应该是禁止了
然后就写直接读取flag php代码
根据源码要上跳三层目录
构造payload
GIF89a?
成功读到flag文件