关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客
0x01:关卡配置
这一关有些特殊,需要链接到外部站点,但是这个站点已经挂了,无法访问:
所以笔者就根据网上的资料,对这一关进行了修复。由于本关需要读取上传图片的 EXIF 信息(这个下面会讲),所以需要更改 PHP 的配置。下面所有的操作都是针对 PhpStudy 进行的。
1. 查看当前站点使用的 PHP 版本,这里我使用的是 php5.3.29nts:
2. 访问 php 环境目录:
3. 找到对应的配置文件 php.ini
:
4. 在 php.ini
中搜索下面的内容,然后将前面的分号去掉就好,如下(记得保存修改后的内容):
5. 配置完成后,打开小皮面板,重启 Apache 服务即可:
0x02:过关流程
有些网站具有读取并展示图片 EXIF 信息的功能,比如下面这个网站:
EXIF信息查看器无需安装软件,只需上传照片即可查看完整EXIF信息,包括机身、镜头型号、拍摄时间、相机快门次数,支持JPEG、TIFF、CR2、NEF、XMP等多种图片格式。无需下载,比Exif Show, ExifPro更好用的EXIF查看器!https://exif.tuchong.com/
知识拓展:EXIF 信息
EXIF,即可交换图像文件格式,是一种包含各种元数据的数据,包括相机设置、拍摄日期和时间,如果打开了 GPS,可能还包括位置信息。
简而言之,就是图片中携带了信息,这个信息包括拍摄设备的参数,拍摄的时间,拍摄的地点等等敏感数据(之前是有过泄露的,CTF 也很爱出)。
而这些信息,我们是可以编辑的,回归本题,我们上传一张图片看看效果(笔者上传的时候代码报错了,虽然上传的确实是正常的图片,也不知道为啥,所以各位测试的时候,可以多备几张图片看看):
既然能回显图片的 EXIF 信息,那么每个位置其实都是回显点,下面我们来尝试编辑 EXIF 信息:
随便找个图片,右击,选择属性,然后选择详细信息,将 XSS Payload 随便找个位置写入:
<script>alert(1)</script>
然后打开靶场,上传这张图片,可以看到攻击成功了,这关也就过啦(有点小众):
0x03:源码分析
下面是 XSS LABS Level14 的后端源码,以及我对其的部分笔记:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<!-- <center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center> -->
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="exifviewer.php" frameborder=no width="80%" scrolling="no" height=80%></iframe></center>
<center>这关成功后不会自动跳转。成功者<a href=level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
这个源码没啥,就是通过一个 iframe 框架,引入了一个新的页面(exifviewer.php
就是我后写的用来识别图片 EXIF 的网页)。这里面没有做任何过滤,主要就是提供一个新的思路。
下面是 exifviewer.php
的文件内容(从靶场介绍中可以直接下载我修改后的靶场文件,没必要自己一个一个改,挺麻烦的,靶场介绍我会在当前靶场过关笔记都发布完成后最后发布,别问为啥不先发布,问就是因为存货。)
// exifviewer.php
<!-- Level 14 调取页面 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>exifviewer</title>
</head>
<body>
<center>
<form action="#" method="post" enctype="multipart/form-data">
<label for="file">请上传一张图片:</label><input type="file" name="file" id="file">
<input type="submit" name="submit" value="提交">
</form>
</center>
</body>
</html>
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
// 检查文件扩展名
if (!in_array($extension, $allowedExts)) {
echo "错误:非法的文件格式。";
exit;
}
// 尝试获取图像尺寸以验证图像
$imageInfo = getimagesize($_FILES["file"]["tmp_name"]);
if (!$imageInfo) {
echo "错误:上传的不是有效的图像文件。";
exit;
}
// 检查文件上传错误
if ($_FILES["file"]["error"] > 0) {
echo "错误:上传文件时发生错误: " . $_FILES["file"]["error"] . "<br>";
exit;
}
// 尝试移动文件
$uploadDir = "uploads/"; // 确保此目录存在且可写
$targetPath = $uploadDir . basename($_FILES["file"]["name"]);
if (!move_uploaded_file($_FILES["file"]["tmp_name"], $targetPath)) {
echo "错误:无法移动文件。";
exit;
}
// 读取EXIF信息
$exif = exif_read_data($targetPath, 0, true);
if ($exif !== false) {
echo "<h4>[" . basename($_FILES["file"]["name"]) . "]的EXIF信息:</h4>";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
} else {
echo "无法读取EXIF信息。";
}
?>