目录
本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS的真实原因,讲解XSS原理并进行渗透实践,本文为XSS关卡01-反射型GET的渗透部分。
一、XSS
XSS(跨站脚本攻击)是指攻击者通过向网页注入恶意脚本(通常为JavaScript),当其他用户访问该页面时,这些脚本会在受害者浏览器中执行,从而窃取Cookie、会话令牌等敏感信息,篡改页面内容或进行钓鱼攻击。XSS主要分为三类:
- 存储型(恶意脚本永久存储在服务器,如论坛评论区)
- 反射型(脚本通过URL参数临时反射到页面)
- DOM型(纯前端攻击,由浏览器解析触发)。
防御措施包括对用户输入进行严格过滤和转义、实施内容安全策略(CSP)以及设置HttpOnly属性保护Cookie。
二、反射型XSS
反射型XSS(Reflected Cross-Site Scripting)是一种常见的Web安全攻击,攻击者将恶意脚本嵌入URL参数中,诱骗用户点击特制链接。当服务器未对输入进行过滤,直接将参数内容返回到网页时,浏览器会执行其中的恶意代码。此类攻击具有非持久性,仅在用户点击恶意链接时触发,常见于搜索框、错误页面等场景。
三、GET型报文
HTTP的GET型报文是HTTP协议中最基础的请求方法之一,主要用于从服务器获取资源。HTTP 的 GET 型报文主要由请求行、请求头部、空行(用于分隔头部和主体)组成,因为 GET 请求通常不包含请求主体(数据通过 URL 中的查询参数传递),以下是其结构的表格表示:
组成部分 | 说明 |
---|---|
请求行 | 包含 GET 请求方法、请求资源路径和 HTTP 协议版本 |
请求头部 | 包含客户端信息及请求相关参数,如用户代理、可接受的内容类型等 |
空行 | 用于分隔请求头部和请求主体 |
请求主体 | GET 请求通常为空,数据通过 URL 中的查询参数传递 |
四、代码审计
进入pikachu靶场XSS系列的01关卡-反射型GET页面,具体如下所示。
http://127.0.0.1/pikachu/vul/xss/xss_reflected_get.php
查看反射型XSS关卡源码xss_reflected_get.php文件内容,很明显没有对传入的参数message进行 任何过滤,换言之本关卡直接将用户输入字符串带入特定语句并进行回显,并没有任何的过滤,有XSS攻击风险,具体内容如下所示。
代码直接将用户通过 GET 请求传递的 message
参数的值嵌入到 HTML 输出中,没有对其进行任何过滤和转义处理。这意味着攻击者可以构造包含恶意脚本的 message
参数值,接下来对源码进行详细注释,具体如下所示。
<?php
// 初始化一个空字符串变量 $html,用于存储要输出的 HTML 内容
$html = '';
// 检查是否通过 GET 请求方式提交了名为 'submit' 的表单元素
// 如果提交了,说明用户触发了相关操作,进入后续处理逻辑
if (isset($_GET['submit'])) {
// 检查 GET 请求中 'message' 参数是否为空
if (empty($_GET['message'])) {
// 如果 'message' 参数为空,向 $html 变量中追加一段提示信息
// 提示用户输入 'kobe' 进行尝试
$html .= "<p class='notice'>输入'kobe'试试-_-</p>";
} else {
// 如果 'message' 参数不为空
// 检查 'message' 参数的值是否等于 'kobe'
if ($_GET['message'] == 'kobe') {
// 如果 'message' 参数的值等于 'kobe'
// 向 $html 变量中追加一段祝福信息,其中包含用户输入的 'kobe'
// 同时追加一张图片,图片路径使用了预定义的常量 $PIKA_ROOT_DIR
$html .= "<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
} else {
// 如果 'message' 参数的值不等于 'kobe'
// 向 $html 变量中追加一段提示信息,表示不关心输入的内容
$html .= "<p class='notice'>who is {$_GET['message']},i don't care!</p>";
}
}
}
?>
五、渗透实战
1、渗透方法1
(1)XSS Payload
XSS注入语句<script>alert("mooyuan")</script>的含义如下所示。
- <script> 标签:HTML 中定义 JavaScript 代码块的标记。
- alert("mooyuan"):调用浏览器的弹窗函数,显示内容为 mooyuan 的警告框。
- 整体作用:当该脚本被浏览器解析时,会立即弹出警示框。
<script>alert("mooyuan")</script>
发现长度有限制,输入不全,猜测是页面的对输入长度进行截断。
(2)修改长度限制
右键查看元素,找到length,把20修改为200或者更长(修改后页面不刷新)
修改前如下所示:
修改后如下所示:
(3)再次注入成功
输入<script>alert("mooyuan")</script>,弹框显示mooyuan说明渗透成功,如下所示。
2、渗透方法2
(1)修改页面长度限制
本次注入获取cookie的XSS脚本,首先修改length为200但是不刷新页面,如下所示。
修改成功后页面如下所示。
(2)XSS Payload
渗透方法2的注入语句<script>alert(document.cookie)</script> 是一段 JavaScript 代码,用于在浏览器中弹出一个包含当前网页 cookie 信息的提示框。
- document.cookie 是 JavaScript 中用于操作浏览器 cookie 的属性。cookie 是服务器发送到用户浏览器并保存在本地的小段数据,可在浏览器下次向同一服务器再发起请求时被携带上并发送到服务器上。
- alert() 是 JavaScript 的一个函数,它会创建一个模态对话框,显示传入的内容。这段代码组合起来,就是通过 alert 函数将当前页面的 cookie 信息展示给用户。不过,若被攻击者利用,他们能通过此代码获取用户的敏感信息,如登录凭证等,从而实施安全攻击。
<script>alert(document.cookie)</script>
(3)注入成功
在输入框中输入 <script>alert(document.cookie)</script>弹出了cookie值,渗透成功,如下所示。