pikachu靶场通关笔记06 XSS关卡02-反射型POST

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

一、XSS

二、反射型XSS

三、POST型报文

四、GET型与POST型区别

五、代码审计

五、渗透实战

1、渗透方法1

2、渗透方法2


本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS风险的真实原因,讲解XSS的原理并进行渗透实践,本文为XSS关卡02-反射型POST的渗透部分。

一、XSS

XSS 全称为跨站脚本攻击(Cross - Site Scripting),它允许攻击者在受害者的浏览器中注入恶意脚本,从而获取用户的敏感信息、执行非法操作或篡改网页内容。攻击者通常会利用网站对用户输入过滤不严格的弱点,将恶意脚本伪装成正常的用户输入,例如在评论框、搜索栏等位置输入包含恶意脚本的内容。当其他用户访问包含该恶意脚本的页面时,浏览器会误认为这些脚本是合法的,并执行它们。

XSS主要分为三类,具体如下表所示。

分类 简要描述
反射型 XSS 恶意脚本随请求参数被服务器返回,仅在当前请求中生效
存储型 XSS 恶意脚本存储于服务器端,所有访问相关页面用户均受影响
DOM 型 XSS 利用 DOM 操作,修改页面结构注入恶意脚本,与服务器端处理无关

二、反射型XSS

反射型 XSS 是一种常见的跨站脚本攻击类型,攻击者通过诱使用户点击包含恶意脚本的链接,将脚本作为参数嵌入到 URL 中。用户访问该链接后,服务器将脚本反射回浏览器并执行,从而实现攻击目的。反射型 XSS 与 POST 型 XSS 的区别如下。

对比维度 反射型 XSS POST 型 XSS
数据传输方式 通过 URL 参数传输恶意脚本,数据可见于 URL 中 利用 POST 请求将恶意脚本放在请求体中传输,URL 中不直接显示
攻击触发方式 用户点击包含恶意脚本的链接即可触发 通常需要用户在表单等场景中输入恶意内容并提交 POST 请求来触发
传播性 可以通过邮件、即时通讯工具等发送链接进行传播,传播相对容易 传播相对较难,需要诱导用户在特定表单中输入恶意内容并提交
隐蔽性 URL 中可见恶意脚本,相对容易被发现 恶意脚本在请求体中,相对更隐蔽,不易被察觉

三、POST型报文

HTTP的GET型报文是HTTP协议中最基础的请求方法之一,主要用于从服务器获取资源。HTTP 的 GET 型报文主要由请求行、请求头部、空行(用于分隔头部和主体)组成,因为 GET 请求通常不包含请求主体(数据通过 URL 中的查询参数传递),以下是其结构的表格表示。

组成部分 说明
请求行 包含请求方法(POST)、请求的资源路径和 HTTP 版本,如 POST /upload.php HTTP/1.1
请求头部 包含客户端信息和请求相关参数,如 Content-Type 表明请求主体的类型、Content-Length 指明请求主体的长度等
空行 用于分隔请求头部和请求主体
请求主体 存放要提交的数据,如表单数据、文件内容等

四、GET型与POST型区别

以下是 HTTP GET 与 POST 方法的对比表格,从多个维度展示二者的核心区别。

对比维度 GET 方法 POST 方法
主要用途 请求获取资源(查询数据) 提交数据到服务器(修改/创建资源)
参数位置 明文附加在URL后(?key=value 封装在请求体(Request Body)中
数据长度限制 受URL长度限制(通常≤2048字符) 理论上无限制(实际受服务器配置约束)
安全性 低(参数暴露在URL、浏览器历史、日志中) 较高(参数不可见,但未加密仍可被嗅探)
浏览器行为 可收藏为书签,支持页面刷新 刷新时会提示重新提交表单
典型应用场景 搜索、分页、资源下载 登录、支付、文件上传、敏感数据提交
报文示例 GET /search?q=term HTTP/1.1 POST /login HTTP/1.1
Body: user=admin&pass=123
SEO影响 搜索引擎可索引URL参数 参数不可见,不影响SEO

五、代码审计

进入pikachu靶场XSS系列关卡的02关卡-反射型POST页面,打开后发现是一个登陆页面,点击右上角的提示,发现提示账号的用户名和密码为admin/123456,具体如下所示。

http://127.0.0.1/pikachu/vul/xss/xsspost/post_login.php

输入用户名admin,密码123456,点击登录。

此时进入了一个可以查询NBA球员的页面,输入框可以输入内容,完整URL如下所示。

http://127.0.0.1/pikachu/vul/xss/xsspost/xss_reflected_post.php

查看反射型XSS关卡源码xss_reflected_post.php文件内容,很明显没有对传入的参数message进行 任何过滤,换言之本关卡直接将用户输入字符串带入特定语句并进行回显,并没有任何的过滤,有XSS风险具体如下所示。

代码直接将用户通过 POST 请求传递的 message 参数的值嵌入到 HTML 输出中,没有对其进行任何过滤和转义处理。这意味着攻击者可以构造包含恶意脚本的 message 参数值,当服务器接收到包含恶意脚本的输入并将其作为响应内容返回给浏览器时,浏览器会将其解析为 HTML 和 JavaScript 代码并执行,从而触发 XSS 攻击。攻击者可以利用此XSS风险获取用户的敏感信息、进行会话劫持等操作。接下来对源码进行详细注释,具体如下所示。

<?php
// 定义一个字符串变量 $state,用于存储提示信息
// 该信息包含一个超链接,点击链接会跳转到 xss_reflected_post.php 页面并携带 logout=1 参数,提示用户已经登录成功并提供退出登录的操作
$state = '你已经登陆成功,<a href="xss_reflected_post.php?logout=1">退出登陆</a>';

// 初始化一个空字符串变量 $html,用于存储后续要输出的 HTML 内容
$html = '';

// 检查是否通过 POST 请求方式提交了名为 'submit' 的表单元素
// 如果提交了,说明用户触发了相关操作,进入后续处理逻辑
if (isset($_POST['submit'])) {
    // 检查 POST 请求中 'message' 参数是否为空
    if (empty($_POST['message'])) {
        // 如果 'message' 参数为空,向 $html 变量中追加一段提示信息
        // 提示用户输入 'kobe' 进行尝试
        $html .= "<p class='notice'>输入'kobe'试试-_-</p>";
    } else {
        // 如果 'message' 参数不为空
        // 此处直接将用户通过 POST 请求输入的 'message' 参数值嵌入到 HTML 输出中,未做任何过滤处理
        // 下面会根据 'message' 参数的值进行不同的输出处理
        if ($_POST['message'] == 'kobe') {
            // 如果 'message' 参数的值等于 'kobe'
            // 向 $html 变量中追加一段祝福信息,其中包含用户输入的 'kobe'
            // 同时追加一张图片,图片路径使用了预定义的常量 $PIKA_ROOT_DIR
            $html .= "<p class='notice'>愿你和{$_POST['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        } else {
            // 如果 'message' 参数的值不等于 'kobe'
            // 向 $html 变量中追加一段提示信息,表示不关心输入的内容
            $html .= "<p class='notice'>who is {$_POST['message']},i don’t care!</p>";
        }
    }
}
?>

五、渗透实战

1、渗透方法1

XSS注入语句<script>alert("mooyuan")</script>的含义如下所示。

  • <script> 标签:HTML 中定义 JavaScript 代码块的标记。
  • alert("mooyuan"):调用浏览器的弹窗函数,显示内容为 mooyuan 的警告框。
  • 整体作用:当该脚本被浏览器解析时,会立即弹出警示框。
<script>alert("mooyuan")</script>

输入<script>alert("mooyuan")</script>,弹框显示mooyuan说明渗透成功,如下所示。

2、渗透方法2

渗透方法2的注入语句<script>alert(document.cookie)</script> 是一段 JavaScript 代码,用于在浏览器中弹出一个包含当前网页 cookie 信息的提示框。

  • document.cookie 是 JavaScript 中用于操作浏览器 cookie 的属性。cookie 是服务器发送到用户浏览器并保存在本地的小段数据,可在浏览器下次向同一服务器再发起请求时被携带上并发送到服务器上。
  • alert() 是 JavaScript 的一个函数,它会创建一个模态对话框,显示传入的内容。这段代码组合起来,就是通过 alert 函数将当前页面的 cookie 信息展示给用户。不过,若被攻击者利用,他们能通过此代码获取用户的敏感信息,如登录凭证等,从而实施安全攻击。
<script>alert(document.cookie)</script>

在输入框中输入 <script>alert(document.cookie)</script>弹出了cookie值,渗透成功,如下所示。