xss靶场通关笔记
仅限学习参考,欢迎补充指正
目录
打靶场之前先整理下一些可执行绕过姿势
大小写绕过(转换大小写字符)
注意:1、js中严格区分大小写
2、在html标签中不区分大小写
实体编码转换绕过
双写绕过
伪协议绕过 (JavaScript 后面可以执行很多js代码,但每个语句要用;隔开)
事件绕过(onlick、onmouseout)
还可利用单双引号、制表符
1、 <script> alter() </script> //警告消息框 有一个确定键 (用的比较多)
<script> confirm() </script> //确认消息框 有一个确定键和一个取消键
<script> prompt() </script> //提示消息框 有一个text输入框
2、 <img onerror=javascript:alert(/xss/);>
3、 <a href="javascript:alert(/xss/)"></a> 伪协议
4、 可内嵌在标签属性里的 onclick 或 onmouseout eg: button标签、iframe标签等
5、 <iframe src="javascript:alert(/xx/)">
做之前需要找到交互点,要学会利用开发者工具以及源代码。
在后面比较难的关卡中,还需要用到BurpSuitePro,或者是在火狐安装HackBar插件。
第一关

页面没有任何可以点击或输入的地方,很明显唯一可输入的只有URL中了。尝试输入后,发现name值可修改,可考虑在此进行绕过。
在name后试着输入代码口令,成功过关
<script>alert(/xxs/)</script>
第二关

打开页面发现有两个输入点,试着在页面输入框中输入,发现可输出,考虑在此绕过
打开开发者工具(若查询不到错误,打开源代码分析)

有两种解决方法:
方法一:
想让它利用标签执行弹窗,首先需要把input标签闭合,继而可继续执行命令
"> <script>alert(/xxs/)</script>
方法二:
可利用鼠标移出事件(onmouseout)在input内部进行绕过
" onmouseout="alert(/xxx/)
方法三:
利用iframe,发现新开了一个页面并出现了弹窗,但并没有出现通关提示并跳转下一关,这是由于通关提示是写在当前页面的,在另一个页面实现弹窗绕过,也是通关的一个体现,手动跳关就可以了。
"> <iframe src="javascript:alert(/xx/)">
第三关
还是重复之前的操作,先找到输入点随便输入,查看是否可以输出。发现可输出,就可以在这继续执行绕过操作了。
" onmouseout="alert(/xxx/)
输入后并没有出现弹窗,打开开发者工具,会发现鼠标指向输入框后,输入框变蓝,是因为把值都赋给了values,这时打开源代码查找问题

发现双引号被实体编码了,并且变成了单引号。可以试试把双引号变为单引号是否可以。

' onmouseout='alert(/xxx/)

第四关
和第二关的原理一样,两种方法都可实现
" onmouseout="alert(/xxx/)
"> <script>alert(/xxs/)</script>
第五关
试验下之前的方法,发现过滤掉了on,试了大小写,发现一样被过滤掉

试试 "> <script>alert(/xxs/)</script> 发现输入框后面多出来了一串代码,于是想到了a标签的超链接行不行得通

"> <a href="javascript:alert('xss')">aaa</a>
出现了超链接,点击进去出现了弹框

"> <iframe src="javascript:alert(/xx/)">
发现出现了新开了页面并弹窗,但是并没有跳转到下一关,这是因为通关代码写在挑战的当前页面,但也是挑战成功(手动跳关吧#^.^#)
第六关
尝试伪协议,发现过滤了hr,改成大写
![]()
第一种方法: "> <a HRef="javascript:alert('xss')">aaa</a>

第二种方法:
" ONCLICK="alert('xxx')"
第三种方法:
"> <iframe sRc="javascript:alert(/xxx/)"
第七关
随便输入一个字符,发现仍然可以被输出。那就试试之前的几种方法看看可不可行
发现服务器会自动过滤掉src、script、on 等字符,可尝试下大小写绕过以及双写绕过,尝试过只有双写绕过可以成功过关。

双写绕过:不让服务器识别到src、script、on等字符,只要不让它们连续出现(不连续出现的情况下,只会过滤一遍)
第一种方法: "> <iframe srsrcc="javascripscriptt:alert(/xx/)
第二种方法: " oonnclick="alert('xxx')
第三种方法: "> <input oonnmouseout="alert(111)
第八关

在页面中看到有“友情链接”的超链接,随意输字符点击进去,会出现这样一个界面

输入常用的payload试试,看看问题在哪里。打开源码发现输入的东西,在a标签里输出了,并对一些字符进行了过滤

这时我们需要试试大小写、双写是否可以绕过,发现同样执行不了,并且是在a标签中输入,只可以使用内嵌绕过的方式。
![]()
这时我们就只能用实体编码了,在百度上搜索编码转换,输入需要转换的字符,然后复制就可以了。这时我们使用内嵌绕过的方式来实现
javascript:alert(/xxx/)
制表符绕过:%09 只能在URL中使用。
第九关

页面上出现了超链接,随便输入字符,点进去

查看源码,输入的字符串传递给了name和a标签里,还说我的链接不合法╭(╯^╰)╮ ,这提示我们所输入的字符串赋给了a标签。

既然它提示链接不合法,我们应该想到,标准的链接都会带有http://或https://,这时可以试一下把它放进去行不行。 发现还是错误,去到源码里找问题

发现把script过滤掉了,不让它们一起出现,试了大小写,双写都行不通,那就只能给字符编码了
这里想方便这些字符里编写一个就可以,我编了三个。但是发现还是行不通,链接点不开。
我们想让伪协议和http://共存,可以把http注释掉,之所以不会出错是因为http://是个必须出现的字符,但在这当中不是重要字符,只要它出现了,并且不让后台读取到就可以了。
javascript:alert() // http://
补充: 重新做一遍后,想着http://能不能放在前面,试下瞅瞅,看到返回报错。
我的理解是:
它放在开头,虽然是注释掉了,但返回到的是URL中,URL并不认识这串注释,只会从javascript开始执行后续命令。
再来,放到中间就不一样了,把/* http:// */ 放在javascript: 后面,即开始执行JavaScript语句,自然就可以正确执行这段注释,最后出现弹窗。回车绕过同样(去掉注释)。

javascript:/*http://*/ alert()
又学到了一种新的绕过方式: 回车绕过 编码为&0a
javascript:http://%0a alert()
第十关
在URL中输入后发现字符串由keyword字符输出,但在源代码中并没有看到有任何keyword的字符,这时我们可以返回到之前的关卡,发现也有keyword,并且代码中显示了name=keyword。
仔细观察一下源代码,发现与上一关不同的是多了一串表单,可以试着从这里找方向

看到每行的type值都为hidden,hidden是隐藏段落,在这段命令意思为隐藏文本框。
这下我们知道了其中的含义,就可以试试哪个input可以传参了,在URL中写,看到源码中t_sort传参了,说明此方法是可行的


input标签是自由标签,会出现一个文本框,会自动输出所输入的内容,由keyword传出。不想让hidden生效,可以添加一个type ,即选择让第一个type值生效(type中的值会冲突 )
输入后,看到页面上显现了文本框,第一个type的值生效,点击文本框就可以过关了。
方法一:
t_sort=" onclick="alert()" type="text"


方法二:
t_sort=" onclick="alert()" type="text"><!--
之所以注释没有补全还可以执行,因为这是在浏览器,浏览器自动把后面的语句补全了
这种方式不适用于后面还有很多代码,因为注释语句没有补全,会自动注释掉后面的代码语句
第十一关

进入十一关后,观察只有URL一个输入点,进入开发者工具,并没有查看到什么有用的信息,于是分析源码,发现出现了一个表单,并且t_sort后给我们带了值(带的值是什么意思呢,详解看下方提示 #^.^#),type值为hidden(把输入框隐藏掉了),说明这是一个突破口,可以在这里试试。
提示:这串value值其实是referer传递出来的,作用是记录你是从哪个页面跳转过来的。也就是说这是默认通过第十关跳过来才会出现的;如果你是直接访问的当前关卡,就不会出现了。

但是当你发现你修改了URL中的值,虽然在页面中显示了,但是并没有返回给t_sort


这时,我们就需要借助外部工具来绕过它,以我用的方法为例:
① 可以利用Burp Suite Professional软件来抓包,找到referer并修改值,看下图
![]()
先试试我们的老朋友 "> <script>alert(/xxs/)</script> 发现把尖括号过滤掉了,使用字符串编码也不好使,那就试试内嵌的方式能不能行得通(记得像上一关一样显示出文本框)

发现是可行的,文本框出来之后即可通关
第一种方法: " onclick="alert()" type="text
第二种方法: " onmouseout="alert(/xxx/)" type="text

② 还有一种方式是在火狐浏览器找到扩展和主题,下载hackbar v2 ,在开发者工具选择hackbar,点击referer,赋值就可以了,就不在这里演示了。
十二关

不难发现,其实跟十一关的原理一样,上一关是输出了referer的值,这一关则是输出了
user-agent的值(包含请求的用户的指纹信息)

还是一样修改user-agent的值,并显示出文本框,这里一样过滤掉了尖括号,方法与上关相同。
第一种方法: " onclick="alert()" type="text
第二种方法: " onmouseout="alert(/xxx/)" type="text
更多推荐


所有评论(0)