level 1
观察返回的页面
发现向服务器提交了一个name参数,值为test
从页面回显来看,将name参数的值显示在了页面上,并且显示了name参数值的字符长度
查看页面源码,发现将name的参数值插入到了<h2></h2>标签之间
属于反射型xss
但是由于不知道服务器端对于提交的敏感字符有没有过滤,所以这里直接在name参数
中赋值一个简单的弹窗来进行测试。
将name参数重新赋值:<script>alert('xss')</script>
成功 用于js弹窗的代码顺利执行了
level 2
查看页面源码
从源码来看,它的功能就是通过点击“搜索”按钮,将输入框内的内容以get方式提交给
服务器上的level2.php
经过服务器的动态处理之后又会将参数keyword的值插入到<h2> </h2>
标签之中以及
添加到<input>
标签中的value属性的值内。
尝试使用上一关的恶意语句操作进行弹窗 <script>alert('xss')</script>
报错
查看源码
可以看到在<h2> </h2>
标签之中的恶意代码被编码了,其中<
和>
都被编码成了html字符实体。
猜测在服务器端用htmlspecialchars()函数
对keyword参数的值进行了处理。
往下看发现插入到value参数值中的恶意代码并没有被编码而是直接原样返回
但是问题是这里的js代码在标签属性值中,浏览器是无法执行的
既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了
要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了
将keyword的参数值重新赋值"><script>alert('xss')</script>//
左边的">闭合原先的" 右边的//注释原先的">
成功
看一下level2的源码
因为value处没有对敏感字符进行编码和过滤,所以可以通过构造实现XSS攻击。
level 3
输入test,查看页面源码
感觉与第二关相似
不确定有没有敏感字符过滤,编码等操作
构造弹窗测试一下 <script>alert('xss')</script>
失败,查看页面源码
两处都将<
和>
这样的敏感字符编码成了html字符实体
猜测服务器端在这两处都用htmlspecialchars()
函数进行了处理
确认猜测
构造代码:'οnmοuseοver='alert(/xss/)
源代码:<input name=keyword value='".htmlspecialchars($str)."'>
所以:<input name=keyword value=''οnmοuseοver='alert(/xss/)'>
成功
level 4
查看源码
将<和>转为空格,对第一个str输出也做过滤
同上题类似,仍然可以在input标签内value处闭合,但是value处要用"闭合
"οnmοuseοver="alert(/xss/)
<input name=keyword value=""οnmοuseοver="alert(/xss/)">
成功
level 5
查看源码
对标签(<script>)进行了过滤,对on进行了过滤
strtolower()将输入的量全转为了小写,因此无法实现大小写绕过
方法:构造a标签,再尝试利用a标签的href属性执行javascript:伪协议,"> (没有发现对javascript进行的过滤)
payload:"><a href=javascript:alert()>xxx</a> <"
源码:<input name=keyword value="'.$str3.'">
<input name=keyword value=""><a href=javascript:alert()>xxx</a> <"">
点击xxx,成功
level 6
查看源码
过滤了很多,但是没有过滤大小写
payload:"><ScRipt>alert(1)</ScRipt>
源码:<input name=keyword value="'.$str6.'">
<input name=keyword value=""><ScRipt>alert(1)</ScRipt>">
输入,搜索,成功
level 7
查看源码
过滤了大小写,把一些关键字替换为了空格
我们可以双写绕过
payload:"> <a hrehreff=javasscriptcript:alert()>x</a> <"
源码:<input name=keyword value="'.$str6.'">
<input name=keyword value=""> <a hrehreff=javasscriptcript:alert()>x</a> <"">
成功
level 8
Unicode 给所有的字符指定了一个数字用来表示该字符。
查看源码
将字符转为小写,过滤特殊字符和"
添加友情链接处是突破点,在输入字符提交后,友情链接处会载入一个拼接后的a标签,因为javascript被过滤,所以进行编码绕过再点击友情链接
我们利用href的隐藏属性自动Unicode解码
payload:javascript:alert(1)
成功
level 9
查看源码
在上一题的基础上加入了strpos()函数
strpos()函数用于在字符串内查找一个字符或一段指定的文本,如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置,如果未找到匹配,则返回FALSE
payload:javascript:alert(1)//http://
成功
level 10
查看源码,发现有隐藏表单
F12打开查看器
改为如下内容
成功
或者url后加如下内容,成功
查看器内容如下