Maxton‘s Blog

返回

Xss-labs通关全解&&XSS笔记03

分析以及笔记

初学者学习并且参考整理的笔记,仅供参考,非专业人员,难免有疏忽,借鉴他人,AI辅助之处,见谅。

我选择直接使用源码呈现(正常情况下是无法看到完整源码的,只能看到页面源码),一方面是省去试错payload所占用的篇幅,另一方面也是为了日后温习时能更加直观,不需要再挂其他的了,我觉得大部分过滤的方法都可以被试出来,多输入几次总归可以。\

第十一关#

源码呈现

1.这一关从源码分析来看全是烟雾弹(真实做题看不到源码能做出来真的很厉害了,反正我看到想不到)

<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
php

题目中给出的四个变量,往里传什么都没用…

2.题目的切入点就在于http请求头部分

$str11=$_SERVER['HTTP_REFERER'];
php

后续内容可以看到只是进行了简单的对 <> 的过滤,那么我们就需要一些辅助工具了,例如Hackbar BurpSuite

3.例如使用BurpSuite抓包后直接末尾加入

Referer: " onclick = alert(1) type="text
plaintext

第十二关#

源码展示

1.和上一关很相似,只是把referer变成了user agent

2.依旧是BurpSuite抓包,找到User-Agent构造

User-Agent:" onclick = alert(1) type="text
plaintext

第十三关#

源码展示

1.和上两关没什么区别,这次变成了 cookie

2.源码中如下写到,使用了cookie中user的值,在看不到源码情况下,通过bp抓包也是能明显发现端倪的

setcookie("user", "call me maybe?", time()+3600);
php
Cookie: user=call+me+maybe%3F  
plaintext

题目中暗示我们修改user的值进而实现注入

3.剩下的就和上述关卡没什么区别了

Cookie: user=" onclick = alert(1) type="text
plaintext

HTTP请求头注入#

关卡注入点 (HTTP Header)PHP 接收代码 (漏洞源)过滤情况核心 Payload (通用)
Level 11Referer$_SERVER['HTTP_REFERER']过滤 < >
不过滤 "
" onclick=alert(1) type="text
Level 12User-Agent$_SERVER['HTTP_USER_AGENT']过滤 < >
不过滤 "
" onclick=alert(1) type="text
Level 13Cookie$_COOKIE['user']过滤 < >
不过滤 "
" onclick=alert(1) type="text

第十四关#

源码呈现

<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>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
html

1.XSS Labs 的第 14 关经常被认为是“坏掉的”或者“无法完成的”

2.这里我们可以通过本地修改,实现本地运行,我这里是docker环境,就直接进去修改了level14.php

图方便,这里也没有再写其他的过滤什么的了,自己想的话也可以,最终方法也和之前的关卡大差不差

3.然后我们不妨构造python 脚本来实现

Exif 注入#

  1. 核心概念
  • Exif 是什么:图片的“隐藏备注信息”(元数据),包含相机型号、拍摄时间、GPS等。存放在 JPG 文件头部。

  • 注入原理:Exif 本质是文本。攻击者使用工具将“相机型号”等字段修改为 恶意代码(如 XSS Payload)。

  • 触发条件:服务器端读取了图片 Exif 信息(如 exif_read_data()),并且没有过滤就直接显示在页面上或存入数据库。

  1. 攻击流程

  2. 制作:用 ExifTool 或 Python 脚本,将 Payload 写入图片字段。

  3. 上传:将“带毒”图片上传至目标网站。

  4. 执行

    • Stored XSS:当用户/管理员查看图片详情页时触发。

    • SQL 注入:当后端将 Exif 信息存入数据库时触发(较少见)。

注入字段 (Tag Name)含义推荐指数原因
Model相机型号⭐⭐⭐⭐⭐最常被读取和显示,Level 14 考点
Make相机制造商⭐⭐⭐⭐⭐常与 Model 一起被显示
ImageDescription图像描述⭐⭐⭐⭐允许字符较长,适合长 Payload
UserComment用户注释⭐⭐⭐⭐专门留给用户写的,容量大
Artist摄影师/作者⭐⭐⭐有些相册程序会显示作者名
Copyright版权信息⭐⭐⭐通常显示在页面底部

第十五关#

源码呈现

1.这关的核心技术是 AngularJS 的前端包含漏洞。

当然直接看网页源码也能看得出来

2.ng-include 是什么? 这是 AngularJS 的一个指令(Directive)。它的作用类似于 PHP 的 include,用来把外部的一个 HTML 文件抓取过来,并放到当前标签里显示原本的设计意图:这关原本是接着 Level 14 的。作者想让你在 Level 14 上传一个含有 Payload 的图片(比如 1.jpg),然后在 Level 15 里引用它 (?src='1.jpg')。AngularJS 会把图片当成 HTML 代码执行。但是很遗憾14关坏掉了。

3.但是我们可以换个思路 从第一关入手,我们可以如下构造

level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
html

为什么不用 <script>?因为 AngularJS 通过 ng-include 加载进来的 HTML,如果不做特殊处理,直接的 <script> 标签往往不会执行,但 <img> 标签的 onerror 事件是肯定会触发的

之所以这里经过了htmlspecialchars()还能够正常使用,通过ng-include 因为浏览器会自动处理实体编码 &lt; 还原为字符给 JS 使用,或者作为 URL 参数发送

AngularJS#

知识点关键指令/符号作用 (正常功能)CTF/安全考点 (黑客视角)典型 Payload / 场景
启动指令ng-app定义 Angular 应用的根元素,告诉框架从这里开始解析。如果页面没开 Angular,你可以注入这个属性强制开启,从而进行后续攻击。<html ng-app>
文件包含ng-include加载外部 HTML 片段并编译执行。绕过本地过滤。将 XSS Payload 藏在另一个文件或 URL 中,利用此指令“借刀杀人”。<div ng-include="'level1.php?x=payload'"></div>
模板表达式{{ }}在 HTML 中输出变量或简单的计算结果。CSTI (模板注入)。利用特殊的构造绕过沙箱,执行任意 JS 代码。{{constructor.constructor('alert(1)')()}}
事件指令ng-click
ng-mouseover
绑定鼠标点击、悬停等事件。类似于原生的 onclick,但属于 Angular 体系,有时能绕过对标准 HTML 事件的过滤。<div ng-mouseover="x=1">
不安全 HTMLng-bind-html将 HTML 内容绑定到元素上。如果没有配合 $sce (严格上下文转义) 使用,会导致 DOM 型 XSS。<div ng-bind-html="user_input">
过滤器|| (管道符)格式化数据(如大小写转换、排序)。有时用来混淆 Payload,或者在老版本中利用 orderBy 等过滤器进行沙箱逃逸。
No-Executeng-non-bindable告诉 Angular 不要解析该元素的内容。防御手段。如果你看到这个,说明你的注入在这块区域会失效。<span ng-non-bindable>{{1+1}}</span>