XSS-LABS 通关(level 1-level 16)

简要

XSS-LABS可以本地搭建,如果不想本地搭建也可以在网上找在线的XSS-LABS靶场
博主这里用的是本地搭建的靶场,推荐在线靶场XSS-LAB在线靶场


只要出现弹窗即为挑战成功

level 1

image
有GET型传参,那么参数一般就为攻击点,进行测试,传入payload
<script>alert()</script> 出现弹窗,成功通关

level 2

image
出现搜索框,那么就在搜索框测试一下传统payload,出现以下回显
image
F12打开开发者工具,查看源代码,发现payload在value的值里,那么就需要将value闭合
image


直接用完全闭合标签 '"><script>alert(1)</script>
成功出现弹窗,通关

level 3

image
对搜索框,我们直接对其用完全闭合标签,发现没有弹窗,打开源代码检查,发现有些字符像“>”等被实体化了
想到了HTMLSPECIALCHARS()函数的绕过(这里可以去看之前的有一篇文章:https://www.cnblogs.com/asplin-037/p/19538562
image
这里把我们就用onclick绕过,payload:
' onclick='alert(123)' 点击一下搜索框就能弹窗

level 4

我们也是先测试一下:'"><script>alert()</script>
image
image
在源代码中我们可以看到,我们输入的英文的单引号变成了中文的单引号,所以我们需要绕过这个对单引号的过滤
又看到它并没有过滤双引号,所以就用双引号进行闭合,构造payload:
" onmouseover="alert(123)"成功弹窗



level 5

简单测试一下并没有什么头绪,查看一下源代码
image
看一下具体的语句:


$str = strtolower($_GET["keyword"]);
# 先将所有字母转成小写

$str2=str_replace("<script","<scr_ipt",$str);
# 将匹配到的<script换成<scr_ipt

$str3=str_replace("on","o_n",$str2);
# 将匹配到的on换成o_n

因此,不能用<script>和鼠标事件,那么我们就用javascript伪协议: a href 标签法。构造payload:
"><a href=javascript:alert(1)>xss</a>,点击xss即可出现弹窗

level 6

image
image
还是看到level6的源代码
相较于level5,它对src,href,data都做了过滤,但是它没有将输入都转化为小写,因此可以用大写来绕过匹配
构造payload:"><sCript>alert()</sCript>

level 7

image

image
观察源代码,发现将关键字都替换成了空,那么就是典型的双写绕过,直接构造payload:
"><scrscriptipt>alert()</scrscriptipt>

level 8

image
image
观察源码,各种都过滤了,还加了实体化,感觉有点没招了。。。。。。。。。。
真没招了吗?

只能使用HTML实体编码(即Unicode编码)绕过了。
将javascript:alert(1) 进行html 10进制实体化编码:
image
这段加密后的编码即为payload

level 9

image
image
继续看源代码的过滤,在上一关的基础上还对输入进行了检查,要有“http://
那就先在开头加上http:// 好像这样子不能执行java代码了
image
那么如何去除呢,我们想到这个是php代码,是不是可以用双斜杠进行注释,http:// 放到最后面不就注释掉了嘛
构造paylaod:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://
注意:这里也要进行实体化编码

level 10

image
image
继续看源代码,这里get传入的参数除了keyword还可以传入t_sort,并且过滤了t_sort参数的尖括号
可以看到有hidden,把输入框给隐藏了,把type属性删掉或者修改hidden为text,则会出现输入框。按F12,选中上面的元素进行修改
image

修改之后就出现了输入框(其实好像没什么用),对这几个参数都传参看看
image
image
发现只有t_sort的值发生改变
直接传入:" onfocus=javascript:alert() ",再将hidden改为text,即可成功弹窗

level 11 (referer注入)

image
image
还是先看看源码
$str11=$_SERVER['HTTP_REFERER'];
先传参看看,?keyword=1&t_link=2&t_history=3&t_sort=4&t_ref=5
image
t_sort和t_ref两个参数改变,但是t_ref并没有传入我们输入的值,在后台代码中可知t_ref的值是str11即通过referer的注入传入的,那么用yakit抓包(bp也行)进行操作。
直接在referer头注入" onmouseover="alert(1)" type="text"
image
发包,成功弹窗!!!

level 12 (UA头注入)

image
image
可以看到t_ua的值是网页的ua头,然后看一下后台代码
image
$str11=$_SERVER['HTTP_USER_AGENT'];跟上一题一样,只是注入的位置不同了,这次我们直接在hackbar上进行注入操作
image


level 13 (cookie注入)

image
image
通过后台代码我们可知,要通过cookie传入user的值,yakit抓包,对cookie进行修改,依旧用之前的paylaod,然后发包。
image

level 14 (exif漏洞)

image
这一关是用exif xss漏洞进行注入,具体漏洞可以在乌云网搜关键词“exif xss”


该问题源自一些浏览器查看图片 Exif 信息的插件,如果图片里面含有 XSS 代码,这些插件在展现信息渲染的时候就会被执行,导致在本不存在漏洞的网页中“制造”出 XSS 漏洞
参考下面这篇文章:
【巨人肩膀上的矮子】XSS挑战之旅---游戏通关攻略(更新至18关)
但因为这一关的iframe调用的文件地址失效,无法进行测试,直接跳15关

level 15

image
image
这里给了一个提示,也就是“nginclude没有定义”,先了解一下什么是nginclude
https://www.runoob.com/angularjs/ng-ng-include.html
使用了ng-include这个表达式的意思是当HTML代码过于复杂时,可以将部分代码打包成独立文件,在使用ng-include来引用这个独立的HTML文件。


我们先试着包含第一关?src=level1.php,发现显示了第一关的页面
直接将level1的payload也包含进去
http://127.0.0.1/xss-labs/level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
成功出现弹窗,到level16

level 16

image

来看看源代码:
image
可以看到过滤了空格 / script
正常情况下过滤了空格就用/代替,但是这里对/也进行了过滤
我们用sql注入中的%0a进行绕过,构造payload:
http://127.0.0.1/xss-labs/level16.php?keyword=<img%0asrc=1%0aonerror=alert(1)>


17-20关需要用到带flash插件的浏览器里,这里就先到此结束了,谢谢师傅们能看到这,有不对的地方烦请指出。
祝好!!!!

posted @ 2026-01-27 08:40  Yhsec  阅读(36)  评论(0)    收藏  举报
//雪花飘落效果