关注这个靶场的其他相关笔记: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信息。";}?>